USE [master]਀䜀伀 
/****** Object:  Database [Elyse_DB]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 䐀䄀吀䄀䈀䄀匀䔀 嬀䔀氀礀猀攀开䐀䈀崀 
 CONTAINMENT = NONE਀ 伀一  倀刀䤀䴀䄀刀夀  
( NAME = N'Elyse_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.SQLEXPRESS\MSSQL\DATA\Elyse_DB.mdf' , SIZE = 48960KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), ਀ 䘀䤀䰀䔀䜀刀伀唀倀 嬀昀椀氀攀猀琀爀攀愀洀开昀椀氀攀最爀漀甀瀀崀 䌀伀一吀䄀䤀一匀 䘀䤀䰀䔀匀吀刀䔀䄀䴀  䐀䔀䘀䄀唀䰀吀 
( NAME = N'Elyse_DB_filestream', FILENAME = N'E:\Elyse_DB_FILESTREAM\Elyse_DB_filestream' , MAXSIZE = UNLIMITED)਀ 䰀伀䜀 伀一  
( NAME = N'Elyse_DB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.SQLEXPRESS\MSSQL\DATA\Elyse_DB_log.ldf' , SIZE = 3976KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )਀ 圀䤀吀䠀 䌀䄀吀䄀䰀伀䜀开䌀伀䰀䰀䄀吀䤀伀一 㴀 䐀䄀吀䄀䈀䄀匀䔀开䐀䔀䘀䄀唀䰀吀Ⰰ 䰀䔀䐀䜀䔀刀 㴀 伀䘀䘀 
GO਀䄀䰀吀䔀刀 䐀䄀吀䄀䈀䄀匀䔀 嬀䔀氀礀猀攀开䐀䈀崀 匀䔀吀 䌀伀䴀倀䄀吀䤀䈀䤀䰀䤀吀夀开䰀䔀嘀䔀䰀 㴀 ㄀㘀　 
GO਀䤀䘀 ⠀㄀ 㴀 䘀唀䰀䰀吀䔀堀吀匀䔀刀嘀䤀䌀䔀倀刀伀倀䔀刀吀夀⠀✀䤀猀䘀甀氀氀吀攀砀琀䤀渀猀琀愀氀氀攀搀✀⤀⤀ 
begin਀䔀堀䔀䌀 嬀䔀氀礀猀攀开䐀䈀崀⸀嬀搀戀漀崀⸀嬀猀瀀开昀甀氀氀琀攀砀琀开搀愀琀愀戀愀猀攀崀 䀀愀挀琀椀漀渀 㴀 ✀攀渀愀戀氀攀✀ 
end਀䜀伀 
ALTER DATABASE [Elyse_DB] SET ANSI_NULL_DEFAULT OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET ANSI_NULLS OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET ANSI_PADDING OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET ANSI_WARNINGS OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET ARITHABORT OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET AUTO_CLOSE OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET AUTO_SHRINK OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET AUTO_UPDATE_STATISTICS ON ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET CURSOR_CLOSE_ON_COMMIT OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET CURSOR_DEFAULT  GLOBAL ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET CONCAT_NULL_YIELDS_NULL OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET NUMERIC_ROUNDABORT OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET QUOTED_IDENTIFIER OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET RECURSIVE_TRIGGERS OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET  DISABLE_BROKER ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET DATE_CORRELATION_OPTIMIZATION OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET TRUSTWORTHY OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET ALLOW_SNAPSHOT_ISOLATION OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET PARAMETERIZATION SIMPLE ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET READ_COMMITTED_SNAPSHOT OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET HONOR_BROKER_PRIORITY OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET RECOVERY SIMPLE ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET  MULTI_USER ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET PAGE_VERIFY CHECKSUM  ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET DB_CHAINING OFF ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET TARGET_RECOVERY_TIME = 60 SECONDS ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET DELAYED_DURABILITY = DISABLED ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET ACCELERATED_DATABASE_RECOVERY = OFF  ਀䜀伀 
ALTER DATABASE [Elyse_DB] SET QUERY_STORE = ON਀䜀伀 
ALTER DATABASE [Elyse_DB] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_STORAGE_SIZE_MB = 1000, QUERY_CAPTURE_MODE = AUTO, SIZE_BASED_CLEANUP_MODE = AUTO, MAX_PLANS_PER_QUERY = 200, WAIT_STATS_CAPTURE_MODE = ON)਀䜀伀 
USE [Elyse_DB]਀䜀伀 
/****** Object:  ApplicationRole [reviewer]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀⼀⨀ 吀漀 愀瘀漀椀搀 搀椀猀挀氀漀猀甀爀攀 漀昀 瀀愀猀猀眀漀爀搀猀Ⰰ 琀栀攀 瀀愀猀猀眀漀爀搀 椀猀 最攀渀攀爀愀琀攀搀 椀渀 猀挀爀椀瀀琀⸀ ⨀⼀ 
declare @idx as int਀搀攀挀氀愀爀攀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 愀猀 渀瘀愀爀挀栀愀爀⠀㘀㐀⤀ 
declare @rnd as float਀猀攀氀攀挀琀 䀀椀搀砀 㴀 　 
select @placeholderPwd = N''਀猀攀氀攀挀琀 䀀爀渀搀 㴀 爀愀渀搀⠀⠀䀀䀀䌀倀唀开䈀唀匀夀 ─ ㄀　　⤀ ⬀ ⠀⠀䀀䀀䤀䐀䰀䔀 ─ ㄀　　⤀ ⨀ ㄀　　⤀ ⬀  
       (DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms, GETDATE()) as int) % 100) * 1000000))਀眀栀椀氀攀 䀀椀搀砀 㰀 㘀㐀 
begin਀   猀攀氀攀挀琀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 㴀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 ⬀ 挀栀愀爀⠀⠀挀愀猀琀⠀⠀䀀爀渀搀 ⨀ 㠀㌀⤀ 愀猀 椀渀琀⤀ ⬀ 㐀㌀⤀⤀ 
   select @idx = @idx + 1਀猀攀氀攀挀琀 䀀爀渀搀 㴀 爀愀渀搀⠀⤀ 
end਀搀攀挀氀愀爀攀 䀀猀琀愀琀攀洀攀渀琀 渀瘀愀爀挀栀愀爀⠀㐀　　　⤀ 
select @statement = N'CREATE APPLICATION ROLE [reviewer] WITH DEFAULT_SCHEMA = [reviewing], ' + N'PASSWORD = N' + QUOTENAME(@placeholderPwd,'''')਀䔀堀䔀䌀 搀戀漀⸀猀瀀开攀砀攀挀甀琀攀猀焀氀 䀀猀琀愀琀攀洀攀渀琀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䄀瀀瀀氀椀挀愀琀椀漀渀刀漀氀攀 嬀爀攀愀搀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
/* To avoid disclosure of passwords, the password is generated in script. */਀搀攀挀氀愀爀攀 䀀椀搀砀 愀猀 椀渀琀 
declare @placeholderPwd as nvarchar(64)਀搀攀挀氀愀爀攀 䀀爀渀搀 愀猀 昀氀漀愀琀 
select @idx = 0਀猀攀氀攀挀琀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 㴀 一✀✀ 
select @rnd = rand((@@CPU_BUSY % 100) + ((@@IDLE % 100) * 100) + ਀       ⠀䐀䄀吀䔀倀䄀刀吀⠀猀猀Ⰰ 䜀䔀吀䐀䄀吀䔀⠀⤀⤀ ⨀ ㄀　　　　⤀ ⬀ ⠀⠀挀愀猀琀⠀䐀䄀吀䔀倀䄀刀吀⠀洀猀Ⰰ 䜀䔀吀䐀䄀吀䔀⠀⤀⤀ 愀猀 椀渀琀⤀ ─ ㄀　　⤀ ⨀ ㄀　　　　　　⤀⤀ 
while @idx < 64਀戀攀最椀渀 
   select @placeholderPwd = @placeholderPwd + char((cast((@rnd * 83) as int) + 43))਀   猀攀氀攀挀琀 䀀椀搀砀 㴀 䀀椀搀砀 ⬀ ㄀ 
select @rnd = rand()਀攀渀搀 
declare @statement nvarchar(4000)਀猀攀氀攀挀琀 䀀猀琀愀琀攀洀攀渀琀 㴀 一✀䌀刀䔀䄀吀䔀 䄀倀倀䰀䤀䌀䄀吀䤀伀一 刀伀䰀䔀 嬀爀攀愀搀攀爀崀 圀䤀吀䠀 䐀䔀䘀䄀唀䰀吀开匀䌀䠀䔀䴀䄀 㴀 嬀爀攀愀搀椀渀最崀Ⰰ ✀ ⬀ 一✀倀䄀匀匀圀伀刀䐀 㴀 一✀ ⬀ 儀唀伀吀䔀一䄀䴀䔀⠀䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀Ⰰ✀✀✀✀⤀ 
EXEC dbo.sp_executesql @statement਀䜀伀 
/****** Object:  ApplicationRole [ownership_chain]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀⼀⨀ 吀漀 愀瘀漀椀搀 搀椀猀挀氀漀猀甀爀攀 漀昀 瀀愀猀猀眀漀爀搀猀Ⰰ 琀栀攀 瀀愀猀猀眀漀爀搀 椀猀 最攀渀攀爀愀琀攀搀 椀渀 猀挀爀椀瀀琀⸀ ⨀⼀ 
declare @idx as int਀搀攀挀氀愀爀攀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 愀猀 渀瘀愀爀挀栀愀爀⠀㘀㐀⤀ 
declare @rnd as float਀猀攀氀攀挀琀 䀀椀搀砀 㴀 　 
select @placeholderPwd = N''਀猀攀氀攀挀琀 䀀爀渀搀 㴀 爀愀渀搀⠀⠀䀀䀀䌀倀唀开䈀唀匀夀 ─ ㄀　　⤀ ⬀ ⠀⠀䀀䀀䤀䐀䰀䔀 ─ ㄀　　⤀ ⨀ ㄀　　⤀ ⬀  
       (DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms, GETDATE()) as int) % 100) * 1000000))਀眀栀椀氀攀 䀀椀搀砀 㰀 㘀㐀 
begin਀   猀攀氀攀挀琀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 㴀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 ⬀ 挀栀愀爀⠀⠀挀愀猀琀⠀⠀䀀爀渀搀 ⨀ 㠀㌀⤀ 愀猀 椀渀琀⤀ ⬀ 㐀㌀⤀⤀ 
   select @idx = @idx + 1਀猀攀氀攀挀琀 䀀爀渀搀 㴀 爀愀渀搀⠀⤀ 
end਀搀攀挀氀愀爀攀 䀀猀琀愀琀攀洀攀渀琀 渀瘀愀爀挀栀愀爀⠀㐀　　　⤀ 
select @statement = N'CREATE APPLICATION ROLE [ownership_chain] WITH DEFAULT_SCHEMA = [configuring], ' + N'PASSWORD = N' + QUOTENAME(@placeholderPwd,'''')਀䔀堀䔀䌀 搀戀漀⸀猀瀀开攀砀攀挀甀琀攀猀焀氀 䀀猀琀愀琀攀洀攀渀琀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䄀瀀瀀氀椀挀愀琀椀漀渀刀漀氀攀 嬀攀搀椀琀漀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
/* To avoid disclosure of passwords, the password is generated in script. */਀搀攀挀氀愀爀攀 䀀椀搀砀 愀猀 椀渀琀 
declare @placeholderPwd as nvarchar(64)਀搀攀挀氀愀爀攀 䀀爀渀搀 愀猀 昀氀漀愀琀 
select @idx = 0਀猀攀氀攀挀琀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 㴀 一✀✀ 
select @rnd = rand((@@CPU_BUSY % 100) + ((@@IDLE % 100) * 100) + ਀       ⠀䐀䄀吀䔀倀䄀刀吀⠀猀猀Ⰰ 䜀䔀吀䐀䄀吀䔀⠀⤀⤀ ⨀ ㄀　　　　⤀ ⬀ ⠀⠀挀愀猀琀⠀䐀䄀吀䔀倀䄀刀吀⠀洀猀Ⰰ 䜀䔀吀䐀䄀吀䔀⠀⤀⤀ 愀猀 椀渀琀⤀ ─ ㄀　　⤀ ⨀ ㄀　　　　　　⤀⤀ 
while @idx < 64਀戀攀最椀渀 
   select @placeholderPwd = @placeholderPwd + char((cast((@rnd * 83) as int) + 43))਀   猀攀氀攀挀琀 䀀椀搀砀 㴀 䀀椀搀砀 ⬀ ㄀ 
select @rnd = rand()਀攀渀搀 
declare @statement nvarchar(4000)਀猀攀氀攀挀琀 䀀猀琀愀琀攀洀攀渀琀 㴀 一✀䌀刀䔀䄀吀䔀 䄀倀倀䰀䤀䌀䄀吀䤀伀一 刀伀䰀䔀 嬀攀搀椀琀漀爀崀 圀䤀吀䠀 䐀䔀䘀䄀唀䰀吀开匀䌀䠀䔀䴀䄀 㴀 嬀攀搀椀琀椀渀最崀Ⰰ ✀ ⬀ 一✀倀䄀匀匀圀伀刀䐀 㴀 一✀ ⬀ 儀唀伀吀䔀一䄀䴀䔀⠀䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀Ⰰ✀✀✀✀⤀ 
EXEC dbo.sp_executesql @statement਀䜀伀 
/****** Object:  ApplicationRole [controller]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀⼀⨀ 吀漀 愀瘀漀椀搀 搀椀猀挀氀漀猀甀爀攀 漀昀 瀀愀猀猀眀漀爀搀猀Ⰰ 琀栀攀 瀀愀猀猀眀漀爀搀 椀猀 最攀渀攀爀愀琀攀搀 椀渀 猀挀爀椀瀀琀⸀ ⨀⼀ 
declare @idx as int਀搀攀挀氀愀爀攀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 愀猀 渀瘀愀爀挀栀愀爀⠀㘀㐀⤀ 
declare @rnd as float਀猀攀氀攀挀琀 䀀椀搀砀 㴀 　 
select @placeholderPwd = N''਀猀攀氀攀挀琀 䀀爀渀搀 㴀 爀愀渀搀⠀⠀䀀䀀䌀倀唀开䈀唀匀夀 ─ ㄀　　⤀ ⬀ ⠀⠀䀀䀀䤀䐀䰀䔀 ─ ㄀　　⤀ ⨀ ㄀　　⤀ ⬀  
       (DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms, GETDATE()) as int) % 100) * 1000000))਀眀栀椀氀攀 䀀椀搀砀 㰀 㘀㐀 
begin਀   猀攀氀攀挀琀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 㴀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 ⬀ 挀栀愀爀⠀⠀挀愀猀琀⠀⠀䀀爀渀搀 ⨀ 㠀㌀⤀ 愀猀 椀渀琀⤀ ⬀ 㐀㌀⤀⤀ 
   select @idx = @idx + 1਀猀攀氀攀挀琀 䀀爀渀搀 㴀 爀愀渀搀⠀⤀ 
end਀搀攀挀氀愀爀攀 䀀猀琀愀琀攀洀攀渀琀 渀瘀愀爀挀栀愀爀⠀㐀　　　⤀ 
select @statement = N'CREATE APPLICATION ROLE [controller] WITH DEFAULT_SCHEMA = [controlling], ' + N'PASSWORD = N' + QUOTENAME(@placeholderPwd,'''')਀䔀堀䔀䌀 搀戀漀⸀猀瀀开攀砀攀挀甀琀攀猀焀氀 䀀猀琀愀琀攀洀攀渀琀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䄀瀀瀀氀椀挀愀琀椀漀渀刀漀氀攀 嬀挀漀渀昀椀最甀爀愀琀漀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
/* To avoid disclosure of passwords, the password is generated in script. */਀搀攀挀氀愀爀攀 䀀椀搀砀 愀猀 椀渀琀 
declare @placeholderPwd as nvarchar(64)਀搀攀挀氀愀爀攀 䀀爀渀搀 愀猀 昀氀漀愀琀 
select @idx = 0਀猀攀氀攀挀琀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 㴀 一✀✀ 
select @rnd = rand((@@CPU_BUSY % 100) + ((@@IDLE % 100) * 100) + ਀       ⠀䐀䄀吀䔀倀䄀刀吀⠀猀猀Ⰰ 䜀䔀吀䐀䄀吀䔀⠀⤀⤀ ⨀ ㄀　　　　⤀ ⬀ ⠀⠀挀愀猀琀⠀䐀䄀吀䔀倀䄀刀吀⠀洀猀Ⰰ 䜀䔀吀䐀䄀吀䔀⠀⤀⤀ 愀猀 椀渀琀⤀ ─ ㄀　　⤀ ⨀ ㄀　　　　　　⤀⤀ 
while @idx < 64਀戀攀最椀渀 
   select @placeholderPwd = @placeholderPwd + char((cast((@rnd * 83) as int) + 43))਀   猀攀氀攀挀琀 䀀椀搀砀 㴀 䀀椀搀砀 ⬀ ㄀ 
select @rnd = rand()਀攀渀搀 
declare @statement nvarchar(4000)਀猀攀氀攀挀琀 䀀猀琀愀琀攀洀攀渀琀 㴀 一✀䌀刀䔀䄀吀䔀 䄀倀倀䰀䤀䌀䄀吀䤀伀一 刀伀䰀䔀 嬀挀漀渀昀椀最甀爀愀琀漀爀崀 圀䤀吀䠀 䐀䔀䘀䄀唀䰀吀开匀䌀䠀䔀䴀䄀 㴀 嬀挀漀渀昀椀最甀爀椀渀最崀Ⰰ ✀ ⬀ 一✀倀䄀匀匀圀伀刀䐀 㴀 一✀ ⬀ 儀唀伀吀䔀一䄀䴀䔀⠀䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀Ⰰ✀✀✀✀⤀ 
EXEC dbo.sp_executesql @statement਀䜀伀 
/****** Object:  ApplicationRole [authoriser]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀⼀⨀ 吀漀 愀瘀漀椀搀 搀椀猀挀氀漀猀甀爀攀 漀昀 瀀愀猀猀眀漀爀搀猀Ⰰ 琀栀攀 瀀愀猀猀眀漀爀搀 椀猀 最攀渀攀爀愀琀攀搀 椀渀 猀挀爀椀瀀琀⸀ ⨀⼀ 
declare @idx as int਀搀攀挀氀愀爀攀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 愀猀 渀瘀愀爀挀栀愀爀⠀㘀㐀⤀ 
declare @rnd as float਀猀攀氀攀挀琀 䀀椀搀砀 㴀 　 
select @placeholderPwd = N''਀猀攀氀攀挀琀 䀀爀渀搀 㴀 爀愀渀搀⠀⠀䀀䀀䌀倀唀开䈀唀匀夀 ─ ㄀　　⤀ ⬀ ⠀⠀䀀䀀䤀䐀䰀䔀 ─ ㄀　　⤀ ⨀ ㄀　　⤀ ⬀  
       (DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms, GETDATE()) as int) % 100) * 1000000))਀眀栀椀氀攀 䀀椀搀砀 㰀 㘀㐀 
begin਀   猀攀氀攀挀琀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 㴀 䀀瀀氀愀挀攀栀漀氀搀攀爀倀眀搀 ⬀ 挀栀愀爀⠀⠀挀愀猀琀⠀⠀䀀爀渀搀 ⨀ 㠀㌀⤀ 愀猀 椀渀琀⤀ ⬀ 㐀㌀⤀⤀ 
   select @idx = @idx + 1਀猀攀氀攀挀琀 䀀爀渀搀 㴀 爀愀渀搀⠀⤀ 
end਀搀攀挀氀愀爀攀 䀀猀琀愀琀攀洀攀渀琀 渀瘀愀爀挀栀愀爀⠀㐀　　　⤀ 
select @statement = N'CREATE APPLICATION ROLE [authoriser] WITH DEFAULT_SCHEMA = [authorising], ' + N'PASSWORD = N' + QUOTENAME(@placeholderPwd,'''')਀䔀堀䔀䌀 搀戀漀⸀猀瀀开攀砀攀挀甀琀攀猀焀氀 䀀猀琀愀琀攀洀攀渀琀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀 嬀一吀 䄀唀吀䠀伀刀䤀吀夀尀匀夀匀吀䔀䴀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE USER [NT AUTHORITY\SYSTEM] FOR LOGIN [NT AUTHORITY\SYSTEM] WITH DEFAULT_SCHEMA=[dbo]਀䜀伀 
/****** Object:  Schema [authorising]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀愀甀琀栀漀爀椀猀椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀戀愀猀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [base]਀䜀伀 
/****** Object:  Schema [com_obj]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀挀漀洀开漀戀樀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀挀漀渀昀椀最甀爀椀渀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [configuring]਀䜀伀 
/****** Object:  Schema [controlling]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀挀漀渀琀爀漀氀氀椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀搀漀挀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [doc_attr]਀䜀伀 
/****** Object:  Schema [editing]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀攀搀椀琀椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀昀椀氀攀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [file_attr]਀䜀伀 
/****** Object:  Schema [forms]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀昀漀爀洀猀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀椀渀琀攀爀渀愀氀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [internal]਀䜀伀 
/****** Object:  Schema [messaging]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀洀攀猀猀愀最椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀瀀攀漀瀀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [people]਀䜀伀 
/****** Object:  Schema [reading]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀爀攀愀搀椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀爀攀瘀椀攀眀椀渀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [reviewing]਀䜀伀 
/****** Object:  Schema [tagging]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀琀愀最最椀渀最崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀甀猀攀爀开爀攀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [user_restr]਀䜀伀 
/****** Object:  Schema [workflow_instances]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀挀栀攀洀愀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE SCHEMA [workflow_models]਀䜀伀 
/****** Object:  Schema [xref]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀䌀刀䔀䄀吀䔀 匀䌀䠀䔀䴀䄀 嬀砀爀攀昀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䘀甀氀氀吀攀砀琀䌀愀琀愀氀漀最 嬀昀甀氀氀开琀攀砀琀开挀愀琀愀氀漀最开㄀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE FULLTEXT CATALOG [full_text_catalog_1] WITH ACCENT_SENSITIVITY = OFF਀䄀匀 䐀䔀䘀䄀唀䰀吀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开䌀䠀䬀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀椀戀甀琀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ吀栀椀猀 昀甀渀挀琀椀漀渀 椀猀 甀猀攀搀 琀漀 瀀攀爀昀漀爀洀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 
-- for the doc_radio_button_links.default_rb_attr_id column to ensure that it ਀ⴀⴀ 洀愀琀挀栀攀猀 愀 氀椀猀琀开椀搀 愀渀搀 愀琀琀爀椀戀甀琀攀开椀搀 瀀愀椀爀 椀渀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 挀漀渀琀愀椀渀攀搀 挀漀搀攀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀椀猀 昀甀渀挀琀椀漀渀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开䌀䠀䬀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀椀戀甀琀攀崀  
(਀    䀀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䤀一吀Ⰰ 
    @default_doc_rb_attr_id INT਀⤀ 
RETURNS BIT਀䄀匀 
BEGIN਀    䐀䔀䌀䰀䄀刀䔀 䀀爀攀猀甀氀琀 䈀䤀吀㬀 
਀    䤀䘀 䀀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀 䤀匀 一唀䰀䰀਀      䈀䔀䜀䤀一਀         匀䔀吀 䀀爀攀猀甀氀琀 㴀 ㄀㬀਀      䔀一䐀਀    䔀䰀匀䔀 䤀䘀 䔀堀䤀匀吀匀 ⠀ 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 
        WHERE doc_radiob_list_id = @doc_radiob_list_id਀          䄀一䐀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀 ⤀ 
      BEGIN਀         匀䔀吀 䀀爀攀猀甀氀琀 㴀 ㄀㬀 
      END਀    䔀䰀匀䔀 
      BEGIN਀         匀䔀吀 䀀爀攀猀甀氀琀 㴀 　㬀 
      END਀ 
    RETURN @result;਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开䌀䠀䬀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀椀戀甀琀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ吀栀椀猀 昀甀渀挀琀椀漀渀 椀猀 甀猀攀搀 琀漀 瀀攀爀昀漀爀洀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 
-- for the doc_radio_button_links.default_rb_attr_id column to ensure that it ਀ⴀⴀ 洀愀琀挀栀攀猀 愀 氀椀猀琀开椀搀 愀渀搀 愀琀琀爀椀戀甀琀攀开椀搀 瀀愀椀爀 椀渀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 挀漀渀琀愀椀渀攀搀 挀漀搀攀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀椀猀 昀甀渀挀琀椀漀渀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开䌀䠀䬀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀椀戀甀琀攀崀  
(਀    䀀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䤀一吀Ⰰ 
    @default_file_rb_attr_id INT਀⤀ 
RETURNS BIT਀䄀匀 
BEGIN਀    䐀䔀䌀䰀䄀刀䔀 䀀爀攀猀甀氀琀 䈀䤀吀㬀 
਀    䤀䘀 䀀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀 䤀匀 一唀䰀䰀਀      䈀䔀䜀䤀一਀         匀䔀吀 䀀爀攀猀甀氀琀 㴀 ㄀㬀਀      䔀一䐀਀    䔀䰀匀䔀 䤀䘀 䔀堀䤀匀吀匀 ⠀ 
        SELECT 1਀        䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 
        WHERE file_radiob_list_id = @file_radiob_list_id਀          䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀⤀ 
      BEGIN਀        匀䔀吀 䀀爀攀猀甀氀琀 㴀 ㄀㬀 
      END਀    䔀䰀匀䔀 
      BEGIN਀        匀䔀吀 䀀爀攀猀甀氀琀 㴀 　㬀 
      END਀ 
    RETURN @result;਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开䌀䠀䬀开昀椀氀琀攀爀开昀椀氀攀开椀搀开匀嘀䘀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀  
-- Create date: 17-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 愀 昀椀氀攀 䤀䐀 愀最愀椀渀猀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 搀攀琀攀爀洀椀渀攀 眀栀攀琀栀攀爀 椀琀 椀猀 椀渀 漀爀 漀甀琀 漀昀 琀栀攀 昀椀氀琀攀爀 爀攀猀甀氀琀猀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 挀漀渀琀愀椀渀攀搀 挀漀搀攀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀椀猀 昀甀渀挀琀椀漀渀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开䌀䠀䬀开昀椀氀琀攀爀开昀椀氀攀开椀搀开匀嘀䘀崀 
(਀    䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
    @filtergroupid bigint਀⤀ 
RETURNS nvarchar(10)਀ 
AS਀䈀䔀䜀䤀一 
਀ऀ䐀䔀䌀䰀䄀刀䔀 䀀爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㬀 
਀    䤀䘀 䔀堀䤀匀吀匀 ⠀  ⴀⴀ 䌀栀攀挀欀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 氀椀渀欀猀  
        SELECT fgl.file_radiob_attr_id਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
     LEFT JOIN file_attr.file_radio_button_links AS drbl਀            伀一    昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
			   = drbl.file_radiob_attr_id ਀ऀऀ   䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀  
		       = @fileid਀         圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
		       = @filtergroupid ਀ऀऀ   䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 䤀匀 一唀䰀䰀 
    )਀    䈀䔀䜀䤀一 
        SET @result = 'Fail'਀    䔀一䐀 
	ELSE ਀ऀ匀䔀吀 䀀爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
਀ऀ䤀䘀 䀀爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
		BEGIN਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 氀椀渀欀猀 
				SELECT dmsafgl.file_ms_attr_id਀ऀऀऀ  ऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			 LEFT JOIN file_attr.file_multi_select_links AS dmsl਀ऀऀऀऀऀ伀一  搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀  
						=  dmsl.file_ms_attr_id ਀ऀऀऀऀ   䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀  
					   =   @fileid਀ऀऀऀऀ 圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
						=      @filtergroupid ਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 䤀匀 一唀䰀䰀 
			)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @result = 'Fail'਀ऀऀऀ䔀一䐀 
		END -- End multi-select list check. ਀ऀ刀䔀吀唀刀一 䀀爀攀猀甀氀琀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开䌀䠀䬀开猀愀渀椀琀椀猀攀开昀椀氀攀开琀攀砀琀开匀嘀䘀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ吀栀椀猀 昀甀渀挀琀椀漀渀 椀猀 甀猀攀搀 琀漀 猀愀渀椀琀椀猀攀 琀栀攀 昀甀氀氀 琀攀砀琀 挀漀渀琀攀渀琀 猀琀爀椀渀最 漀昀 愀 昀椀氀攀⸀ 
-- OPTIMIZED: Minimal security sanitization for zero-trust architecture with fast operations only਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and contained code, including this function are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE FUNCTION [internal].[ufn_CHK_sanitise_file_text_SVF] ਀⠀ 
	@f_full_text_content NVARCHAR(MAX)਀⤀ 
RETURNS NVARCHAR(MAX)਀䄀匀 
BEGIN਀    䐀䔀䌀䰀䄀刀䔀 䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀 一嘀䄀刀䌀䠀䄀刀⠀䴀䄀堀⤀㬀 
਀    ⴀⴀ 一甀氀氀 瀀爀漀琀攀挀琀椀漀渀  
    IF @f_full_text_content IS NULL਀    䈀䔀䜀䤀一 
        RETURN NULL;਀    䔀一䐀 
਀    匀䔀吀 䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀 㴀 䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀㬀 
਀    ⴀⴀ 刀攀洀漀瘀攀 洀漀猀琀 搀愀渀最攀爀漀甀猀 挀漀渀琀爀漀氀 挀栀愀爀愀挀琀攀爀猀  
    SET @f_full_text_content_clean = REPLACE(@f_full_text_content_clean, CHAR(0), N'');   -- NUL - can break systems਀    匀䔀吀 䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀Ⰰ 䌀䠀䄀刀⠀㄀⤀Ⰰ 一✀✀⤀㬀   ⴀⴀ 匀伀䠀 ⴀ 猀琀愀爀琀 漀昀 栀攀愀搀椀渀最 
    SET @f_full_text_content_clean = REPLACE(@f_full_text_content_clean, CHAR(2), N'');   -- STX - start of text਀    匀䔀吀 䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀Ⰰ 䌀䠀䄀刀⠀㌀⤀Ⰰ 一✀✀⤀㬀   ⴀⴀ 䔀吀堀 ⴀ 攀渀搀 漀昀 琀攀砀琀 
    SET @f_full_text_content_clean = REPLACE(@f_full_text_content_clean, CHAR(8), N'');   -- BS - backspace਀    匀䔀吀 䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀Ⰰ 䌀䠀䄀刀⠀㄀㄀⤀Ⰰ 一✀✀⤀㬀  ⴀⴀ 嘀吀 ⴀ 瘀攀爀琀椀挀愀氀 琀愀戀 
    SET @f_full_text_content_clean = REPLACE(@f_full_text_content_clean, CHAR(12), N'');  -- FF - form feed਀    匀䔀吀 䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀Ⰰ 䌀䠀䄀刀⠀㈀㜀⤀Ⰰ 一✀✀⤀㬀  ⴀⴀ 䔀匀䌀 ⴀ 攀猀挀愀瀀攀 
    SET @f_full_text_content_clean = REPLACE(@f_full_text_content_clean, CHAR(127), N''); -- DEL - delete਀    ⴀⴀ 䬀攀攀瀀 吀䄀䈀⠀㤀⤀Ⰰ 䰀䘀⠀㄀　⤀Ⰰ 䌀刀⠀㄀㌀⤀ 昀漀爀 戀愀猀椀挀 昀漀爀洀愀琀琀椀渀最 
਀    ⴀⴀ 䰀攀渀最琀栀 瀀爀漀琀攀挀琀椀漀渀  
    IF LEN(@f_full_text_content_clean) > 1000000਀    䈀䔀䜀䤀一 
        SET @f_full_text_content_clean = LEFT(@f_full_text_content_clean, 1000000);਀    䔀一䐀 
਀    刀䔀吀唀刀一 䀀昀开昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀开挀氀攀愀渀㬀 
END਀ 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀琀爀椀攀瘀攀猀 琀栀攀 昀椀氀攀 椀搀猀 漀昀 愀 搀漀挀甀洀攀渀琀 昀漀爀 愀 最椀瘀攀渀 昀椀氀琀攀爀 最爀漀甀瀀⸀  
਀⼀⨀ 
The logic works as follows.਀䘀椀氀攀猀 愀爀攀 氀椀猀琀攀搀 眀栀椀挀栀㨀 
  - the user has viewing rights to,਀  ⴀ 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 瘀椀愀 琀栀攀 琀愀戀氀攀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀Ⰰ 
  - are linked to all the attributes which have the given filter group assigned.਀䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 琀栀攀 爀攀焀甀椀爀攀搀 愀琀琀爀椀戀甀琀攀猀 洀椀最栀琀 戀攀 䰀愀琀攀猀琀 刀攀氀攀愀猀攀Ⰰ 昀爀漀洀 琀栀攀 匀琀愀琀甀猀 氀椀猀琀Ⰰ 愀渀搀 䐀椀猀琀爀椀戀甀琀椀漀渀 䘀漀爀洀愀琀Ⰰ 昀爀漀洀 琀栀攀 䘀漀爀洀愀琀 氀椀猀琀⸀  
This would be as opposed to Superseded or Source File Format.  ਀伀渀氀礀 昀椀氀攀猀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 愀渀搀 眀栀椀挀栀 栀愀瘀攀 戀漀琀栀 漀昀 琀栀攀猀攀 愀琀琀爀椀戀甀琀攀猀 眀椀氀氀 戀攀 爀攀琀爀椀攀瘀攀搀⸀   
For multi-select lists, all the attributes with the filter group linked must be ਀氀椀渀欀攀搀 琀漀 琀栀攀 昀椀氀攀 昀漀爀 琀栀攀 昀椀氀攀 琀漀 戀攀 椀渀挀氀甀搀攀搀⸀ 吀栀攀 昀甀渀挀琀椀漀渀 愀瀀瀀氀椀攀猀 琀漀 戀漀琀栀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀猀  
and multi-select lists.  ਀⨀⼀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and contained code, including this function are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE FUNCTION [internal].[ufn_SEL_file_by_doc_fgroup_TVF] ਀⠀ 
    @documentid nvarchar(50),਀    䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀 
)਀刀䔀吀唀刀一匀 䀀䘀椀氀攀䤀䐀 吀䄀䈀䰀䔀  
(਀    昀椀氀攀开椀搀 戀椀最椀渀琀 
)਀䄀匀 
BEGIN਀ 
    DECLARE਀        䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀ 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
        @username nvarchar(150) = ORIGINAL_LOGIN(); -- The username     ਀ 
    -- Create a CTE containing files linked to the given document ID਀    ⴀⴀ 愀渀搀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 瘀椀攀眀⸀ 
    WITH DocFiles AS ਀    ⠀  
        SELECT DISTINCT ਀            昀洀⸀昀椀氀攀开椀搀 䄀匀 昀椀 
        FROM base.file_metadata AS fm਀        䘀唀䰀䰀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 昀琀搀氀 
            ON fm.file_id = ftdl.file_id਀        䘀唀䰀䰀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
            ON ftdl.doc_id = dgl.doc_id਀        䘀唀䰀䰀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
            ON dgl.doc_group_id = dgn.doc_group_id਀        䘀唀䰀䰀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
            ON dgn.doc_group_id = dgvp.doc_group_id਀        䘀唀䰀䰀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
            ON dgvp.sid_id = sl.sid_id਀        圀䠀䔀刀䔀  
            ftdl.doc_id = @documentid਀            䄀一䐀 昀洀⸀昀椀氀攀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
            AND (਀                ⠀昀琀搀氀⸀昀椀氀攀开椀搀 䤀匀 一唀䰀䰀 伀刀 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一唀䰀䰀⤀ 
                OR (dgl.doc_group_id IS NOT NULL AND dgvp.sid_id IS NULL)਀ऀऀऀऀⴀⴀ 伀渀氀礀 爀攀琀爀椀攀瘀攀 昀椀氀攀 搀愀琀愀 昀漀爀 昀椀氀攀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 
                OR (dgl.doc_group_id IS NOT NULL AND dgvp.sid_id IS NOT NULL AND (sl.sid = @connectedusersid )) ਀            ⤀ 
	        AND internal.ufn_CHK_filter_file_id_SVF(fm.file_id, @filtergroupid) <> 'Fail' -- Apply the filter group to the file id		 ਀    ⤀ 
਀ 
     -- Add the final results to the return table਀ऀ   䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䤀䐀 ⠀昀椀氀攀开椀搀⤀ 
			SELECT df.fi ਀ऀऀऀ  䘀刀伀䴀 䐀漀挀䘀椀氀攀猀 搀昀 
਀    刀䔀吀唀刀一㬀 
END;਀䜀伀 
/****** Object:  UserDefinedFunction [internal].[ufn_SEL_files_by_doc_TVF]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Retrieves the file ids of a document for a given filter group. ਀ 
/*਀吀栀攀 氀漀最椀挀 眀漀爀欀猀 愀猀 昀漀氀氀漀眀猀⸀ 
Files are listed which:਀  ⴀ 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀Ⰰ 
  - are linked to the document id via the table xref.file_to_document_links਀匀愀洀攀 愀猀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀 戀甀琀 眀椀琀栀漀甀琀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 挀栀攀挀欀⸀  
*/਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 挀漀渀琀愀椀渀攀搀 挀漀搀攀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀椀猀 昀甀渀挀琀椀漀渀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开昀椀氀攀猀开戀礀开搀漀挀开吀嘀䘀崀  
(਀    䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
)਀刀䔀吀唀刀一匀 䀀䘀椀氀攀䤀䐀 吀䄀䈀䰀䔀  
(਀    昀椀氀攀开椀搀 戀椀最椀渀琀 
)਀䄀匀 
BEGIN਀ 
    DECLARE਀        䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀ 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
        @username nvarchar(150) = ORIGINAL_LOGIN(); -- The username     ਀ 
    -- Create a CTE containing files linked to the given document ID਀    ⴀⴀ 愀渀搀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 瘀椀攀眀⸀ 
    WITH DocFiles AS ਀    ⠀  
        SELECT DISTINCT ਀            昀洀⸀昀椀氀攀开椀搀 䄀匀 昀椀 
        FROM base.file_metadata AS fm਀        䘀唀䰀䰀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 昀琀搀氀 
            ON fm.file_id = ftdl.file_id਀        䘀唀䰀䰀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
            ON ftdl.doc_id = dgl.doc_id਀        䘀唀䰀䰀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
            ON dgl.doc_group_id = dgn.doc_group_id਀        䘀唀䰀䰀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
            ON dgn.doc_group_id = dgvp.doc_group_id਀        䘀唀䰀䰀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
            ON dgvp.sid_id = sl.sid_id਀        圀䠀䔀刀䔀  
            ftdl.doc_id = @documentid਀            䄀一䐀 昀洀⸀昀椀氀攀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
            AND (਀                ⠀昀琀搀氀⸀昀椀氀攀开椀搀 䤀匀 一唀䰀䰀 伀刀 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一唀䰀䰀⤀ 
                OR (dgl.doc_group_id IS NOT NULL AND dgvp.sid_id IS NULL)਀ऀऀऀऀⴀⴀ 伀渀氀礀 爀攀琀爀椀攀瘀攀 昀椀氀攀 搀愀琀愀 昀漀爀 昀椀氀攀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 
                OR (dgl.doc_group_id IS NOT NULL AND dgvp.sid_id IS NOT NULL AND (sl.sid = @connectedusersid ))਀            ⤀ऀऀ  
    )਀ 
਀     ⴀⴀ 䄀搀搀 琀栀攀 昀椀渀愀氀 爀攀猀甀氀琀猀 琀漀 琀栀攀 爀攀琀甀爀渀 琀愀戀氀攀 
	   INSERT INTO @FileID (file_id)਀ऀऀऀ匀䔀䰀䔀䌀吀 搀昀⸀昀椀  
			  FROM DocFiles df਀ 
    RETURN;਀䔀一䐀㬀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀琀爀椀攀瘀攀猀 琀栀攀 搀攀ⴀ渀漀爀洀愀氀椀猀攀搀 搀愀琀愀 昀漀爀 愀 昀椀氀攀 昀漀爀 愀 最椀瘀攀渀 昀漀爀洀⸀  
-- Note that if  a list id for example exists in the form table against a form id but there is਀ⴀⴀ 渀漀 挀漀爀爀攀猀瀀漀渀搀椀渀最 氀椀渀欀 戀攀琀眀攀攀渀 琀栀愀琀 氀椀猀琀 椀搀 愀渀搀 琀栀攀 最椀瘀攀渀 昀椀氀攀 椀搀 昀漀爀 攀砀愀洀瀀氀攀 琀栀攀渀 
-- no output record will be returned for that form record.  ਀ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 琀礀瀀攀 愀琀琀爀椀戀甀琀攀猀 愀爀攀 渀漀琀 椀渀挀氀甀搀攀搀 戀攀挀愀甀猀攀 琀栀攀礀 挀愀渀渀漀琀 戀攀 爀攀愀搀椀氀礀 椀渀挀氀甀搀攀搀 椀渀 愀 琀眀漀ⴀ搀椀洀攀渀猀椀漀渀愀氀 琀愀戀氀攀⸀ 
-- Multi-select attributes are retrieved via [reading].[usp_SEL_file_details] and [internal].[ufn_SEL_one_dc_data_by_frm_ITVF]਀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 挀漀渀琀愀椀渀攀搀 挀漀搀攀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀椀猀 昀甀渀挀琀椀漀渀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀崀  
(  -- The input parameters are required to have been validated already by the calling procedure. ਀ऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
    @formid bigint ਀⤀ 
RETURNS @FileData TABLE ਀⠀ 
	 field_type nvarchar(max),਀ऀ 昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
	 field_name nvarchar(50),਀ऀ 昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
	 attr_id bigint,਀ऀ 愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
	 units nvarchar(50),਀ऀ 昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 mandatory nchar(3),਀ऀ 氀攀渀最琀栀 猀洀愀氀氀椀渀琀Ⰰ 
	 attribute1 nvarchar(50),਀ऀ 愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 attribute3 nvarchar(50)			਀⤀ 
AS਀䈀䔀䜀䤀一 
਀ 
਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ 
	 --forms.form_file_free_text_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)਀      匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䘀爀攀攀 吀攀砀琀✀            䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			 form.file_free_text_name_id AS field_name_id,਀ऀऀऀ 昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀         䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			 fieldname.mnem              AS field_mnemonic,਀ऀऀऀ 一唀䰀䰀                        䄀匀 愀琀琀爀开椀搀Ⰰ 
			 val.text_value              AS attr_value,਀ऀऀऀ 一唀䰀䰀                        䄀匀 甀渀椀琀猀Ⰰ 
			 form.position               AS form_position,਀ऀऀऀ 昀漀爀洀⸀洀愀渀搀愀琀漀爀礀              䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			 form.length                 AS field_length,਀ऀऀऀ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀             䄀匀 昀椀攀氀搀开愀琀琀爀㄀Ⰰ 
			 form.attribute2             AS field_attr2,਀ऀऀऀ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀             䄀匀 昀椀攀氀搀开愀琀琀爀㌀ 
        FROM forms.form_file_free_text_links AS form਀   䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
          ON   form.file_free_text_name_id਀             㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
   LEFT JOIN file_attr.file_free_text_values AS val਀          伀一  昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
             =      val.file_free_text_name_id਀         䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
       WHERE form.form_id = @formid਀   
਀  ⴀⴀ 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
   	 INSERT INTO @FileData  (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀        
        SELECT ਀ऀऀऀ   ✀䘀椀氀攀 䐀甀琀礀 䘀甀渀挀琀椀漀渀✀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.general_field_name_id AS field_name_id, ਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀ऀऀ    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem			AS field_mnemonic, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开椀搀 ऀऀ䄀匀 愀琀琀爀开椀搀Ⰰ  
			   list.name 			    AS attr_value,਀               一唀䰀䰀ऀऀऀऀऀऀ䄀匀 甀渀椀琀猀Ⰰ  
			   form.position			AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
       LEFT JOIN people.general_field_names AS fieldname਀              伀一        昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                 = fieldname.general_field_name_id਀       䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
              ON  fieldname.general_field_name_id਀                  㴀   氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
             AND links.file_id਀                 㴀 䀀昀椀氀攀椀搀 
       LEFT JOIN people.duty_functions AS list਀              伀一  氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开椀搀 
                 = list.function_id਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	   --forms.form_file_function_list_links਀    ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)          ਀        匀䔀䰀䔀䌀吀  
			   'File Function List'     AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   fieldname.name		    AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   list.function_list_id    AS attr_id, ਀ऀऀऀ   氀椀猀琀⸀渀愀洀攀 ऀऀऀ    䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
       FROM forms.form_file_function_list_links AS form਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
              ON        form.general_field_name_id਀                 㴀 昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
       INNER JOIN people.file_to_function_list_links AS links਀              伀一  昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                  =   links.general_field_name_id਀             䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 
                 = @fileid਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 氀椀猀琀 
              ON  links.function_list_id਀                 㴀 氀椀猀琀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
       WHERE form.form_id = @formid਀ 
਀ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
   	 INSERT INTO @FileData  (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀            
        SELECT ਀ऀऀऀ   ✀䘀椀氀攀 倀攀漀瀀氀攀 䰀椀猀琀✀       䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.general_field_name_id AS field_name_id, ਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀ऀऀ    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem			AS field_mnemonic, ਀ऀऀऀ   氀椀猀琀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀    䄀匀 愀琀琀爀开椀搀Ⰰ  
			   list.name 			    AS attr_value,਀               一唀䰀䰀ऀऀऀऀऀऀ䄀匀 甀渀椀琀猀Ⰰ  
			   form.position			AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
       LEFT JOIN people.general_field_names AS fieldname਀              伀一        昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                 = fieldname.general_field_name_id਀       䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
              ON  fieldname.general_field_name_id਀                  㴀   氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
             AND links.file_id਀                 㴀 䀀昀椀氀攀椀搀 
       LEFT JOIN people.people_list_names AS list਀              伀一  氀椀渀欀猀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
                 = list.people_list_id਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
--forms.form_file_user_links਀   ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)           ਀        匀䔀䰀䔀䌀吀  
			   'File User Field'       AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   fieldname.name		    AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   list.sid_id              AS attr_id, ਀ऀऀऀ   氀椀猀琀⸀渀愀洀攀 ऀऀऀ    䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
       FROM forms.form_file_user_links AS form਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
              ON        form.general_field_name_id਀                 㴀 昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
       INNER JOIN people.file_to_user_links AS links਀              伀一  昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                  =   links.general_field_name_id਀             䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 
                 = @fileid਀       䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 氀椀猀琀 
              ON  links.sid_id਀                 㴀 氀椀猀琀⸀猀椀搀开椀搀 
       WHERE form.form_id = @formid਀ 
਀ 
	 --forms.form_file_date_field_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䐀愀琀攀✀                     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.file_date_name_id     AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀             䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			fieldname.mnem                  AS field_mnemonic,਀ऀऀऀ一唀䰀䰀                            䄀匀 愀琀琀爀开椀搀Ⰰऀऀऀ 
			CONVERT(NVARCHAR(30), val.date_value, ਀ऀऀऀ     ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 ⴀⴀ 䜀攀琀 琀栀攀 搀愀琀攀 猀琀礀氀攀 昀爀漀洀 琀栀攀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 琀愀戀氀攀 
				    FROM base.global_settings_groups ਀ऀऀऀऀ   圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀⤀ऀ 
			                                AS attr_value,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			form.position                   AS form_position,਀ऀऀ    昀漀爀洀⸀洀愀渀搀愀琀漀爀礀                  䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			form.length                     AS field_length,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀                 䄀匀 昀椀攀氀搀开愀琀琀爀㄀Ⰰ 
			form.attribute2                 AS field_attr2,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀                 䄀匀 昀椀攀氀搀开愀琀琀爀㌀ 
       FROM forms.form_file_date_field_links AS form਀  䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.file_date_name_id ਀ऀ  ऀ    㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
  LEFT JOIN file_attr.file_date_values AS val਀         伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
		    =     val.file_date_name_id਀         䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
       WHERE form.form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
  	 INSERT INTO @FileData  (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Radio Button Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name            AS field_name,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀洀渀攀洀                 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			attr.file_radiob_attr_id       AS attr_id,਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀                 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
			NULL                           AS units,਀ऀऀऀ昀漀爀洀⸀瀀漀猀椀琀椀漀渀                  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
			form.mandatory                 AS mandatory,਀ऀऀऀ昀漀爀洀⸀氀攀渀最琀栀                    䄀匀 昀椀攀氀搀开氀攀渀最琀栀Ⰰ 
			form.attribute1                AS field_attr1,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀                䄀匀 昀椀攀氀搀开愀琀琀爀㈀Ⰰ 
			form.attribute3                AS field_attr3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  LEFT JOIN file_attr.file_radio_button_list_names AS fieldname਀         伀一        昀漀爀洀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
            = fieldname.file_radiob_list_id਀  䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
         ON fieldname.file_radiob_list_id਀            㴀   氀椀渀欀猀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
        AND links.file_id = @fileid਀  䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
         ON  links.file_radiob_attr_id਀            㴀 愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
      WHERE form.form_id = @formid਀ 
਀ 
਀ 
	 --forms.form_file_com_obj_rb_lst_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䌀漀洀洀漀渀 伀戀樀攀挀琀猀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.common_object_list_id    AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀                䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			fieldname.mnem                     AS field_mnemonic,਀ऀऀऀ愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀              䄀匀 愀琀琀爀开椀搀Ⰰ 
			attr.object_name                   AS attr_value,਀ऀऀऀ一唀䰀䰀                               䄀匀 甀渀椀琀猀Ⰰ 
			form.position                      AS form_position,਀ऀऀऀ昀漀爀洀⸀洀愀渀搀愀琀漀爀礀                     䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			form.length                        AS field_length,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀                    䄀匀 昀椀攀氀搀开愀琀琀爀㄀Ⰰ 
			form.attribute2                    AS field_attr2,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀                    䄀匀 昀椀攀氀搀开愀琀琀爀㌀ 
	          FROM forms.form_file_com_obj_rb_lst_links AS form਀        䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		        ON        form.common_object_list_id ਀ऀऀऀऀ   㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        INNER JOIN com_obj.common_object_lists AS list ਀ऀऀ        伀一 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				   =    list.common_object_list_id਀        䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 愀琀琀爀  
		        ON   list.common_object_id ਀ऀऀऀऀ   㴀 愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
         LEFT JOIN com_obj.file_to_com_obj_radiob_links AS links ਀ऀऀ        伀一 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				   =   links.common_object_list_id਀             圀䠀䔀刀䔀 氀椀渀欀猀⸀昀椀氀攀开椀搀  
			       =    @fileid ਀ऀऀऀ   䄀一䐀 昀漀爀洀⸀昀漀爀洀开椀搀  
			       =   @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 
  	 INSERT INTO @FileData   (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Integer'                  AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name             AS field_name,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀洀渀攀洀                  䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			NULL                            AS attr_id,਀ऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀椀渀琀开瘀愀氀甀攀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
			uom.unit                        AS units,਀ऀऀऀ昀漀爀洀⸀瀀漀猀椀琀椀漀渀                   䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
			form.mandatory                  AS mandatory,਀ऀऀऀ昀漀爀洀⸀氀攀渀最琀栀                     䄀匀 昀椀攀氀搀开氀攀渀最琀栀Ⰰ 
			form.attribute1                 AS field_attr1,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀                 䄀匀 昀椀攀氀搀开愀琀琀爀㈀Ⰰ 
			form.attribute3                 AS field_attr3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  LEFT JOIN file_attr.file_integer_field_names AS fieldname਀         伀一         昀漀爀洀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
            =  fieldname.file_int_name_id਀  䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
         ON fieldname.file_int_name_id਀            㴀     瘀愀氀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
        AND val.file_id = @fileid਀  䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀 
         ON fieldname.unit_id਀            㴀 甀漀洀⸀甀渀椀琀开椀搀 
      WHERE form.form_id = @formid਀ 
਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 
  	 INSERT INTO @FileData   (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Real Number'           AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name          AS field_name,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀洀渀攀洀               䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			NULL                         AS attr_id,਀ऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀爀攀愀氀开瘀愀氀甀攀⤀  䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
			uom.unit                     AS units,਀ऀऀऀ昀漀爀洀⸀瀀漀猀椀琀椀漀渀                䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
			form.mandatory               AS mandatory,਀ऀऀऀ昀漀爀洀⸀氀攀渀最琀栀                  䄀匀 昀椀攀氀搀开氀攀渀最琀栀Ⰰ 
			form.attribute1              AS field_attr1,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀              䄀匀 昀椀攀氀搀开愀琀琀爀㈀Ⰰ 
			form.attribute3              AS field_attr3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  LEFT JOIN file_attr.file_real_number_field_names AS fieldname਀         伀一         昀漀爀洀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
            =  fieldname.file_real_name_id਀  䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
         ON fieldname.file_real_name_id਀            㴀     瘀愀氀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
        AND val.file_id = @fileid਀  䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀 
         ON fieldname.unit_id਀            㴀     甀漀洀⸀甀渀椀琀开椀搀 
      WHERE form.form_id = @formid਀ 
	 --forms.form_base_data_links filename਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀渀愀洀攀✀                      䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䘀椀氀攀渀愀洀攀✀                      䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'Filename'                      AS field_mnemonic,਀ऀऀऀ一唀䰀䰀                            䄀匀 愀琀琀爀开椀搀Ⰰ 
			fm.filename                     AS attr_value,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			form.position                   AS form_position,਀ऀऀऀ昀漀爀洀⸀洀愀渀搀愀琀漀爀礀                  䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			form.length                     AS field_length,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀                 䄀匀 昀椀攀氀搀开愀琀琀爀㄀Ⰰ 
			form.attribute2                 AS field_attr2,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀                 䄀匀 昀椀攀氀搀开愀琀琀爀㌀ 
       FROM forms.form_file_name_links AS form਀  䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
         ON fm.file_id = @fileid਀      圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_content_hash_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䌀漀渀琀攀渀琀 䠀愀猀栀✀             䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䘀椀氀攀 䌀漀渀琀攀渀琀 䠀愀猀栀✀             䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'FCH'                           AS field_mnemonic,਀ऀऀऀ一唀䰀䰀                            䄀匀 愀琀琀爀开椀搀Ⰰ 
			sys.fn_varbintohexstr(fm.content_hash)  AS attr_value,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			form.position                   AS form_position,਀ऀऀऀ一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			form.length                     AS field_length,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀                 䄀匀 昀椀攀氀搀开愀琀琀爀㄀Ⰰ 
			form.attribute2                 AS field_attr2,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀                 䄀匀 昀椀攀氀搀开愀琀琀爀㌀ 
       FROM forms.form_file_content_hash_links AS form਀  䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
         ON fm.file_id = @fileid਀      圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀 
  	 INSERT INTO @FileData   (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Transaction Group'        AS field_type,਀ऀऀऀ昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀         䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Transaction Group'        AS field_name,਀ऀऀऀ✀䘀吀䜀✀                           䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			NULL                            AS attr_id,਀ऀऀऀ⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀⤀ ⬀ ✀ ⴀ ✀ ⬀ 䰀䔀䘀吀⠀琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀Ⰰ ㈀㔀⤀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 䤀䐀 眀椀琀栀 渀漀琀攀 猀椀渀挀攀 渀漀琀攀 椀猀 漀瀀琀椀漀渀愀氀⸀  
			                                                                                                              -- This ensure that there will always be something displayed.਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			form.position                   AS form_position,਀ऀऀऀ昀漀爀洀⸀洀愀渀搀愀琀漀爀礀                  䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			form.length                     AS field_length,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀                 䄀匀 昀椀攀氀搀开愀琀琀爀㄀Ⰰ 
			form.attribute2                 AS field_attr2,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀                 䄀匀 昀椀攀氀搀开愀琀琀爀㌀ 
       FROM forms.form_file_transactn_grp_links AS form਀  䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
         ON fm.file_id = @fileid਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀 䄀匀 琀最 
		       ON  fm.transaction_group_id਀ऀऀऀ      㴀 琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
      WHERE form.form_id = @formid਀  
	 --forms.form_file_size_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 匀椀稀攀✀                     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䘀椀氀攀 匀椀稀攀✀                     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'Size'                          AS field_mnemonic,਀ऀऀऀ一唀䰀䰀                            䄀匀 愀琀琀爀开椀搀Ⰰ 
			CONVERT(NVARCHAR(10), fm.file_size) AS attr_value,਀ऀऀऀ✀䈀✀                             䄀匀 甀渀椀琀猀Ⰰ 
			form.position                   AS form_position,਀ऀऀ    一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			form.length                     AS field_length,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀                 䄀匀 昀椀攀氀搀开愀琀琀爀㄀Ⰰ 
			form.attribute2                 AS field_attr2,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀                 䄀匀 昀椀攀氀搀开愀琀琀爀㌀ 
       FROM forms.form_file_size_links AS form਀  䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
         ON fm.file_id = @fileid਀      圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀 
  	 INSERT INTO @FileData   (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Created'                  AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Created'                  AS field_name,਀ऀऀऀ✀䘀䌀✀                            䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			NULL                            AS attr_id,਀ऀऀ    䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀洀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ昀漀爀洀⸀瀀漀猀椀琀椀漀渀                   䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
		    NULL                            AS mandatory,਀ऀऀऀ昀漀爀洀⸀氀攀渀最琀栀                     䄀匀 昀椀攀氀搀开氀攀渀最琀栀Ⰰ 
			form.attribute1                 AS field_attr1,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀                 䄀匀 昀椀攀氀搀开愀琀琀爀㈀Ⰰ 
			form.attribute3                 AS field_attr3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  LEFT JOIN base.file_metadata AS fm਀         伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
      WHERE form.form_id = @formid਀ 
	 --forms.form_file_created_by_nm_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀椀氀攀䐀愀琀愀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
	       	 mandatory, length, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀✀               䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀✀               䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'FCB'                           AS field_mnemonic,਀ऀऀऀ一唀䰀䰀                            䄀匀 愀琀琀爀开椀搀Ⰰ 
		    fm.created_by_username          AS attr_value,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			form.position                   AS form_position,਀ऀऀ    一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			form.length                     AS field_length,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀                 䄀匀 昀椀攀氀搀开愀琀琀爀㄀Ⰰ 
			form.attribute2                 AS field_attr2,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀                 䄀匀 昀椀攀氀搀开愀琀琀爀㌀ 
       FROM forms.form_file_created_by_nm_links AS form਀  䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
         ON fm.file_id = @fileid਀      圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 
  	 INSERT INTO @FileData   (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Created By User ID'       AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Created By User ID'       AS field_name,਀ऀऀऀ✀䘀䌀䈀唀䤀䐀✀                      䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			NULL                            AS attr_id,਀ऀऀ    昀洀⸀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀            䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ昀漀爀洀⸀瀀漀猀椀琀椀漀渀                   䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
		    NULL                            AS mandatory,਀ऀऀऀ昀漀爀洀⸀氀攀渀最琀栀                     䄀匀 昀椀攀氀搀开氀攀渀最琀栀Ⰰ 
			form.attribute1                 AS field_attr1,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀                 䄀匀 昀椀攀氀搀开愀琀琀爀㈀Ⰰ 
			form.attribute3                 AS field_attr3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  LEFT JOIN base.file_metadata AS fm਀         伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
      WHERE form.form_id = @formid਀ 
਀ऀ  ⴀⴀ 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀 
  	 INSERT INTO @FileData   (field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position,਀ऀ       ऀ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Retention Date'           AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Retention Date'           AS field_name,਀ऀऀऀ✀䘀刀䐀✀                           䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			NULL                            AS attr_id,਀ऀऀऀ䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀洀⸀爀攀琀攀渀琀椀漀渀开搀愀琀攀Ⰰ  
				(SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER')), '')           ਀ऀऀऀऀ                            䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ昀漀爀洀⸀瀀漀猀椀琀椀漀渀                   䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ 
		    NULL                            AS mandatory,਀ऀऀऀ昀漀爀洀⸀氀攀渀最琀栀                     䄀匀 昀椀攀氀搀开氀攀渀最琀栀Ⰰ 
			form.attribute1                 AS field_attr1,਀ऀऀऀ昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀                 䄀匀 昀椀攀氀搀开愀琀琀爀㈀Ⰰ 
			form.attribute3                 AS field_attr3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  LEFT JOIN base.file_metadata AS fm਀         伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
      WHERE form.form_id = @formid਀ 
਀    刀䔀吀唀刀一㬀 
END;਀䜀伀 
/****** Object:  Table [workflow_models].[workflow_step_definitions]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀崀⠀ 
	[workflow_model_step_id] [int] IDENTITY(1,1) NOT NULL,਀ऀ嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[model_step_mnem] [nvarchar](10) NULL,਀ऀ嬀洀漀搀攀氀开猀琀攀瀀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[model_step_descr] [nvarchar](max) NULL,਀ऀ嬀洀漀搀攀氀开猀琀攀瀀开漀爀搀攀爀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
PRIMARY KEY CLUSTERED ਀⠀ 
	[workflow_model_step_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
)਀䄀匀 一伀䐀䔀 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_models].[workflow_actions](਀ऀ嬀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_actions] PRIMARY KEY CLUSTERED ਀⠀ 
	[workflow_action_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_models].[workflow_step_transitions]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀崀⠀ 
	[step_transition_id] [int] IDENTITY(1,1) NOT NULL,਀ऀ嬀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[step_transition_mnem] [nvarchar](10) NULL,਀ऀ嬀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[step_transition_descr] [nvarchar](max) NULL,਀倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 
AS EDGE ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_models].[workflow_rule_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀崀⠀ 
	[step_transition_id] [bigint] NOT NULL,਀ऀ嬀爀甀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_rule_links_1] PRIMARY KEY CLUSTERED ਀⠀ 
	[step_transition_id] ASC,਀ऀ嬀爀甀氀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开爀甀氀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_models].[workflow_rules](਀ऀ嬀爀甀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀爀甀氀攀开瘀愀氀甀攀开㄀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
	[rule_value_2] [int] NULL,਀ऀ嬀爀甀氀攀开瘀愀氀甀攀开㌀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开眀漀爀欀昀氀漀眀开爀甀氀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀爀甀氀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开眀昀开洀漀搀开猀琀攀瀀开搀愀琀愀开䤀吀嘀䘀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀琀爀椀攀瘀攀猀 琀栀攀 搀愀琀愀 昀漀爀 愀 眀漀爀欀昀氀漀眀 猀琀攀瀀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and contained code, including this function are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE FUNCTION [internal].[ufn_SEL_wf_mod_step_data_ITVF] ਀⠀ऀ 
     @workflow_model_step_id bigint਀⤀ 
RETURNS TABLE ਀䄀匀 
RETURN ਀⠀ 
    SELECT਀           ✀匀琀攀瀀✀                           䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wsd.workflow_model_step_id       AS field_id,਀           眀猀搀⸀洀漀搀攀氀开猀琀攀瀀开洀渀攀洀              䄀匀 昀椀攀氀搀开洀渀攀洀Ⰰ 
           ISNULL(wsd.model_step_name, '')  AS field_name,਀ऀऀ   䤀匀一唀䰀䰀⠀眀猀搀⸀洀漀搀攀氀开猀琀攀瀀开搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 昀椀攀氀搀开搀攀猀挀爀Ⰰ 
		   wsd.model_step_order             AS step_order,਀ऀऀ   一唀䰀䰀                             䄀匀 攀搀最攀开椀搀Ⰰ 
		   NULL                             AS to_node_id,਀ऀऀ   一唀䰀䰀                             䄀匀 爀甀氀攀开瘀愀氀甀攀㄀Ⰰ 
		   NULL                             AS rule_value2,਀ऀऀ   一唀䰀䰀                             䄀匀 爀甀氀攀开瘀愀氀甀攀㌀ 
      FROM workflow_models.workflow_step_definitions AS wsd਀     圀䠀䔀刀䔀 眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
	       =  @workflow_model_step_id਀ 
     UNION ALL਀ 
     SELECT਀            ✀䄀挀琀椀漀渀✀                      䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
            wa.workflow_action_id         AS field_id,਀            䤀匀一唀䰀䰀⠀眀愀⸀洀渀攀洀Ⰰ ✀✀⤀           䄀匀 昀椀攀氀搀开洀渀攀洀Ⰰ 
            wa.attr_name                  AS field_name,਀ऀऀ    䤀匀一唀䰀䰀⠀眀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀          䄀匀 昀椀攀氀搀开搀攀猀挀爀Ⰰ 
		    wsd.model_step_order          AS step_order,਀ऀऀ    眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀        䄀匀 攀搀最攀开椀搀Ⰰ 
		    wsd_to.workflow_model_step_id AS to_node_id,਀ऀऀ    一唀䰀䰀                          䄀匀 爀甀氀攀开瘀愀氀甀攀㄀Ⰰ 
		    NULL                          AS rule_value2,਀ऀऀ    一唀䰀䰀                          䄀匀 爀甀氀攀开瘀愀氀甀攀㌀ 
       FROM workflow_models.workflow_step_definitions AS wsd਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
         ON   wsd.$node_id਀ऀऀ    㴀 眀猀琀⸀␀昀爀漀洀开椀搀 
 INNER JOIN workflow_models.workflow_step_definitions AS wsd_to ਀         伀一      眀猀琀⸀␀琀漀开椀搀  
		    = wsd_to.$node_id਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀 䄀匀 眀愀 
         ON  wst.workflow_action_id ਀ऀऀ    㴀 眀愀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 
      WHERE wsd.workflow_model_step_id ਀ऀ        㴀  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
਀     唀一䤀伀一 䄀䰀䰀 
਀     匀䔀䰀䔀䌀吀 
            'Transition'                          AS field_type,਀            眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀                䄀匀 昀椀攀氀搀开椀搀Ⰰ 
            ISNULL(wst.step_transition_mnem, '')  AS field_mnem,਀            眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开渀愀洀攀              䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
		    ISNULL(wst.step_transition_descr, '') AS field_descr,਀ऀऀ    眀猀搀⸀洀漀搀攀氀开猀琀攀瀀开漀爀搀攀爀                  䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		    wst.step_transition_id                AS edge_id,਀ऀऀ    眀猀搀开琀漀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀         䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		    NULL                                  AS rule_value1,਀ऀऀ    一唀䰀䰀                                  䄀匀 爀甀氀攀开瘀愀氀甀攀㈀Ⰰ 
		    NULL                                  AS rule_value3਀       䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
 INNER JOIN workflow_models.workflow_step_transitions AS wst਀         伀一   眀猀搀⸀␀渀漀搀攀开椀搀 
		    = wst.$from_id਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀开琀漀  
         ON      wst.$to_id ਀ऀऀ    㴀 眀猀搀开琀漀⸀␀渀漀搀攀开椀搀 
      WHERE wsd.workflow_model_step_id ਀ऀ        㴀  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
਀     唀一䤀伀一 䄀䰀䰀 
਀     匀䔀䰀䔀䌀吀 
            'Rule'                        AS field_type,਀            眀爀⸀爀甀氀攀开椀搀                    䄀匀 昀椀攀氀搀开椀搀Ⰰ 
            ISNULL(wr.mnem, '')           AS field_mnem,਀            眀爀⸀愀琀琀爀开渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
		    ISNULL(wr.descr, '')          AS field_descr,਀ऀऀ    眀猀搀⸀洀漀搀攀氀开猀琀攀瀀开漀爀搀攀爀          䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		    wst.step_transition_id        AS edge_id,਀ऀऀ    眀猀搀开琀漀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		    wr.rule_value_1               AS rule_value1,਀ऀऀ    眀爀⸀爀甀氀攀开瘀愀氀甀攀开㈀               䄀匀 爀甀氀攀开瘀愀氀甀攀㈀Ⰰ 
		    wr.rule_value_3               AS rule_value3਀       䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
 INNER JOIN workflow_models.workflow_step_transitions AS wst਀         伀一   眀猀搀⸀␀渀漀搀攀开椀搀 
		    = wst.$from_id਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀开琀漀  
         ON      wst.$to_id ਀ऀऀ    㴀 眀猀搀开琀漀⸀␀渀漀搀攀开椀搀 
 INNER JOIN workflow_models.workflow_rule_links AS wrl ਀         伀一   眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
		    = wrl.step_transition_id਀  䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀 䄀匀 眀爀  
         ON  wrl.rule_id ਀ऀऀ    㴀 眀爀⸀爀甀氀攀开椀搀 
      WHERE wsd.workflow_model_step_id ਀ऀ        㴀  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
)਀䜀伀 
/****** Object:  Table [workflow_instances].[workflow_step_input_files]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_step_input_files] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC,਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_instances].[workflow_step_participants](਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀漀甀琀瀀甀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_step_participants] PRIMARY KEY CLUSTERED ਀⠀ 
	[workflow_instance_step_id] ASC,਀ऀ嬀猀椀搀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_instances].[workflow_person_output_files](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[workflow_instance_step_id] [bigint] NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_ouput_files] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC,਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_instances].[workflow_step_duty_functions]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀⠀ 
	[workflow_instance_step_id] [bigint] NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[output_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[function_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_instances].[workflow_function_output_files]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[function_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[workflow_instance_step_id] ASC,਀ऀ嬀昀甀渀挀琀椀漀渀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_instances].[workflow_instance_steps](਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[workflow_instance_id] [bigint] NOT NULL,਀ऀ嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[date_1] [datetime2](7) NULL,਀ऀ嬀搀愀琀攀开㈀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[date_3] [datetime2](7) NULL,਀ऀ嬀猀琀攀瀀开猀琀愀琀甀猀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_instance_steps] PRIMARY KEY CLUSTERED ਀⠀ 
	[workflow_instance_step_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_instances].[workflow_output_definitions]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀崀⠀ 
	[output_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀漀甀琀瀀甀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [base].[file_metadata](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[filename] [nvarchar](255) NULL,਀ऀ嬀挀漀渀琀攀渀琀开栀愀猀栀崀 嬀瘀愀爀戀椀渀愀爀礀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[transaction_group_id] [bigint] NULL,਀ऀ嬀昀椀氀攀开猀椀稀攀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀㔀⤀ 一唀䰀䰀Ⰰ 
	[created_by_sid_id] [bigint] NULL,਀ऀ嬀爀攀琀攀渀琀椀漀渀开搀愀琀攀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_metadata] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[sid_list]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀⠀ 
	[sid_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　　⤀ 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀猀椀搀崀 嬀瘀愀爀戀椀渀愀爀礀崀⠀㄀　　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀攀洀愀椀氀开愀搀搀爀攀猀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀㔀⤀ 一唀䰀䰀Ⰰ 
	[username] [nvarchar](255) NULL,਀ऀ嬀爀攀猀琀漀爀攀开猀椀搀崀 嬀瘀愀爀戀椀渀愀爀礀崀⠀㄀　　⤀ 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_sid_list] PRIMARY KEY CLUSTERED ਀⠀ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[duty_functions]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀猀崀⠀ 
	[function_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀椀瀀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀甀渀挀琀椀漀渀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_instances].[step_status_definitions](਀ऀ嬀猀琀攀瀀开猀琀愀琀甀猀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_step_status_definitions] PRIMARY KEY CLUSTERED ਀⠀ 
	[step_status_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  UserDefinedFunction [internal].[ufn_SEL_wf_inst_step_data_ITVF]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Retrieves the data for a workflow instance step. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 挀漀渀琀愀椀渀攀搀 挀漀搀攀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀椀猀 昀甀渀挀琀椀漀渀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开眀昀开椀渀猀琀开猀琀攀瀀开搀愀琀愀开䤀吀嘀䘀崀  
(	਀     䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀 
)਀刀䔀吀唀刀一匀 吀䄀䈀䰀䔀  
AS਀刀䔀吀唀刀一  
(਀    匀䔀䰀䔀䌀吀 
           'Step Status'        AS field_type,਀           眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䄀匀 昀椀攀氀搀开椀搀Ⰰ 
		   'SSTAT'              AS field_mnemonic,਀ऀऀ   ✀匀琀攀瀀 匀琀愀琀甀猀✀        䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
		   ssd.step_status_id   AS attr_id,਀           䤀匀一唀䰀䰀⠀猀猀搀⸀洀渀攀洀Ⰰ ✀✀⤀ 䄀匀 愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 
           ssd.attr_name        AS attr_name,਀ऀऀ   䤀匀一唀䰀䰀⠀猀猀搀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 
		   NULL                 AS step_order,਀ऀऀ   一唀䰀䰀                 䄀匀 攀搀最攀开椀搀Ⰰ 
		   NULL                 AS to_node_id,਀ऀऀ   一唀䰀䰀                 䄀匀 爀甀氀攀开瘀愀氀Ⰰ 
		   NULL                 AS date_val਀      䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
LEFT JOIN workflow_instances.step_status_definitions AS ssd਀        伀一   眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
		   = ssd.step_status_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀ 
     UNION ALL਀ 
	SELECT਀           ✀䐀愀琀攀 嘀愀氀甀攀✀         䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wis.workflow_instance_step_id AS field_id,਀ऀऀ   ✀䐀嘀㄀✀                䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
		   'Date Value 1'       AS field_name,਀ऀऀ   猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀   䄀匀 愀琀琀爀开椀搀Ⰰ 
           ISNULL(ssd.mnem, '') AS attr_mnemonic,਀           猀猀搀⸀愀琀琀爀开渀愀洀攀        䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   ISNULL(ssd.descr, '') AS long_text_val,਀ऀऀ   一唀䰀䰀                 䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                 AS edge_id,਀ऀऀ   一唀䰀䰀                 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   NULL                 AS rule_val,਀ऀऀ   眀椀猀⸀搀愀琀攀开㄀           䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀猀搀 
        ON   wis.step_status_id਀ऀऀ   㴀 猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
     WHERE wis.workflow_instance_step_id ਀ऀ       㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	   AND wis.date_1 IS NOT NULL਀ 
     UNION ALL਀ 
	SELECT਀           ✀䐀愀琀攀 嘀愀氀甀攀✀         䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wis.workflow_instance_step_id AS field_id,਀ऀऀ   ✀䐀嘀㈀✀                䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
		   'Date Value 2'       AS field_name,਀ऀऀ   猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀   䄀匀 愀琀琀爀开椀搀Ⰰ 
           ISNULL(ssd.mnem, '') AS attr_mnemonic,਀           猀猀搀⸀愀琀琀爀开渀愀洀攀        䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   ISNULL(ssd.descr, '') AS long_text_val,਀ऀऀ   一唀䰀䰀                 䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                 AS edge_id,਀ऀऀ   一唀䰀䰀                 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   NULL                 AS rule_val,਀ऀऀ   眀椀猀⸀搀愀琀攀开㈀           䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀猀搀 
        ON   wis.step_status_id਀ऀऀ   㴀 猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
     WHERE wis.workflow_instance_step_id ਀ऀ       㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	   AND wis.date_2 IS NOT NULL਀ 
     UNION ALL਀ 
	SELECT਀           ✀䐀愀琀攀 嘀愀氀甀攀✀         䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wis.workflow_instance_step_id AS field_id,਀ऀऀ   ✀䐀嘀㌀✀                䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
		   'Date Value 3'       AS field_name,਀ऀऀ   猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀   䄀匀 愀琀琀爀开椀搀Ⰰ 
           ISNULL(ssd.mnem, '') AS attr_mnemonic,਀           猀猀搀⸀愀琀琀爀开渀愀洀攀        䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   ISNULL(ssd.descr, '') AS long_text_val,਀ऀऀ   一唀䰀䰀                 䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                 AS edge_id,਀ऀऀ   一唀䰀䰀                 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   NULL                 AS rule_val,਀ऀऀ   眀椀猀⸀搀愀琀攀开㌀           䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀ 䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀猀搀 
        ON   wis.step_status_id਀ऀऀ   㴀 猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
     WHERE wis.workflow_instance_step_id ਀ऀ       㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	   AND wis.date_3 IS NOT NULL਀ 
਀     唀一䤀伀一 䄀䰀䰀 
਀    匀䔀䰀䔀䌀吀 
           'Input File'     AS field_type,਀           猀椀昀⸀昀椀氀攀开椀搀      䄀匀 昀椀攀氀搀开椀搀Ⰰ 
           'FILEID'         AS field_mnemonic,਀           ✀䘀椀氀攀 一愀洀攀✀      䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
           NULL             AS attr_id,਀ऀऀ   一唀䰀䰀             䄀匀 愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 
		   NULL             AS attr_name,਀ऀऀ   昀洀⸀昀椀氀攀渀愀洀攀      䄀匀 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 
		   NULL             AS step_order,਀ऀऀ   一唀䰀䰀             䄀匀 攀搀最攀开椀搀Ⰰ 
		   NULL             AS to_node_id,਀ऀऀ   一唀䰀䰀             䄀匀 爀甀氀攀开瘀愀氀Ⰰ 
		   NULL             AS date_val਀      䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
LEFT JOIN workflow_instances.workflow_step_input_files AS sif਀        伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   = sif.workflow_input_step_id਀䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
        ON  sif.file_id਀ऀऀ   㴀 昀洀⸀昀椀氀攀开椀搀 
     WHERE wis.workflow_instance_step_id ਀ऀ       㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
਀     唀一䤀伀一 䄀䰀䰀 
਀    匀䔀䰀䔀䌀吀 
           'Person Output Definition'  AS field_type,਀           眀猀瀀⸀猀椀搀开椀搀           䄀匀 昀椀攀氀搀开椀搀Ⰰ 
           'PERSON'             AS field_mnemonic,਀           猀氀⸀渀愀洀攀              䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
           wod.output_id        AS attr_id,਀ऀऀ   䤀匀一唀䰀䰀⠀眀漀搀⸀洀渀攀洀Ⰰ ✀✀⤀ 䄀匀 愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 
		   wod.attr_name        AS attr_name,਀ऀऀ   䤀匀一唀䰀䰀⠀眀漀搀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 
		   NULL                 AS step_order,਀ऀऀ   一唀䰀䰀                 䄀匀 攀搀最攀开椀搀Ⰰ 
		   NULL                 AS to_node_id,਀ऀऀ   一唀䰀䰀                 䄀匀 爀甀氀攀开瘀愀氀Ⰰ 
		   NULL                 AS date_val਀      䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
LEFT JOIN workflow_instances.workflow_step_participants AS wsp਀        伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   = wsp.workflow_instance_step_id਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀漀搀 
        ON   wsp.output_id਀ऀऀ   㴀 眀漀搀⸀漀甀琀瀀甀琀开椀搀 
 LEFT JOIN user_restr.sid_list AS sl਀        伀一 眀猀瀀⸀猀椀搀开椀搀 
		   = sl.sid_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀ऀ   䄀一䐀 眀猀瀀⸀漀甀琀瀀甀琀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
਀ 
     UNION ALL਀ 
    SELECT਀           ✀䘀甀渀挀琀椀漀渀 伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀✀  䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wdf.function_id      AS field_id,਀           ✀䘀唀一䌀吀䤀伀一✀           䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
           df.name              AS field_name,਀           眀漀搀⸀漀甀琀瀀甀琀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ 
		   ISNULL(wod.mnem, '') AS attr_mnemonic,਀ऀऀ   眀漀搀⸀愀琀琀爀开渀愀洀攀        䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   ISNULL(wod.descr, '') AS long_text_val,਀ऀऀ   一唀䰀䰀                 䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                 AS edge_id,਀ऀऀ   一唀䰀䰀                 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   NULL                 AS rule_val,਀ऀऀ   一唀䰀䰀                 䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 眀搀昀 
        ON   wis.workflow_instance_step_id਀ऀऀ   㴀 眀搀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
LEFT JOIN workflow_instances.workflow_output_definitions AS wod਀        伀一   眀搀昀⸀漀甀琀瀀甀琀开椀搀 
		   = wod.output_id਀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
        ON  wdf.function_id਀ऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
     WHERE wis.workflow_instance_step_id ਀ऀ       㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	   AND wdf.output_id IS NOT NULL਀ 
     UNION ALL਀ 
    SELECT਀           ✀倀愀爀琀椀挀椀瀀愀渀琀猀✀       䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wsp.sid_id           AS field_id,਀           ✀倀䔀刀匀伀一✀             䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
           sl.name              AS field_name,਀           一唀䰀䰀                 䄀匀 愀琀琀爀开椀搀Ⰰ 
		   NULL                 AS attr_mnemonic,਀ऀऀ   一唀䰀䰀                 䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   sl.email_address     AS long_text_val,਀ऀऀ   一唀䰀䰀                 䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                 AS edge_id,਀ऀऀ   一唀䰀䰀                 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   NULL                 AS rule_val,਀ऀऀ   一唀䰀䰀                 䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 䄀匀 眀猀瀀 
        ON   wis.workflow_instance_step_id਀ऀऀ   㴀 眀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
 LEFT JOIN user_restr.sid_list AS sl਀        伀一 眀猀瀀⸀猀椀搀开椀搀 
		   = sl.sid_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀ 
     UNION ALL਀ 
    SELECT਀           ✀倀攀爀猀漀渀 伀甀琀瀀甀琀 䘀椀氀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wpof.sid_id          AS field_id,਀           ✀倀䔀刀匀伀一✀             䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
           sl.name              AS field_name,਀           眀瀀漀昀⸀昀椀氀攀开椀搀         䄀匀 愀琀琀爀开椀搀Ⰰ 
		   'FILE-ID'            AS attr_mnemonic,਀ऀऀ   ✀䘀椀氀攀 䤀䐀✀            䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   fm.filename          AS long_text_val,਀ऀऀ   一唀䰀䰀                 䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                 AS edge_id,਀ऀऀ   一唀䰀䰀                 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   NULL                 AS rule_val,਀ऀऀ   一唀䰀䰀                 䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 䄀匀 眀猀瀀 
        ON   wis.workflow_instance_step_id਀ऀऀ   㴀 眀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
LEFT JOIN workflow_instances.workflow_person_output_files AS wpof਀        伀一    眀猀瀀⸀猀椀搀开椀搀 
		   = wpof.sid_id਀䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
        ON wpof.file_id਀ऀऀ   㴀 昀洀⸀昀椀氀攀开椀搀 
 LEFT JOIN user_restr.sid_list AS sl਀        伀一 眀猀瀀⸀猀椀搀开椀搀 
		   = sl.sid_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀ 
     UNION ALL਀ 
    SELECT਀           ✀䘀甀渀挀琀椀漀渀猀✀          䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wsdf.function_id     AS field_id,਀           䤀匀一唀䰀䰀⠀搀昀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
           df.name              AS field_name,਀           一唀䰀䰀                 䄀匀 愀琀琀爀开椀搀Ⰰ 
		   NULL                 AS attr_mnemonic,਀ऀऀ   一唀䰀䰀                 䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   NULL                 AS long_text_val,਀ऀऀ   一唀䰀䰀                 䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                 AS edge_id,਀ऀऀ   一唀䰀䰀                 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   NULL                 AS rule_val,਀ऀऀ   一唀䰀䰀                 䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 眀猀搀昀 
        ON    wis.workflow_instance_step_id਀ऀऀ   㴀 眀猀搀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
 LEFT JOIN people.duty_functions AS df਀        伀一 眀猀搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		   = df.function_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀ 
਀     唀一䤀伀一 䄀䰀䰀 
਀    匀䔀䰀䔀䌀吀 
           'Function Output File' AS field_type,਀           眀昀漀昀⸀昀甀渀挀琀椀漀渀开椀搀       䄀匀 昀椀攀氀搀开椀搀Ⰰ 
           ISNULL(df.mnem, '')    AS field_mnemonic,਀           搀昀⸀渀愀洀攀                䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
           wfof.file_id           AS attr_id,਀ऀऀ   ✀䘀䤀䰀䔀ⴀ䤀䐀✀              䄀匀 愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 
		   'File ID'              AS attr_name,਀ऀऀ   昀洀⸀昀椀氀攀渀愀洀攀            䄀匀 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 
		   NULL                   AS step_order,਀ऀऀ   一唀䰀䰀                   䄀匀 攀搀最攀开椀搀Ⰰ 
		   NULL                   AS to_node_id,਀ऀऀ   一唀䰀䰀                   䄀匀 爀甀氀攀开瘀愀氀Ⰰ 
		   NULL                   AS date_val਀      䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
LEFT JOIN workflow_instances.workflow_step_duty_functions AS wsdf਀        伀一    眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   = wsdf.workflow_instance_step_id਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 䄀匀 眀昀漀昀 
        ON   wsdf.function_id਀ऀऀ   㴀 眀昀漀昀⸀昀甀渀挀琀椀漀渀开椀搀 
LEFT JOIN base.file_metadata AS fm਀        伀一 眀昀漀昀⸀昀椀氀攀开椀搀 
		   = fm.file_id਀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
        ON wsdf.function_id਀ऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
     WHERE wis.workflow_instance_step_id ਀ऀ       㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
਀     唀一䤀伀一 䄀䰀䰀 
਀    匀䔀䰀䔀䌀吀 
           'Workflow Rule'               AS field_type,਀           眀爀氀⸀爀甀氀攀开椀搀                   䄀匀 昀椀攀氀搀开椀搀Ⰰ 
           ISNULL(wr.mnem, '')           AS field_mnemonic,਀           眀爀⸀愀琀琀爀开渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
           NULL                          AS attr_id,਀ऀऀ   一唀䰀䰀                          䄀匀 愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 
		   NULL                          AS attr_name,਀ऀऀ   䤀匀一唀䰀䰀⠀眀爀⸀搀攀猀挀爀Ⰰ ✀✀⤀          䄀匀 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 
		   NULL                          AS step_order,਀ऀऀ   眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀        䄀匀 攀搀最攀开椀搀Ⰰ 
		   wsd_to.workflow_model_step_id AS to_node_id,਀ऀऀ   一唀䰀䰀                          䄀匀 爀甀氀攀开瘀愀氀Ⰰ 
		   NULL                          AS date_val਀      䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
INNER JOIN workflow_models.workflow_step_definitions AS wsd਀        伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
		   = wsd.workflow_model_step_id਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
        ON   wsd.$node_id਀ऀऀ   㴀 眀猀琀⸀␀昀爀漀洀开椀搀 
LEFT JOIN workflow_models.workflow_step_definitions AS wsd_to ਀        伀一      眀猀琀⸀␀琀漀开椀搀  
	       = wsd_to.$node_id਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀 䄀匀 眀爀氀 
        ON   wst.step_transition_id਀ऀऀ   㴀 眀爀氀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
 LEFT JOIN workflow_models.workflow_rules AS wr਀        伀一  眀爀氀⸀爀甀氀攀开椀搀 
		   = wr.rule_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀ 
     UNION ALL਀ 
    SELECT਀           ✀刀甀氀攀 嘀愀氀甀攀 ㄀✀  䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wrl.rule_id         AS field_id,਀           䤀匀一唀䰀䰀⠀眀爀⸀洀渀攀洀Ⰰ ✀✀⤀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
           wr.attr_name        AS field_name,਀           一唀䰀䰀                䄀匀 愀琀琀爀开椀搀Ⰰ 
		   NULL                AS attr_mnemonic,਀ऀऀ   一唀䰀䰀                䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   NULL                AS long_text_val,਀ऀऀ   一唀䰀䰀                䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                AS edge_id,਀ऀऀ   眀猀搀开琀漀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   wr.rule_value_1     AS rule_val,਀ऀऀ   一唀䰀䰀                䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
        ON   wis.workflow_model_step_id਀ऀऀ   㴀 眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
LEFT JOIN workflow_models.workflow_step_transitions AS wst਀        伀一   眀猀搀⸀␀渀漀搀攀开椀搀 
		   = wst.$from_id਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀开琀漀  
        ON      wst.$to_id ਀ऀ       㴀 眀猀搀开琀漀⸀␀渀漀搀攀开椀搀 
 LEFT JOIN workflow_models.workflow_rule_links AS wrl਀        伀一   眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
		   = wrl.step_transition_id਀ 䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀 䄀匀 眀爀 
        ON  wrl.rule_id਀ऀऀ   㴀 眀爀⸀爀甀氀攀开椀搀 
     WHERE wis.workflow_instance_step_id ਀ऀ       㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
       AND wr.rule_value_1 IS NOT NULL਀ 
     UNION ALL਀ 
਀    匀䔀䰀䔀䌀吀 
           'Rule Value 2'                AS field_type,਀           眀爀氀⸀爀甀氀攀开椀搀                   䄀匀 昀椀攀氀搀开椀搀Ⰰ 
           ISNULL(wr.mnem, '')           AS field_mnemonic,਀           眀爀⸀愀琀琀爀开渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
           NULL                          AS attr_id,਀ऀऀ   一唀䰀䰀                          䄀匀 愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 
		   NULL                          AS attr_name,਀ऀऀ   一唀䰀䰀                          䄀匀 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 
		   NULL                          AS step_order,਀ऀऀ   一唀䰀䰀                          䄀匀 攀搀最攀开椀搀Ⰰ 
		   wsd_to.workflow_model_step_id AS to_node_id,਀ऀऀ   眀爀⸀爀甀氀攀开瘀愀氀甀攀开㈀               䄀匀 爀甀氀攀开瘀愀氀Ⰰ 
		   NULL                          AS date_val਀      䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
INNER JOIN workflow_models.workflow_step_definitions AS wsd਀        伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
		   = wsd.workflow_model_step_id਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀  
        ON   wsd.$node_id਀ऀऀ   㴀 眀猀琀⸀␀昀爀漀洀开椀搀 
LEFT JOIN workflow_models.workflow_step_definitions AS wsd_to ਀        伀一      眀猀琀⸀␀琀漀开椀搀  
	       = wsd_to.$node_id਀ 䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀 䄀匀 眀爀氀 
        ON   wst.step_transition_id਀ऀऀ   㴀 眀爀氀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
 LEFT JOIN workflow_models.workflow_rules AS wr਀        伀一  眀爀氀⸀爀甀氀攀开椀搀 
		   = wr.rule_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀       䄀一䐀 眀爀⸀爀甀氀攀开瘀愀氀甀攀开㈀ 䤀匀 一伀吀 一唀䰀䰀 
਀     唀一䤀伀一 䄀䰀䰀 
਀    匀䔀䰀䔀䌀吀 
           'Rule Value 3'            AS field_type,਀           眀爀氀⸀爀甀氀攀开椀搀                   䄀匀 昀椀攀氀搀开椀搀Ⰰ 
           wr.mnem                       AS field_mnemonic,਀           眀爀⸀愀琀琀爀开渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
           NULL                          AS attr_id,਀ऀऀ   一唀䰀䰀                          䄀匀 愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 
		   NULL                          AS attr_name,਀ऀऀ   一唀䰀䰀                          䄀匀 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 
		   NULL                          AS step_order,਀ऀऀ   一唀䰀䰀                          䄀匀 攀搀最攀开椀搀Ⰰ 
		   wsd_to.workflow_model_step_id AS to_node_id,਀ऀऀ   眀爀⸀爀甀氀攀开瘀愀氀甀攀开㌀               䄀匀 爀甀氀攀开瘀愀氀Ⰰ 
		   NULL                          AS date_val਀      䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
INNER JOIN workflow_models.workflow_step_definitions AS wsd਀        伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
		   = wsd.workflow_model_step_id਀䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
        ON   wsd.$node_id਀ऀऀ   㴀 眀猀琀⸀␀昀爀漀洀开椀搀 
LEFT JOIN workflow_models.workflow_step_definitions AS wsd_to ਀        伀一      眀猀琀⸀␀琀漀开椀搀  
	       = wsd_to.$node_id਀ 䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀 䄀匀 眀爀氀 
        ON   wst.step_transition_id਀ऀऀ   㴀 眀爀氀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
 LEFT JOIN workflow_models.workflow_rules AS wr਀        伀一  眀爀氀⸀爀甀氀攀开椀搀 
		   = wr.rule_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀       䄀一䐀 眀爀⸀爀甀氀攀开瘀愀氀甀攀开㌀ 䤀匀 一伀吀 一唀䰀䰀 
਀     唀一䤀伀一 䄀䰀䰀 
਀    匀䔀䰀䔀䌀吀 
           'Workflow Instance Step ID'    AS field_type,਀           眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  䄀匀 昀椀攀氀搀开椀搀Ⰰ 
           'WFISID'                       AS field_mnemonic,਀           ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
           NULL                           AS attr_id,਀ऀऀ   䤀匀一唀䰀䰀⠀眀猀搀⸀洀漀搀攀氀开猀琀攀瀀开洀渀攀洀Ⰰ ✀✀⤀ 䄀匀 愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 
		   wsd.model_step_name            AS attr_name,਀ऀऀ   䤀匀一唀䰀䰀⠀眀猀搀⸀洀漀搀攀氀开猀琀攀瀀开搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 
		   wsd.model_step_order           AS step_order,਀ऀऀ   一唀䰀䰀                           䄀匀 攀搀最攀开椀搀Ⰰ 
		   NULL                           AS to_node_id,਀ऀऀ   一唀䰀䰀                           䄀匀 爀甀氀攀开瘀愀氀Ⰰ 
		   NULL                           AS date_val਀      䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
INNER JOIN workflow_models.workflow_step_definitions AS wsd਀        伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
		   = wsd.workflow_model_step_id਀     圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
	       =           @instance_step_id਀ 
     UNION ALL਀ 
    SELECT਀           ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 匀琀攀瀀 䤀䐀✀   䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
           wsd.workflow_model_step_id AS field_id,਀           ✀圀䘀䴀匀䤀䐀✀                   䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
           'Workflow Model Step ID'   AS field_name,਀           一唀䰀䰀                       䄀匀 愀琀琀爀开椀搀Ⰰ 
		   NULL                       AS attr_mnemonic,਀ऀऀ   一唀䰀䰀                       䄀匀 愀琀琀爀开渀愀洀攀Ⰰ 
		   NULL                       AS long_text_val,਀ऀऀ   眀猀搀⸀洀漀搀攀氀开猀琀攀瀀开漀爀搀攀爀       䄀匀 猀琀攀瀀开漀爀搀攀爀Ⰰ 
		   NULL                       AS edge_id,਀ऀऀ   一唀䰀䰀                       䄀匀 琀漀开渀漀搀攀开椀搀Ⰰ 
		   NULL                       AS rule_val,਀ऀऀ   一唀䰀䰀                       䄀匀 搀愀琀攀开瘀愀氀 
      FROM workflow_instances.workflow_instance_steps AS wis਀䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
        ON   wis.workflow_model_step_id਀ऀऀ   㴀 眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
     WHERE wis.workflow_instance_step_id ਀ऀ       㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
਀ 
)਀䜀伀 
/****** Object:  Table [forms].[form_doc_booking_date_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_booking_date] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_free_text_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_free_text] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [people].[people_list_names](਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[description] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_people_list_names] PRIMARY KEY CLUSTERED ਀⠀ 
	[people_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_radio_button_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[file_radiob_list_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开爀愀搀椀漀戀开愀猀猀椀最渀洀攀渀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[file_radiob_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_booking_comnts_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀渀琀猀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_booking_comments] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_integer_field_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_int] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_booking_release_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [doc_attr].[doc_radio_button_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_radiob_attr_id] [bigint] NULL,਀ऀ嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_radiob_assignment] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_radio_button_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_radiob_list_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ऀ嬀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_radiob] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_real_number_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_real_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开爀攀愀氀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[file_real_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_created_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_created_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_multi_select_list_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀⠀ 
	[doc_ms_list_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开猀攀氀攀挀琀开洀愀渀礀开琀愀戀氀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_multi_sel_list_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_ms_list_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[file_ms_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_created_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_created_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_integer_values]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[int_value] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开椀渀琀开瘀愀氀甀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_int_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_com_obj_ms_lst_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_com_obj] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [com_obj].[common_objects](਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀漀戀樀攀挀琀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[description] [nvarchar](max) NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_common_objects] PRIMARY KEY CLUSTERED ਀⠀ 
	[common_object_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_free_text_field_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[doc_free_text_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_free_text_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_free_text_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_transaction_grp_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [doc_attr].[doc_real_number_values](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_real_name_id] [bigint] NOT NULL,਀ऀ嬀爀攀愀氀开瘀愀氀甀攀崀 嬀爀攀愀氀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_real_value] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_lock_status_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[lock_status_default] [nvarchar](10) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_name_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_name_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_free_text_field_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[file_free_text_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_free_text_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_free_text_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_content_hash_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_content_hash_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_free_text_values]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[text_value] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[file_free_text_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[general_field_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[general_field_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀椀瀀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_transactn_grp_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_transactn_grp_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_radio_button_list_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀⠀ 
	[doc_radiob_list_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ऀ嬀爀攀猀琀爀椀挀琀攀搀崀 嬀戀椀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_radiob_list_id] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_radiob_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_size_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_size_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [com_obj].[common_object_list_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀崀⠀ 
	[common_object_list_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[list_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀椀瀀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[common_object_attribute_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开渀愀洀攀开漀昀开搀漀挀猀开挀漀洀开漀戀樀开氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [people].[doc_to_function_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[function_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_to_function_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀昀甀渀挀琀椀漀渀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [com_obj].[file_to_com_obj_ms_list_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开琀漀开氀椀猀琀开琀漀开洀开漀戀樀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_list_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [doc_attr].[doc_multi_select_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_ms_list_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_list_assignment] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_ms_attr_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[doc_to_function_list_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开㄀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[function_list_id] ASC,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [doc_attr].[doc_date_values](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_date_name_id] [bigint] NOT NULL,਀ऀ嬀搀愀琀攀开瘀愀氀甀攀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_date_value] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [file_attr].[file_integer_values](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_int_name_id] [bigint] NOT NULL,਀ऀ嬀椀渀琀开瘀愀氀甀攀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_int_value] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC,਀ऀ嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [people].[doc_to_people_list_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[people_list_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_to_people_list_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_date_values]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[date_value] [datetime2](7) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开搀愀琀攀开瘀愀氀甀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[file_date_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[document_id_list]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[lock_status] [nvarchar](10) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀崀 一唀䰀䰀Ⰰ 
	[created_by_username] [nvarchar](255) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[booking_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开开搀漀挀甀洀攀渀琀开开㠀䄀䐀　㈀㤀㈀㐀㔀㐀㔀㤀䌀㄀䌀㈀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_created_by_nm_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [people].[file_to_function_links](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[function_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_to_function_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC,਀ऀ嬀昀甀渀挀琀椀漀渀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_date_field_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[file_date_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_date_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_date_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_created_by_id_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_created_by_id_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [com_obj].[file_to_com_obj_radiob_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开琀漀开氀椀猀琀开琀漀开漀渀攀开漀戀樀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_real_number_values]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[real_value] [real] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开爀攀愀氀开瘀愀氀甀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[file_real_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_created_by_nm_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_created_by_nm_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[file_to_function_list_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开㄀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[function_list_id] ASC,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀戀愀猀攀崀⸀嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [base].[transaction_groups](਀ऀ嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[transaction_group_note] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [com_obj].[doc_to_com_obj_ms_list_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_list_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_to_sel_m_obj_list] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_created_by_id_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_created_by_id_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[file_to_people_list_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[people_list_id] ASC,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [com_obj].[common_object_lists](਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_id] [bigint] NOT NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_common_object_multi_sel_lists_1] PRIMARY KEY CLUSTERED ਀⠀ 
	[common_object_list_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀戀愀猀攀崀⸀嬀戀漀漀欀椀渀最开氀漀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [base].[booking_log](਀ऀ嬀戀漀漀欀椀渀最开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀戀漀漀欀椀渀最开猀琀愀琀甀猀崀 嬀渀挀栀愀爀崀⠀㄀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[user_id] [bigint] NOT NULL,਀ऀ嬀猀礀猀琀攀洀开甀猀攀爀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀㔀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[booking_date] [datetime2](7) NOT NULL,਀ऀ嬀挀漀洀洀攀渀琀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　　　⤀ 一唀䰀䰀Ⰰ 
	[release_number] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开戀漀漀欀椀渀最开氀漀最崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀戀漀漀欀椀渀最开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_function_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开㄀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [com_obj].[doc_to_com_obj_radiob_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开琀漀开氀椀猀琀开琀漀开漀渀攀开漀戀樀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[global_settings_groups]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀⠀ 
	[setting_group_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[setting_group_description] [nvarchar](max) NULL,਀ऀ嬀氀愀渀最甀愀最攀开椀搀崀 嬀渀挀栀愀爀崀⠀㈀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[is_register_code_applied] [nvarchar](3) NOT NULL,਀ऀ嬀爀攀最椀猀琀攀爀开挀漀搀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㘀⤀ 一唀䰀䰀Ⰰ 
	[auto_gen_doc_id_length] [int] NULL,਀ऀ嬀甀猀攀开愀甀琀漀开最攀渀开搀漀挀开椀搀开漀渀开渀甀氀氀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㌀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_id_format] [nvarchar](10) NULL,਀ऀ嬀搀漀挀开椀搀开氀愀猀琀开椀渀琀攀最攀爀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[date_style] [int] NOT NULL,਀ऀ嬀挀甀氀琀甀爀攀开挀漀搀攀崀 嬀渀挀栀愀爀崀⠀㄀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_autogen_max_tries] [int] NOT NULL,਀ऀ嬀搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[default_form_id] [bigint] NOT NULL,਀ऀ嬀搀攀昀愀甀氀琀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[default_tag_tree_id] [bigint] NULL,਀ऀ嬀搀攀昀愀甀氀琀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[duplicate_management] [nvarchar](3) NULL,਀ऀ嬀挀爀攀愀琀攀搀开氀愀猀琀开洀椀渀甀琀攀猀崀 嬀椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[enforced_retention] [nchar](3) NULL,਀ऀ嬀昀椀氀攀开爀攀愀搀开氀漀最崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[file_delete_log] [nchar](3) NULL,਀ऀ嬀猀琀漀爀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[store_thumbnails] [nchar](3) NULL,਀ऀ嬀搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[booking_in_time_box] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最开最爀漀甀瀀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀猀攀琀琀椀渀最开最爀漀甀瀀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_function_list_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_free_text_values]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[text_value] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_free_text_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_multi_select_attributes]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀⠀ 
	[doc_ms_attr_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_d_sm_attr_id] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_ms_attr_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_radio_button_attributes]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀⠀ 
	[file_radiob_attr_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_radiob_attribute] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_radiob_attr_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_people_list_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_people_list_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [doc_attr].[doc_date_field_names](਀ऀ嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开搀愀琀攀开渀愀洀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_function_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_radio_button_attributes]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀⠀ 
	[doc_radiob_attr_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_radiob_attribute] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_radiob_attr_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_com_obj_ms_lst_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_com_obj] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_function_list_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开㄀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_booking_status_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_booking_status_link] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_multi_sel_list_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_multi_sel_list_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [people].[doc_to_user_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_to_user_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀猀椀搀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_people_list_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_people_list_links_1] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_booking_id_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [file_attr].[file_multi_select_attributes](਀ऀ嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[file_ms_list_id] [bigint] NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开猀洀开愀琀琀爀椀戀甀琀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [file_attr].[file_multi_select_links](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_ms_list_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_sm_assignment] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC,਀ऀ嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[file_ms_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_date_field_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_date] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [base].[units_of_measure](਀ऀ嬀甀渀椀琀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[unit] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀　⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开唀渀椀琀开䤀䐀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀甀渀椀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [people].[file_to_user_links](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_to_user_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC,਀ऀ嬀猀椀搀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_integer_field_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[doc_int_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[unit_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开椀渀琀开渀愀洀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_free_text_field_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[doc_free_text_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_free_text_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_multi_select_list_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀⠀ 
	[file_ms_list_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开猀攀氀攀挀琀开洀愀渀礀开氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_integer_field_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[doc_int_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开椀渀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_int_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_user_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_user_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [doc_attr].[doc_real_number_field_names](਀ऀ嬀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀甀渀椀琀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_real_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_real_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_radio_button_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[default_doc_rb_attr_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开爀愀搀椀漀戀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_radiob_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_radio_button_list_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀⠀ 
	[file_radiob_list_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ऀ嬀爀攀猀琀爀椀挀琀攀搀崀 嬀戀椀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_radiob_list] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_radiob_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_com_obj_rb_lst_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[default_common_object_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_integer_field_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[file_int_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[unit_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开椀渀琀开渀愀洀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_user_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[general_field_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[general_field_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[function_list_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀⠀ 
	[function_list_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀椀瀀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_real_number_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[doc_real_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开爀攀愀氀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_real_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_com_obj_rb_lst_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[mandatory] [nchar](3) NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[default_common_object_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_real_number_field_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀⠀ 
	[file_real_name_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[unit_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开爀攀愀氀开渀愀洀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_date_field_links](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_date_name_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开搀愀琀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[file_date_name_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_booking_user_id_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_booking_user_id] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  UserDefinedFunction [internal].[ufn_SEL_data_for_edit_form_ITVF]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Retrieves the de-normalised data for a document and linked file or files, or file, for a given form. ਀ⴀⴀ 一漀琀攀 琀栀愀琀 椀昀  愀 氀椀猀琀 椀搀 昀漀爀 攀砀愀洀瀀氀攀 攀砀椀猀琀猀 椀渀 琀栀攀 昀漀爀洀 琀愀戀氀攀 愀最愀椀渀猀琀 愀 昀漀爀洀 椀搀 戀甀琀 琀栀攀爀攀 椀猀 
-- no corresponding link between that list id and the given document id then਀ⴀⴀ 渀漀 漀甀琀瀀甀琀 爀攀挀漀爀搀 眀椀氀氀 戀攀 爀攀琀甀爀渀攀搀 昀漀爀 琀栀愀琀 昀漀爀洀 爀攀挀漀爀搀⸀   
-- This function differs from [internal].[ufn_SEL_one_dc_data_by_frm_ITVF] in that it includes the multi-select fields.  ਀ⴀⴀ 䤀琀 椀猀 甀猀攀搀 昀漀爀 最攀渀攀爀愀琀椀渀最 愀 昀漀爀洀 爀愀琀栀攀爀 琀栀愀渀 愀 琀眀漀ⴀ搀椀洀攀渀猀椀漀渀愀氀 琀愀戀氀攀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 挀漀渀琀愀椀渀攀搀 挀漀搀攀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀椀猀 昀甀渀挀琀椀漀渀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开搀愀琀愀开昀漀爀开攀搀椀琀开昀漀爀洀开䤀吀嘀䘀崀  
(਀    䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
    @fileid bigint,਀    䀀昀漀爀洀椀搀 戀椀最椀渀琀 
)਀刀䔀吀唀刀一匀 吀䄀䈀䰀䔀 
AS਀刀䔀吀唀刀一 
(਀    圀䤀吀䠀 䐀漀挀䐀愀琀愀 䄀匀 ⠀ 
        -- Document related queries਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL					    AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䘀爀攀攀 吀攀砀琀✀ऀ    䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.doc_free_text_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name		AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL						AS attr_id, ਀ऀऀऀ   瘀愀氀⸀琀攀砀琀开瘀愀氀甀攀ऀऀऀ䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_free_text_field_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON        form.doc_free_text_name_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
        INNER JOIN doc_attr.doc_free_text_values AS val ਀ऀऀ       伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
			      =     val.doc_free_text_name_id ਀ऀऀऀऀ  䄀一䐀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
        ਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL					    AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䐀甀琀礀 䘀甀渀挀琀椀漀渀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.general_field_name_id AS field_name_id, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开椀搀         䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.name		    AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   list.function_id 		AS attr_id, ਀ऀऀऀ   氀椀猀琀⸀渀愀洀攀 ऀऀऀ    䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
       FROM forms.form_doc_function_links AS form਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
              ON        form.general_field_name_id਀                 㴀 昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
       INNER JOIN people.doc_to_function_links AS links਀              伀一  昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                  =   links.general_field_name_id਀             䄀一䐀 氀椀渀欀猀⸀搀漀挀开椀搀 
                 = @documentid਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 氀椀猀琀 
              ON  links.function_id਀                 㴀 氀椀猀琀⸀昀甀渀挀琀椀漀渀开椀搀 
       WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
        ਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL					    AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䘀甀渀挀琀椀漀渀 䰀椀猀琀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.general_field_name_id AS field_name_id, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀    䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.name		    AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   list.function_list_id    AS attr_id, ਀ऀऀऀ   氀椀猀琀⸀渀愀洀攀 ऀऀऀ    䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
       FROM forms.form_doc_function_list_links AS form਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
              ON        form.general_field_name_id਀                 㴀 昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
       INNER JOIN people.doc_to_function_list_links AS links਀              伀一  昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                  =   links.general_field_name_id਀             䄀一䐀 氀椀渀欀猀⸀搀漀挀开椀搀 
                 = @documentid਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 氀椀猀琀 
              ON  links.function_list_id਀                 㴀 氀椀猀琀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
       WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
        ਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL					    AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 倀攀漀瀀氀攀 䰀椀猀琀✀   䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.general_field_name_id AS field_name_id, ਀ऀऀऀ   氀椀猀琀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀    䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.name		    AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   list.people_list_id    AS attr_id, ਀ऀऀऀ   氀椀猀琀⸀渀愀洀攀 ऀऀऀ    䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
       FROM forms.form_doc_people_list_links AS form਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
              ON        form.general_field_name_id਀                 㴀 昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
       INNER JOIN people.doc_to_people_list_links AS links਀              伀一  昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                  =   links.general_field_name_id਀             䄀一䐀 氀椀渀欀猀⸀搀漀挀开椀搀 
                 = @documentid਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 氀椀猀琀 
              ON  links.people_list_id਀                 㴀 氀椀猀琀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
       WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Date' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.doc_date_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               CONVERT(NVARCHAR(30), val.date_value, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀ 
               ) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN doc_attr.doc_date_field_names AS fieldname ਀ऀऀ       伀一 昀漀爀洀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
        INNER JOIN doc_attr.doc_date_values AS val ਀ऀऀ       伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 瘀愀氀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 䄀一䐀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Doc Radio Button Attributes' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.doc_radiob_list_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   attr.attr_name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN doc_attr.doc_radio_button_list_names AS fieldname ਀ऀऀ  伀一 昀漀爀洀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
        INNER JOIN doc_attr.doc_radio_button_links AS links ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 氀椀渀欀猀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀一䐀 氀椀渀欀猀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        LEFT JOIN doc_attr.doc_radio_button_attributes AS attr ਀ऀऀ  伀一 氀椀渀欀猀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Doc Multi-Select Attributes' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.doc_ms_list_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   attr.attr_name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN doc_attr.doc_multi_select_list_names AS fieldname ਀ऀऀ       伀一        昀漀爀洀⸀搀漀挀开洀猀开氀椀猀琀开椀搀  
			      = fieldname.doc_ms_list_id਀        䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
			   ON   fieldname.doc_ms_list_id ਀ऀऀऀ       㴀    氀椀渀欀猀⸀搀漀挀开洀猀开氀椀猀琀开椀搀  
			  AND  links.doc_id ਀ऀऀऀ      㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        LEFT JOIN doc_attr.doc_multi_select_attributes AS attr ਀ऀऀ       伀一  氀椀渀欀猀⸀搀漀挀开洀猀开愀琀琀爀开椀搀  
			      = attr.doc_ms_attr_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
		 SELECT @documentid AS doc_id,਀ऀऀऀऀ一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ 
				'Doc Common Objects Multi-Sel Attr' AS field_type,਀ऀऀऀऀ昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
				links.common_object_list_id AS record_field_name_id,਀ऀऀऀऀ昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
				fieldname.mnem AS field_mnemonic,਀ऀऀऀऀ愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ 
				attr.object_name AS attr_value,਀ऀऀऀऀ一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ 
				form.position AS form_position,਀ऀऀऀऀ昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
				form.attribute1, form.attribute2, form.attribute3਀ऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
		 LEFT JOIN com_obj.common_object_list_names AS fieldname਀ऀऀऀ    伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
				   = fieldname.common_object_list_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
			    ON fieldname.common_object_list_id ਀ऀऀऀऀ   㴀   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			   AND  links.doc_id ਀ऀऀऀ       㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		 LEFT JOIN com_obj.common_object_lists AS list਀ऀऀऀ    伀一      昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				   =    list.common_object_list_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 愀琀琀爀 
			    ON  links.common_object_id  ਀ऀऀऀऀ   㴀 愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
		 WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀 䌀漀洀洀漀渀 伀戀樀攀挀琀猀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.common_object_list_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.list_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   attr.common_object_id AS attr_id, ਀ऀऀऀ   愀琀琀爀⸀漀戀樀攀挀琀开渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN com_obj.common_object_list_names AS fieldname ਀ऀऀ       伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			      = fieldname.common_object_list_id਀        䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON fieldname.common_object_list_id ਀ऀऀऀ      㴀   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			   AND  links.doc_id ਀ऀऀऀ       㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        LEFT JOIN com_obj.common_object_lists AS list ਀ऀऀ       伀一 昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			      =    list.common_object_list_id਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 愀琀琀爀  
		       ON   links.common_object_id ਀ऀऀऀ      㴀 愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
            WHERE form.form_id ਀ऀऀऀ      㴀   䀀昀漀爀洀椀搀  
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Integer' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.doc_int_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ 䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀椀渀琀开瘀愀氀甀攀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               uom.unit AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_integer_field_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		  ON form.doc_int_name_id = fieldname.doc_int_name_id਀        䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		  ON fieldname.doc_int_name_id = val.doc_int_name_id AND val.doc_id = @documentid਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
		  ON fieldname.unit_id = uom.unit_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䐀甀琀礀 䘀甀渀挀琀椀漀渀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               gfn.general_field_name_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   gfn.name AS field_name,਀               最昀渀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   fieldname.function_id AS attr_id, ਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_function_links AS form਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀  
		       ON  form.general_field_name_id਀ऀऀऀ      㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        INNER JOIN people.doc_to_function_links AS links ਀ऀऀ       伀一 氀椀渀欀猀⸀搀漀挀开椀搀 㴀  䀀搀漀挀甀洀攀渀琀椀搀 
			  AND     gfn.general_field_name_id਀ऀऀऀ      㴀 氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        LEFT JOIN people.duty_functions AS fieldname ਀ऀऀ       伀一       氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开椀搀  
			      = fieldname.function_id਀ 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Duty Function List' AS field_type,਀               最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ   
			   links.function_list_id AS record_field_name_id,਀ऀऀऀ   最昀渀⸀渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               gfn.mnem AS field_mnemonic,  ਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fieldname.name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
		LEFT JOIN people.general_field_names AS gfn ਀ऀऀ       伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = gfn.general_field_name_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON links.doc_id =  @documentid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.function_list_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document People List' AS field_type,਀               最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ   
			   links.people_list_id AS record_field_name_id,਀ऀऀऀ   最昀渀⸀渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               gfn.mnem AS field_mnemonic, ਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fieldname.name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀    
		LEFT JOIN people.general_field_names AS gfn ਀ऀऀ       伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = gfn.general_field_name_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON links.doc_id =  @documentid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.people_list_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document User Field' AS field_type,਀               最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ   
			   links.sid_id AS record_field_name_id,਀ऀऀऀ   最昀渀⸀渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               gfn.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fieldname.username AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀    
		LEFT JOIN people.general_field_names AS gfn ਀ऀऀ       伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = gfn.general_field_name_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON links.doc_id =  @documentid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.sid_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀猀椀搀开椀搀 
        WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ 
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 刀攀愀氀 一甀洀戀攀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.doc_real_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀爀攀愀氀开瘀愀氀甀攀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               uom.unit AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_real_number_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		  ON form.doc_real_name_id = fieldname.doc_real_name_id਀        䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		  ON fieldname.doc_real_name_id = val.doc_real_name_id AND val.doc_id = @documentid਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
		  ON fieldname.unit_id = uom.unit_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               dil.transaction_group_id AS field_name_id, ਀ऀऀऀ   搀椀氀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Transaction Group' AS field_name,਀               ✀䐀吀䜀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   dil.transaction_group_id AS attr_id, ਀ऀऀऀ   ⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 搀椀氀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀⤀ ⬀ ✀ ⴀ ✀ ⬀ 䰀䔀䘀吀⠀琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀Ⰰ ㈀㔀⤀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_transaction_grp_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀  
		       ON dil.doc_id = @documentid਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀 䄀匀 琀最 
		       ON  dil.transaction_group_id਀ऀऀऀ      㴀 琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document ID Lock Status' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䤀䐀 䰀漀挀欀 匀琀愀琀甀猀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DIDLS' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   dil.lock_status AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.document_id_list AS dil ON dil.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Created' AS field_name,਀               ✀䐀䌀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀椀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_created_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 伀一 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䈀礀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Created By' AS field_name,਀               ✀䐀䌀䈀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               搀椀氀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_created_by_nm_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 伀一 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Created By User ID' AS field_name,਀               ✀䐀䌀䈀匀䤀䐀䤀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 搀椀氀⸀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_created_by_id_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 伀一 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䌀漀洀洀攀渀琀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Comments' AS field_name,਀               ✀䐀䈀䌀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   戀氀⸀挀漀洀洀攀渀琀猀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_comnts_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䐀愀琀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Date' AS field_name,਀               ✀䐀䈀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER')਀               ⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM [forms].[form_doc_booking_date_links] AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䤀䐀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking ID' AS field_name,਀               ✀䐀䈀唀䤀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 戀氀⸀戀漀漀欀椀渀最开椀搀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_id_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 刀攀氀攀愀猀攀 一甀洀戀攀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Release Number' AS field_name,਀               ✀䐀䈀刀一✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   戀氀⸀爀攀氀攀愀猀攀开渀甀洀戀攀爀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_release_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 匀琀愀琀甀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Status' AS field_name,਀               ✀䐀䈀匀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   戀氀⸀戀漀漀欀椀渀最开猀琀愀琀甀猀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_status_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking User ID' AS field_name,਀               ✀䐀䈀唀䤀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 戀氀⸀甀猀攀爀开椀搀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_user_id_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Username' AS field_name,਀               ✀䐀䈀唀一✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   戀氀⸀猀礀猀琀攀洀开甀猀攀爀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_status_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀ 
਀ 
    ),਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
    FileData AS (਀        ⴀⴀ 䘀椀氀攀 爀攀氀愀琀攀搀 焀甀攀爀椀攀猀 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Free Text' AS field_type,਀               昀漀爀洀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.file_free_text_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   val.text_value AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN file_attr.file_free_text_field_names AS fieldname ਀ऀऀ  伀一 昀漀爀洀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
        INNER JOIN file_attr.file_free_text_values AS val ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 瘀愀氀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
     UNION ALL਀         
        SELECT @documentid				AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀                  䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Duty Function'     AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   list.function_id         AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀ऀऀ    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem			AS field_mnemonic, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开椀搀 ऀऀ䄀匀 愀琀琀爀开椀搀Ⰰ  
			   list.name 			    AS attr_value,਀               一唀䰀䰀ऀऀऀऀऀऀ䄀匀 甀渀椀琀猀Ⰰ  
			   form.position			AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
       LEFT JOIN people.general_field_names AS fieldname਀              伀一        昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                 = fieldname.general_field_name_id਀       䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
              ON  fieldname.general_field_name_id਀                  㴀   氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
             AND links.file_id਀                 㴀 䀀昀椀氀攀椀搀 
       LEFT JOIN people.duty_functions AS list਀              伀一  氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开椀搀 
                 = list.function_id਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀         
        SELECT @documentid				AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀                  䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Function List'     AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   list.function_list_id    AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀ऀऀ    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem			AS field_mnemonic, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀    䄀匀 愀琀琀爀开椀搀Ⰰ  
			   list.name 			    AS attr_value,਀               一唀䰀䰀ऀऀऀऀऀऀ䄀匀 甀渀椀琀猀Ⰰ  
			   form.position			AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
       LEFT JOIN people.general_field_names AS fieldname਀              伀一        昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                 = fieldname.general_field_name_id਀       䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
              ON  fieldname.general_field_name_id਀                  㴀   氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
             AND links.file_id਀                 㴀 䀀昀椀氀攀椀搀 
       LEFT JOIN people.function_list_names AS list਀              伀一  氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
                 = list.function_list_id਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀         
        SELECT @documentid				AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀                  䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File People List'       AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   list.people_list_id    AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀ऀऀ    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem			AS field_mnemonic, ਀ऀऀऀ   氀椀猀琀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀    䄀匀 愀琀琀爀开椀搀Ⰰ  
			   list.name 			    AS attr_value,਀               一唀䰀䰀ऀऀऀऀऀऀ䄀匀 甀渀椀琀猀Ⰰ  
			   form.position			AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
       LEFT JOIN people.general_field_names AS fieldname਀              伀一        昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                 = fieldname.general_field_name_id਀       䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
              ON  fieldname.general_field_name_id਀                  㴀   氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
             AND links.file_id਀                 㴀 䀀昀椀氀攀椀搀 
       LEFT JOIN people.people_list_names AS list਀              伀一  氀椀渀欀猀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
                 = list.people_list_id਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Date' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.file_date_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               CONVERT(NVARCHAR(30), val.date_value, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀ 
               ) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN file_attr.file_date_field_names AS fieldname ਀ऀऀ  伀一 昀漀爀洀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
        INNER JOIN file_attr.file_date_values AS val ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 瘀愀氀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Radio Button Attributes' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.file_radiob_list_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   attr.attr_name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ 昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_radio_button_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		  ON form.file_radiob_list_id = fieldname.file_radiob_list_id਀        䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		  ON fieldname.file_radiob_list_id = links.file_radiob_list_id AND links.file_id = @fileid਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀  
		  ON links.file_radiob_attr_id = attr.file_radiob_attr_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.file_ms_list_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   attr.file_ms_attr_id AS attr_id, ਀ऀऀऀ   愀琀琀爀⸀愀琀琀爀开渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN file_attr.file_multi_select_list_names AS fieldname ਀ऀऀ       伀一        昀漀爀洀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀  
			      = fieldname.file_ms_list_id਀        䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON  fieldname.file_ms_list_id ਀ऀऀऀ      㴀    氀椀渀欀猀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀  
			  AND links.file_id = @fileid਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀  
		       ON  links.file_ms_attr_id ਀ऀऀऀ      㴀 愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
			 SELECT @documentid AS doc_id,਀ऀऀऀऀऀ䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ 
					'File Common Objects Multi-Sel Attr' AS field_type,਀ऀऀऀऀऀ昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
					links.common_object_list_id AS record_field_name_id,਀ऀऀऀऀऀ昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
					fieldname.mnem AS field_mnemonic,਀ऀऀऀऀऀ愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ 
					attr.object_name AS attr_value,਀ऀऀऀऀऀ一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ 
					form.position AS form_position,਀ऀऀऀऀऀ昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
					form.attribute1, form.attribute2, form.attribute3਀ऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
			 LEFT JOIN com_obj.common_object_list_names AS fieldname਀ऀऀऀऀ    伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
					   = fieldname.common_object_list_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
				    ON fieldname.common_object_list_id ਀ऀऀऀऀऀ   㴀   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
				   AND links.file_id = @fileid਀ऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 氀椀猀琀 
				    ON   form.common_object_list_id ਀ऀऀऀऀऀ   㴀 氀椀猀琀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			 LEFT JOIN com_obj.common_objects AS attr਀ऀऀऀऀ    伀一  氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
					   = attr.common_object_id਀ऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Common Objects Radio Button Attr' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.common_object_list_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   attr.object_name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN com_obj.common_object_list_names AS fieldname ਀ऀऀ        伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				   = fieldname.common_object_list_id਀         䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		        ON fieldname.common_object_list_id ਀ऀऀऀऀ   㴀   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			   AND links.file_id਀ऀऀऀ       㴀 䀀昀椀氀攀椀搀 
        LEFT JOIN com_obj.common_object_lists AS list ਀ऀऀ        伀一   昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				   = list.common_object_list_id਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 愀琀琀爀  
		        ON  links.common_object_id ਀ऀऀऀऀ   㴀 愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
             WHERE form.form_id ਀ऀऀऀ       㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Integer' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.file_int_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), val.int_value) AS attr_value,਀               甀漀洀⸀甀渀椀琀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN file_attr.file_integer_field_names AS fieldname ਀ऀऀ  伀一 昀漀爀洀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
        INNER JOIN file_attr.file_integer_values AS val ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 瘀愀氀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        LEFT JOIN base.units_of_measure AS uom ਀ऀऀ  伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀 㴀 甀漀洀⸀甀渀椀琀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Duty Function' AS field_type,਀               最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.function_id AS record_field_name_id,਀ऀऀऀ   最昀渀⸀渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               gfn.mnem AS field_mnemonic, ਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀昀甀渀挀琀椀漀渀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fieldname.name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
		LEFT JOIN people.general_field_names AS gfn ਀ऀऀ       伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = gfn.general_field_name_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON links.file_id =  @fileid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.function_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀昀甀渀挀琀椀漀渀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Duty Function List' AS field_type,਀               最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.function_list_id AS record_field_name_id,਀ऀऀऀ   最昀渀⸀渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               gfn.mnem AS field_mnemonic,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fieldname.name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
		LEFT JOIN people.general_field_names AS gfn ਀ऀऀ       伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = gfn.general_field_name_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON links.file_id =  @fileid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.function_list_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File People List' AS field_type,਀               最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   links.people_list_id AS record_field_name_id,਀ऀऀऀ   最昀渀⸀渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               gfn.mnem AS field_mnemonic,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fieldname.name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
		LEFT JOIN people.general_field_names AS gfn ਀ऀऀ       伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = gfn.general_field_name_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON links.file_id =  @fileid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.people_list_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
        WHERE form.form_id = @formid਀ऀऀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File User Field' AS field_type,਀               最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ   
			   links.sid_id AS record_field_name_id,਀ऀऀऀ   最昀渀⸀渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               gfn.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fieldname.username AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀    
		LEFT JOIN people.general_field_names AS gfn ਀ऀऀ       伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = gfn.general_field_name_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON links.file_id =  @fileid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.sid_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀猀椀搀开椀搀 
        WHERE form.form_id = @formid਀ 
਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 刀攀愀氀 一甀洀戀攀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.file_real_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀爀攀愀氀开瘀愀氀甀攀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               uom.unit AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_real_number_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		  ON form.file_real_name_id = fieldname.file_real_name_id਀        䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		  ON fieldname.file_real_name_id = val.file_real_name_id AND val.file_id = @fileid਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
		  ON fieldname.unit_id = uom.unit_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Filename' AS field_name,਀               ✀䘀椀氀攀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   昀洀⸀昀椀氀攀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_name_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀  
		       ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䌀漀渀琀攀渀琀 䠀愀猀栀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Content Hash' AS field_name,਀               ✀䘀䌀䠀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   猀礀猀⸀昀渀开瘀愀爀戀椀渀琀漀栀攀砀猀琀爀⠀昀洀⸀挀漀渀琀攀渀琀开栀愀猀栀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_content_hash_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Transaction Group' AS field_type,਀               昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   fm.transaction_group_id AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'FTG' AS field_mnemonic, ਀ऀऀऀ   昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   (CONVERT(NVARCHAR(10), fm.transaction_group_id) + ' - ' + LEFT(tg.transaction_group_note, 25)) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.file_metadata AS fm ON fm.file_id = @fileid਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀 䄀匀 琀最 
		       ON  fm.transaction_group_id਀ऀऀऀ      㴀 琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Size' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 匀椀稀攀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'Size' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), fm.file_size) AS attr_value,਀               ✀䈀✀ 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.file_metadata AS fm ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䌀爀攀愀琀攀搀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Created' AS field_name,਀               ✀䘀䌀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀ       䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀洀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_created_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Created By' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'FCB' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
		       fm.created_by_username AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        INNER JOIN base.file_metadata AS fm ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Created By User ID' AS field_name,਀               ✀䘀䌀䈀唀䤀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀ       䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 昀洀⸀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_created_by_id_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
    )਀    匀䔀䰀䔀䌀吀 ⨀ 䘀刀伀䴀 䐀漀挀䐀愀琀愀 
    UNION ALL਀    匀䔀䰀䔀䌀吀 ⨀ 䘀刀伀䴀 䘀椀氀攀䐀愀琀愀 
਀ 
)਀䜀伀 
/****** Object:  UserDefinedFunction [internal].[ufn_SEL_one_dc_data_by_frm_ITVF]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Retrieves the de-normalised data for a document and linked file or files, or file, for a given form. ਀ⴀⴀ 一漀琀攀 琀栀愀琀 椀昀  愀 氀椀猀琀 椀搀 昀漀爀 攀砀愀洀瀀氀攀 攀砀椀猀琀猀 椀渀 琀栀攀 昀漀爀洀 琀愀戀氀攀 愀最愀椀渀猀琀 愀 昀漀爀洀 椀搀 戀甀琀 琀栀攀爀攀 椀猀 
-- no corresponding link between that list id and the given document id then਀ⴀⴀ 渀漀 漀甀琀瀀甀琀 爀攀挀漀爀搀 眀椀氀氀 戀攀 爀攀琀甀爀渀攀搀 昀漀爀 琀栀愀琀 昀漀爀洀 爀攀挀漀爀搀⸀   
-- Multi-select type attributes are not included because they cannot be readily included in a two-dimensional table.਀ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀猀 愀爀攀 爀攀琀爀椀攀瘀攀搀 瘀椀愀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀甀洀攀渀琀开搀攀琀愀椀氀猀崀 愀渀搀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀崀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 挀漀渀琀愀椀渀攀搀 挀漀搀攀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀椀猀 昀甀渀挀琀椀漀渀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀崀  
(਀    䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
    @fileid bigint,਀    䀀昀漀爀洀椀搀 戀椀最椀渀琀 
)਀刀䔀吀唀刀一匀 吀䄀䈀䰀䔀 
AS਀刀䔀吀唀刀一 
(਀    圀䤀吀䠀 䐀漀挀䐀愀琀愀 䄀匀 ⠀ 
        -- Document related queries਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL					    AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䘀爀攀攀 吀攀砀琀✀ऀ    䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.doc_free_text_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name		AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL						AS attr_id, ਀ऀऀऀ   瘀愀氀⸀琀攀砀琀开瘀愀氀甀攀ऀऀऀ䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_free_text_field_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON        form.doc_free_text_name_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
        LEFT JOIN doc_attr.doc_free_text_values AS val ਀ऀऀ       伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
			      =     val.doc_free_text_name_id ਀ऀऀऀऀ  䄀一䐀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀         
        SELECT @documentid				AS doc_id, ਀ऀऀऀ   一唀䰀䰀ऀऀऀऀऀ    䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Duty Function' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   list.function_id         AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀ऀऀ    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem			AS field_mnemonic, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开椀搀 ऀऀ䄀匀 愀琀琀爀开椀搀Ⰰ  
			   list.name 			    AS attr_value,਀               一唀䰀䰀ऀऀऀऀऀऀ䄀匀 甀渀椀琀猀Ⰰ  
			   form.position			AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
       LEFT JOIN people.general_field_names AS fieldname਀              伀一        昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                 = fieldname.general_field_name_id਀       䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
              ON  fieldname.general_field_name_id਀                  㴀   氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
             AND links.doc_id਀                 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
       LEFT JOIN people.duty_functions AS list਀              伀一  氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开椀搀 
                 = list.function_id਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀         
        SELECT @documentid				AS doc_id, ਀ऀऀऀ   一唀䰀䰀ऀऀऀऀऀ    䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Function List' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   list.function_list_id    AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀ऀऀ    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem			AS field_mnemonic, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀    䄀匀 愀琀琀爀开椀搀Ⰰ  
			   list.name 			    AS attr_value,਀               一唀䰀䰀ऀऀऀऀऀऀ䄀匀 甀渀椀琀猀Ⰰ  
			   form.position			AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
       LEFT JOIN people.general_field_names AS fieldname਀              伀一        昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                 = fieldname.general_field_name_id਀       䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
              ON  fieldname.general_field_name_id਀                  㴀   氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
             AND links.doc_id਀                 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
       LEFT JOIN people.function_list_names AS list਀              伀一  氀椀渀欀猀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
                 = list.function_list_id਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀         
        SELECT @documentid				AS doc_id, ਀ऀऀऀ   一唀䰀䰀ऀऀऀऀऀ    䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document People List'   AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   list.people_list_id    AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀渀愀洀攀ऀऀ    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem			AS field_mnemonic, ਀ऀऀऀ   氀椀猀琀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀    䄀匀 愀琀琀爀开椀搀Ⰰ  
			   list.name 			    AS attr_value,਀               一唀䰀䰀ऀऀऀऀऀऀ䄀匀 甀渀椀琀猀Ⰰ  
			   form.position			AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
       LEFT JOIN people.general_field_names AS fieldname਀              伀一        昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                 = fieldname.general_field_name_id਀       䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
              ON  fieldname.general_field_name_id਀                  㴀   氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
             AND links.doc_id਀                 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
       LEFT JOIN people.people_list_names AS list਀              伀一  氀椀渀欀猀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
                 = list.people_list_id਀       圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document User Field' AS field_type,਀               最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ   
			   links.sid_id AS record_field_name_id,਀ऀऀऀ   最昀渀⸀渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               gfn.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   fieldname.username AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀    
		LEFT JOIN people.general_field_names AS gfn ਀ऀऀ       伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = gfn.general_field_name_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON links.doc_id =  @documentid਀ऀऀऀ  䄀一䐀     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			      = links.general_field_name_id਀        䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 昀椀攀氀搀渀愀洀攀  
		       ON       links.sid_id ਀ऀऀऀ      㴀 昀椀攀氀搀渀愀洀攀⸀猀椀搀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Date' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.doc_date_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               CONVERT(NVARCHAR(30), val.date_value, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀ 
               ) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN doc_attr.doc_date_field_names AS fieldname ਀ऀऀ       伀一        昀漀爀洀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
                  = fieldname.doc_date_name_id਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
		       ON  fieldname.doc_date_name_id ਀                  㴀      瘀愀氀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
              AND val.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.doc_radiob_list_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   attr.doc_radiob_attr_id AS attr_id, ਀ऀऀऀ   愀琀琀爀⸀愀琀琀爀开渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_radio_button_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
          ON        form.doc_radiob_list_id ਀             㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
        LEFT JOIN doc_attr.doc_radio_button_links AS links ਀          伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
             = links.doc_radiob_list_id ਀         䄀一䐀 氀椀渀欀猀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        LEFT JOIN doc_attr.doc_radio_button_attributes AS attr ਀          伀一  氀椀渀欀猀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀   
             = attr.doc_radiob_attr_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀 䌀漀洀洀漀渀 伀戀樀攀挀琀猀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.common_object_list_id AS field_name_id, ਀ऀऀऀ   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.list_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   attr.common_object_id AS attr_id, ਀ऀऀऀ   愀琀琀爀⸀漀戀樀攀挀琀开渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN com_obj.common_object_list_names AS fieldname ਀ऀऀ       伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			      = fieldname.common_object_list_id਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 氀椀猀琀  
		       ON fieldname.common_object_list_id ਀ऀऀऀ      㴀    氀椀猀琀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        LEFT JOIN com_obj.common_objects AS attr ਀ऀऀ       伀一   氀椀猀琀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			      = attr.common_object_id਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		       ON fieldname.common_object_list_id ਀ऀऀऀ      㴀   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
            WHERE form.form_id ਀ऀऀऀ      㴀   䀀昀漀爀洀椀搀  
		      AND links.doc_id ਀ऀऀऀ      㴀    䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䤀渀琀攀最攀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.doc_int_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, CONVERT(NVARCHAR(10), val.int_value) AS attr_value,਀               甀漀洀⸀甀渀椀琀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN doc_attr.doc_integer_field_names AS fieldname ਀          伀一        昀漀爀洀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀  
             = fieldname.doc_int_name_id਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
          ON fieldname.doc_int_name_id ਀             㴀     瘀愀氀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀  
         AND val.doc_id = @documentid਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
          ON fieldname.unit_id ਀             㴀     甀漀洀⸀甀渀椀琀开椀搀 
        WHERE form.form_id = @formid਀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id,਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Real Number' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.doc_real_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), val.real_value) AS attr_value,਀               甀漀洀⸀甀渀椀琀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN doc_attr.doc_real_number_field_names AS fieldname ਀          伀一        昀漀爀洀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
             = fieldname.doc_real_name_id਀        䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
          ON fieldname.doc_real_name_id ਀             㴀     瘀愀氀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
         AND val.doc_id = @documentid਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
          ON fieldname.unit_id ਀             㴀     甀漀洀⸀甀渀椀琀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Transaction Group' AS field_type,਀               搀椀氀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   dil.transaction_group_id AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DTG' AS field_mnemonic, ਀ऀऀऀ   搀椀氀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   (CONVERT(NVARCHAR(10), dil.transaction_group_id) + ' - ' + LEFT(tg.transaction_group_note, 25)) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN base.document_id_list AS dil ਀ऀऀ       伀一 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		LEFT JOIN base.transaction_groups AS tg਀ऀऀ       伀一  搀椀氀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
			      = tg.transaction_group_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䤀䐀 䰀漀挀欀 匀琀愀琀甀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document ID Lock Status' AS field_name,਀               ✀䐀䤀䐀䰀匀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   搀椀氀⸀氀漀挀欀开猀琀愀琀甀猀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_lock_status_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀  
               ON dil.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Created' AS field_name,਀               ✀䐀䌀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀椀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_created_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀  
               ON dil.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'Document Created By' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䈀礀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'DCB' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               dil.created_by_username AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN base.document_id_list AS dil ਀               伀一 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Created By User ID' AS field_name,਀               ✀䐀䌀䈀唀䤀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 搀椀氀⸀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_created_by_id_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀  
               ON dil.doc_id = @documentid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䌀漀洀洀攀渀琀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Comments' AS field_name,਀               ✀䐀䈀䌀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   戀氀⸀挀漀洀洀攀渀琀猀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_comnts_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䐀愀琀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Date' AS field_name,਀               ✀䐀䈀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀               䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀Ⰰ  
                    (SELECT date_style FROM base.global_settings_groups WHERE setting_group_name = 'MASTER')਀               ⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM [forms].[form_doc_booking_date_links] AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䤀䐀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking ID' AS field_name,਀               ✀䐀䈀唀䤀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 戀氀⸀戀漀漀欀椀渀最开椀搀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_id_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 刀攀氀攀愀猀攀 一甀洀戀攀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Release Number' AS field_name,਀               ✀䐀䈀刀一✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   戀氀⸀爀攀氀攀愀猀攀开渀甀洀戀攀爀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_release_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 匀琀愀琀甀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Status' AS field_name,਀               ✀䐀䈀匀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   戀氀⸀戀漀漀欀椀渀最开猀琀愀琀甀猀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_status_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking User ID' AS field_name,਀               ✀䐀䈀唀䤀䐀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 戀氀⸀甀猀攀爀开椀搀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_user_id_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   NULL AS file_id, ਀ऀऀऀ   ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Document Booking Username' AS field_name,਀               ✀䐀䈀唀一✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   戀氀⸀猀礀猀琀攀洀开甀猀攀爀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_doc_booking_status_links AS form਀        䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 伀一 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
        WHERE form.form_id = @formid਀ऀऀ  䄀一䐀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid)਀ 
਀ 
਀ 
    ),਀ 
    --===================================================================================਀    䘀椀氀攀䐀愀琀愀 䄀匀 ⠀ 
        -- File related queries਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䘀爀攀攀 吀攀砀琀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               form.file_free_text_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   瘀愀氀⸀琀攀砀琀开瘀愀氀甀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_free_text_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
               ON        form.file_free_text_name_id ਀                  㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
        LEFT JOIN file_attr.file_free_text_values AS val ਀               伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
                  =     val.file_free_text_name_id ਀              䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀  
                  =  @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀      唀一䤀伀一 䄀䰀䰀 
        ਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid                  AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䐀甀琀礀 䘀甀渀挀琀椀漀渀✀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.general_field_name_id AS field_name_id, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开椀搀         䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.name		    AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   list.function_id 		AS attr_id, ਀ऀऀऀ   氀椀猀琀⸀渀愀洀攀 ऀऀऀ    䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
       FROM forms.form_file_function_links AS form਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
              ON        form.general_field_name_id਀                 㴀 昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
       INNER JOIN people.file_to_function_links AS links਀              伀一  昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                  =   links.general_field_name_id਀             䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 
                 = @fileid਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 氀椀猀琀 
              ON  links.function_id਀                 㴀 氀椀猀琀⸀昀甀渀挀琀椀漀渀开椀搀 
       WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
        ਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid                  AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䘀甀渀挀琀椀漀渀 䰀椀猀琀✀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.general_field_name_id AS field_name_id, ਀ऀऀऀ   氀椀猀琀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀    䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.name		    AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   list.function_list_id    AS attr_id, ਀ऀऀऀ   氀椀猀琀⸀渀愀洀攀 ऀऀऀ    䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
       FROM forms.form_file_function_list_links AS form਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
              ON        form.general_field_name_id਀                 㴀 昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
       INNER JOIN people.file_to_function_list_links AS links਀              伀一  昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                  =   links.general_field_name_id਀             䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 
                 = @fileid਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 氀椀猀琀 
              ON  links.function_list_id਀                 㴀 氀椀猀琀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
       WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
        ਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀ䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid                  AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 倀攀漀瀀氀攀 䰀椀猀琀✀       䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.general_field_name_id AS field_name_id, ਀ऀऀऀ   氀椀猀琀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀    䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.name		    AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀ऀऀऀ䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   list.people_list_id    AS attr_id, ਀ऀऀऀ   氀椀猀琀⸀渀愀洀攀 ऀऀऀ    䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL						AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀ऀऀऀ䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
       FROM forms.form_file_people_list_links AS form਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
              ON        form.general_field_name_id਀                 㴀 昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
       INNER JOIN people.file_to_people_list_links AS links਀              伀一  昀椀攀氀搀渀愀洀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
                  =   links.general_field_name_id਀             䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 
                 = @fileid਀       䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 氀椀猀琀 
              ON  links.people_list_id਀                 㴀 氀椀猀琀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
       WHERE form.form_id = @formid਀ 
		਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 唀猀攀爀 䘀椀攀氀搀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               gfn.general_field_name_id AS field_name_id,  ਀ऀऀऀ   氀椀渀欀猀⸀猀椀搀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   gfn.name AS field_name,਀               最昀渀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀甀猀攀爀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_user_links AS form   ਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀  
		       ON  form.general_field_name_id਀ऀऀऀ      㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        INNER JOIN people.file_to_user_links AS links ਀ऀऀ       伀一 氀椀渀欀猀⸀昀椀氀攀开椀搀 㴀  䀀昀椀氀攀椀搀 
			  AND     gfn.general_field_name_id਀ऀऀऀ      㴀 氀椀渀欀猀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
        LEFT JOIN user_restr.sid_list AS fieldname ਀ऀऀ       伀一       氀椀渀欀猀⸀猀椀搀开椀搀  
			      = fieldname.sid_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Date' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.file_date_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
               CONVERT(NVARCHAR(30), val.date_value, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀ 
               ) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN file_attr.file_date_field_names AS fieldname ਀               伀一        昀漀爀洀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
                  = fieldname.file_date_name_id਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
               ON fieldname.file_date_name_id ਀                  㴀     瘀愀氀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
              AND val.file_id ਀                  㴀  䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Radio Button Attributes' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.file_radiob_list_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   attr.attr_name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ 昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_radio_button_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
               ON        form.file_radiob_list_id ਀                  㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
        LEFT JOIN file_attr.file_radio_button_links AS links ਀               伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
                  =   links.file_radiob_list_id ਀              䄀一䐀 氀椀渀欀猀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        LEFT JOIN file_attr.file_radio_button_attributes AS attr ਀               伀一  氀椀渀欀猀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
                  = attr.file_radiob_attr_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Common Objects Radio Button Attr' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   links.common_object_list_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   attr.object_name AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN com_obj.common_object_list_names AS fieldname ਀ऀऀ        伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
				   = fieldname.common_object_list_id਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 氀椀猀琀  
		        ON fieldname.common_object_list_id ਀ऀऀऀऀ   㴀    氀椀猀琀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        LEFT JOIN com_obj.common_objects AS attr ਀ऀऀ        伀一   氀椀猀琀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
				   = attr.common_object_id਀        䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 氀椀渀欀猀  
		        ON fieldname.common_object_list_id ਀ऀऀऀऀ   㴀   氀椀渀欀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
        WHERE links.file_id = @fileid AND form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Integer' AS field_type,਀               昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   val.file_int_name_id AS record_field_name_id,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               fieldname.mnem AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), val.int_value) AS attr_value,਀               甀漀洀⸀甀渀椀琀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   昀漀爀洀⸀洀愀渀搀愀琀漀爀礀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN file_attr.file_integer_field_names AS fieldname ਀               伀一        昀漀爀洀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
                  = fieldname.file_int_name_id਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀  
               ON fieldname.file_int_name_id ਀                  㴀     瘀愀氀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
              AND val.file_id = @fileid਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
               ON fieldname.unit_id ਀                  㴀     甀漀洀⸀甀渀椀琀开椀搀 
        WHERE form.form_id = @formid਀ 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 刀攀愀氀 一甀洀戀攀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fieldname.file_real_name_id AS field_name_id, ਀ऀऀऀ   瘀愀氀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   fieldname.attr_name AS field_name,਀               昀椀攀氀搀渀愀洀攀⸀洀渀攀洀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀爀攀愀氀开瘀愀氀甀攀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               uom.unit AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_real_number_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀  
               ON        form.file_real_name_id ਀                  㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
        LEFT JOIN file_attr.file_real_number_values AS val ਀               伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
                  =     val.file_real_name_id ਀              䄀一䐀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        LEFT JOIN base.units_of_measure AS uom ਀               伀一 昀椀攀氀搀渀愀洀攀⸀甀渀椀琀开椀搀  
                  =     uom.unit_id਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'Filename' AS field_name,਀               ✀䘀椀氀攀渀愀洀攀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   昀洀⸀昀椀氀攀渀愀洀攀 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_name_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀  
               ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 䌀漀渀琀攀渀琀 䠀愀猀栀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               NULL AS field_name_id, ਀ऀऀऀ   一唀䰀䰀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Content Hash' AS field_name,਀               ✀䘀䌀䠀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   NULL AS attr_id, ਀ऀऀऀ   猀礀猀⸀昀渀开瘀愀爀戀椀渀琀漀栀攀砀猀琀爀⠀昀洀⸀挀漀渀琀攀渀琀开栀愀猀栀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   NULL, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_content_hash_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀  
               ON fm.file_id = @fileid਀        圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀        匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 䄀匀 搀漀挀开椀搀Ⰰ  
			   @fileid AS file_id, ਀ऀऀऀ   ✀䘀椀氀攀 吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
               fm.transaction_group_id AS field_name_id, ਀ऀऀऀ   昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䄀匀 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			   'File Transaction Group' AS field_name,਀               ✀䘀吀䜀✀ 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			   fm.transaction_group_id AS attr_id, ਀ऀऀऀ   ⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀⤀ ⬀ ✀ ⴀ ✀ ⬀ 䰀䔀䘀吀⠀琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀Ⰰ ㈀㔀⤀⤀ 䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ 
               NULL AS units, ਀ऀऀऀ   昀漀爀洀⸀瀀漀猀椀琀椀漀渀 䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ  
			   form.mandatory, form.length,਀               昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㄀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ 昀漀爀洀⸀愀琀琀爀椀戀甀琀攀㌀ 
        FROM forms.form_file_transactn_grp_links AS form਀        䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀  
               ON fm.file_id = @fileid਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀 䄀匀 琀最 
		       ON   fm.transaction_group_id਀ऀऀऀ      㴀 琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Size' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 匀椀稀攀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'Size' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
			   CONVERT(NVARCHAR(10), fm.file_size) AS attr_value,਀               ✀䈀✀ 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN base.file_metadata AS fm ਀               伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Created' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 䌀爀攀愀琀攀搀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'FC' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
		       CONVERT(NVARCHAR(30), fm.created, 120) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN base.file_metadata AS fm ਀               伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Created By' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'FCB' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
		       fm.created_by_username AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN base.file_metadata AS fm ਀               伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
        UNION ALL਀ 
        SELECT @documentid AS doc_id, ਀ऀऀऀ   䀀昀椀氀攀椀搀 䄀匀 昀椀氀攀开椀搀Ⰰ  
			   'File Created By User ID' AS field_type,਀               一唀䰀䰀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			   NULL AS record_field_name_id,਀ऀऀऀ   ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀ 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
               'FCBUID' AS field_mnemonic, ਀ऀऀऀ   一唀䰀䰀 䄀匀 愀琀琀爀开椀搀Ⰰ  
		       CONVERT(NVARCHAR(10), fm.created_by_sid_id) AS attr_value,਀               一唀䰀䰀 䄀匀 甀渀椀琀猀Ⰰ  
			   form.position AS form_position, ਀ऀऀऀ   一唀䰀䰀Ⰰ 昀漀爀洀⸀氀攀渀最琀栀Ⰰ 
               form.attribute1, form.attribute2, form.attribute3਀        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
        LEFT JOIN base.file_metadata AS fm ਀               伀一 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
        WHERE form.form_id = @formid਀ 
    )਀    匀䔀䰀䔀䌀吀 ⨀ 䘀刀伀䴀 䐀漀挀䐀愀琀愀 
    WHERE @documentid IS NOT NULL਀    唀一䤀伀一 䄀䰀䰀 
    SELECT * FROM FileData਀    圀䠀䔀刀䔀 䀀昀椀氀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
)਀䜀伀 
/****** Object:  Table [xref].[file_to_document_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[transaction_group_id] [bigint] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开搀漀挀开氀椀渀欀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[doc_group_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀⠀ 
	[doc_group_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_group_name] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[doc_group_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀搀漀挀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开最爀漀甀瀀开氀椀渀欀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[doc_group_view_permissions]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀崀⠀ 
	[doc_group_id] [bigint] NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  UserDefinedFunction [internal].[ufn_SEL_files_permission_filtr_ITVF]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Filters files to ensure that only those that the user has viewing rights to are presented. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 䘀唀一䌀吀䤀伀一 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀崀  
(	਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 嘀䄀刀䈀䤀一䄀刀夀⠀㄀　　⤀ 
)਀刀䔀吀唀刀一匀 吀䄀䈀䰀䔀 
AS਀刀䔀吀唀刀一 
SELECT DISTINCT fm.file_id AS file_id਀         䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
		WHERE ਀ऀऀऀⴀⴀ 䤀渀挀氀甀搀攀 椀昀 琀栀攀爀攀 愀爀攀 渀漀 瀀攀爀洀椀猀猀椀漀渀猀 搀攀昀椀渀攀搀 昀漀爀 愀渀礀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀 
			NOT EXISTS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀 昀洀㈀⸀昀椀氀攀开椀搀 
				FROM base.file_metadata AS fm2਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 昀琀搀氀 
					   ON fm2.file_id = ftdl.file_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
					   ON ftdl.doc_id = dgl.doc_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
					   ON dgl.doc_group_id = dgn.doc_group_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
					   ON dgn.doc_group_id = dgvp.doc_group_id਀ऀऀऀऀ圀䠀䔀刀䔀 昀洀㈀⸀昀椀氀攀开椀搀 㴀 昀洀⸀昀椀氀攀开椀搀 
				  AND dgvp.sid_id IS NOT NULL਀ऀऀऀ⤀ 
਀ऀऀऀ伀刀 
਀ऀऀऀⴀⴀ 䤀渀挀氀甀搀攀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 攀砀瀀氀椀挀椀琀氀礀 瀀攀爀洀椀琀琀攀搀 漀渀 愀渀礀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀 
			EXISTS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀 昀洀㌀⸀昀椀氀攀开椀搀 
				FROM base.file_metadata AS fm3਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 昀琀搀氀 
					   ON fm3.file_id = ftdl.file_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
					   ON ftdl.doc_id = dgl.doc_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
					   ON dgl.doc_group_id = dgn.doc_group_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
					   ON dgn.doc_group_id = dgvp.doc_group_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
					   ON dgvp.sid_id = sl.sid_id਀ऀऀऀऀ圀䠀䔀刀䔀 昀洀㌀⸀昀椀氀攀开椀搀 㴀 昀洀⸀昀椀氀攀开椀搀 
				  AND sl.sid = @connectedusersid਀ऀऀऀ⤀㬀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  唀猀攀爀䐀攀昀椀渀攀搀䘀甀渀挀琀椀漀渀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䄀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 昀漀爀 搀漀挀甀洀攀渀琀猀 琀漀 攀渀猀甀爀攀 琀栀愀琀 漀渀氀礀 搀漀挀甀洀攀渀琀猀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 愀爀攀 瀀爀攀猀攀渀琀攀搀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE FUNCTION [internal].[ufn_SEL_docs_permission_filtr_ITVF] ਀⠀ऀ 
    @connectedusersid VARBINARY(100)਀⤀ 
RETURNS TABLE਀䄀匀 
RETURN  ਀    匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 搀椀氀⸀搀漀挀开椀搀 䄀匀 搀漀挀开椀搀 
    FROM base.document_id_list AS dil਀    圀䠀䔀刀䔀  
        -- Include if there are no group view permissions at all਀        一伀吀 䔀堀䤀匀吀匀 ⠀ 
            SELECT dil2.doc_id਀            䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀㈀ 
            LEFT JOIN xref.doc_group_links AS dgl਀                   伀一 搀椀氀㈀⸀搀漀挀开椀搀 㴀 搀最氀⸀搀漀挀开椀搀 
            LEFT JOIN xref.doc_group_names AS dgn਀                   伀一 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
            LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀                   伀一 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
            WHERE dil2.doc_id = dil.doc_id਀              䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
        )਀ 
        OR਀ 
        -- Include if the connected user SID is explicitly permitted਀        䔀堀䤀匀吀匀 ⠀ 
            SELECT dil3.doc_id਀            䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀㌀ 
            LEFT JOIN xref.doc_group_links AS dgl਀                   伀一 搀椀氀㌀⸀搀漀挀开椀搀 㴀 搀最氀⸀搀漀挀开椀搀 
            LEFT JOIN xref.doc_group_names AS dgn਀                   伀一 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
            LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀                   伀一 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
            LEFT JOIN user_restr.sid_list AS sl਀                   伀一 搀最瘀瀀⸀猀椀搀开椀搀 㴀 猀氀⸀猀椀搀开椀搀 
            WHERE dil3.doc_id = dil.doc_id਀              䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
        );਀䜀伀 
/****** Object:  Table [base].[booked_in_files]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀戀漀漀欀攀搀开椀渀开昀椀氀攀猀崀⠀ 
	[booking_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[booked_date] [datetime2](7) NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开戀漀漀欀攀搀开椀渀开昀椀氀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀戀漀漀欀椀渀最开椀搀崀 䄀匀䌀Ⰰ 
	[file_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[culture_codes]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀挀甀氀琀甀爀攀开挀漀搀攀猀崀⠀ 
	[culture_code] [nchar](10) NOT NULL,਀ऀ嬀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_culture_codes] PRIMARY KEY CLUSTERED ਀⠀ 
	[culture_code] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[datetime_styles]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀⠀ 
	[datetime_style] [int] NOT NULL,਀ऀ嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀戀愀猀攀崀⸀嬀攀甀氀愀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [base].[eula](਀ऀ嬀攀甀氀愀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[document_name] [nvarchar](100) NULL,਀ऀ嬀爀攀氀攀愀猀攀开渀甀洀戀攀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　⤀ 一唀䰀䰀Ⰰ 
	[language_code] [nvarchar](10) NULL,਀ऀ嬀琀椀琀氀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　　⤀ 一唀䰀䰀Ⰰ 
	[doc_content] [nvarchar](max) NULL,਀ऀ嬀攀昀昀攀挀琀椀瘀攀开昀爀漀洀崀 嬀搀愀琀攀崀 一唀䰀䰀Ⰰ 
	[status] [nvarchar](20) NULL,਀ऀ嬀挀爀攀愀琀攀搀开愀琀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[change_notes] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开攀甀氀愀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀攀甀氀愀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开搀攀氀攀琀攀开氀漀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [base].[file_delete_log](਀ऀ嬀瀀椀洀愀爀礀开欀攀礀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[date_time] [datetime2](7) NOT NULL,਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[filename] [nvarchar](255) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀㔀⤀ 一唀䰀䰀Ⰰ 
	[created_by_sid_id] [bigint] NULL,਀ऀ嬀挀爀攀愀琀攀搀开眀栀攀渀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[deleted_by_username] [nvarchar](255) NOT NULL,਀ऀ嬀搀攀氀攀琀攀搀开戀礀开猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_delete_log] PRIMARY KEY CLUSTERED ਀⠀ 
	[pimary_key] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[file_plain_text_content]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀崀⠀ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_plain_text_content] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[file_read_log]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开爀攀愀搀开氀漀最崀⠀ 
	[primary_key] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀搀愀琀攀开琀椀洀攀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀㔀㔀⤀ 一唀䰀䰀Ⰰ 
	[read_by_username] [nvarchar](255) NOT NULL,਀ऀ嬀爀攀愀搀开戀礀开猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_read_log] PRIMARY KEY CLUSTERED ਀⠀ 
	[primary_key] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [base].[file_storage]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开猀琀漀爀愀最攀崀⠀ 
	[file_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀昀椀氀攀开最甀椀搀崀 嬀甀渀椀焀甀攀椀搀攀渀琀椀昀椀攀爀崀 刀伀圀䜀唀䤀䐀䌀伀䰀  一伀吀 一唀䰀䰀Ⰰ 
	[file_content] [varbinary](max) FILESTREAM  NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开猀琀漀爀愀最攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] FILESTREAM_ON [filestream_filegroup],਀ 䌀伀一匀吀刀䄀䤀一吀 嬀唀儀开开昀椀氀攀开猀琀漀开开㐀䌀䔀㈀㐀㈀㜀㔀㤀䐀䐀䄀㜀㄀䄀㌀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开最甀椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 䘀䤀䰀䔀匀吀刀䔀䄀䴀开伀一 嬀昀椀氀攀猀琀爀攀愀洀开昀椀氀攀最爀漀甀瀀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [base].[file_thumbnails](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[thumbnail] [varbinary](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开琀栀甀洀戀渀愀椀氀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [com_obj].[common_object_attributes](਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [doc_attr].[doc_ms_attr_fgroup_links](਀ऀ嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[filter_group_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开洀猀开愀琀琀爀开最爀漀甀瀀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[filter_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [doc_attr].[doc_radiob_attr_fgroup_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[doc_radiob_attr_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_radiob_attr_fgroup_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_radiob_attr_id] ASC,਀ऀ嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [file_attr].[file_ms_attr_fgroup_links](਀ऀ嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[filter_group_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[filter_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [file_attr].[file_radiob_attr_fgroup_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀⠀ 
	[file_radiob_attr_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_radiob_attr_fgroup_link] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_radiob_attr_id] ASC,਀ऀ嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[filter_groups](਀ऀ嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_filter_group] PRIMARY KEY CLUSTERED ਀⠀ 
	[filter_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_booking_usernm_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_booking_username] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_doc_com_obj_ms_defaults]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_list_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_doc_multi_sel_defaults](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[doc_ms_list_id] [bigint] NOT NULL,਀ऀ嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_doc_multi_sel_defaults] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_ms_attr_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_com_obj_ms_defaults]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[common_object_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[common_object_list_id] ASC,਀ऀ嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_file_multi_sel_defaults](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_ms_list_id] [bigint] NOT NULL,਀ऀ嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_multi_sel_defaults] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC,਀ऀ嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[file_ms_attr_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_file_retention_date_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀氀攀渀最琀栀崀 嬀猀洀愀氀氀椀渀琀崀 一唀䰀䰀Ⰰ 
	[position] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㄀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute2] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㌀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_form_file_retention_date] PRIMARY KEY CLUSTERED ਀⠀ 
	[form_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_group_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀崀⠀ 
	[form_group_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开最爀漀甀瀀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开最爀漀甀瀀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_identifier_names](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[form_group_id] [bigint] NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[form_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_tag_defaults](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[tag_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[tag_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_tag_fields]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开昀椀攀氀搀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开琀愀最开昀椀攀氀搀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开搀攀昀愀甀氀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [forms].[form_tag_group_defaults](਀ऀ嬀昀漀爀洀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[tag_group_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开琀愀最开最爀漀甀瀀开搀攀昀愀甀氀琀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀Ⰰ 
	[tag_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [forms].[form_tag_group_fields]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开昀椀攀氀搀猀崀⠀ 
	[form_id] [bigint] NOT NULL,਀ऀ嬀洀愀渀搀愀琀漀爀礀崀 嬀渀挀栀愀爀崀⠀㌀⤀ 一唀䰀䰀Ⰰ 
	[length] [smallint] NULL,਀ऀ嬀瀀漀猀椀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute1] [nvarchar](50) NULL,਀ऀ嬀愀琀琀爀椀戀甀琀攀㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attribute3] [nvarchar](50) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开最爀漀甀瀀开昀椀攀氀搀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀洀攀猀猀愀最椀渀最崀⸀嬀氀愀渀最甀愀最攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [messaging].[language_list](਀ऀ嬀氀愀渀最甀愀最攀开椀搀崀 嬀渀挀栀愀爀崀⠀㈀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[language_name_english] [varchar](50) NULL,਀ऀ嬀氀愀渀最甀愀最攀开渀愀洀攀开氀愀渀最甀愀最攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_language_list] PRIMARY KEY CLUSTERED ਀⠀ 
	[language_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [messaging].[message_details]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀⠀ 
	[message_id] [nvarchar](20) NOT NULL,਀ऀ嬀氀愀渀最甀愀最攀开椀搀崀 嬀渀挀栀愀爀崀⠀㈀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[message_text] [nvarchar](200) NOT NULL,਀ऀ嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[message_category] [nvarchar](50) NULL਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [messaging].[message_id_list](਀ऀ嬀洀攀猀猀愀最攀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[message_description] [nvarchar](max) NULL,਀ऀ嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_message_id_list] PRIMARY KEY CLUSTERED ਀⠀ 
	[message_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[duty_function_sid_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀崀⠀ 
	[function_id] [bigint] NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开甀猀攀爀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀甀渀挀琀椀漀渀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[function_lists]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀猀崀⠀ 
	[function_list_id] [bigint] NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[function_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [people].[people_lists]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀猀崀⠀ 
	[people_list_id] [bigint] NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开瀀攀漀瀀氀攀开氀椀猀琀猀开㄀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [tagging].[doc_tags]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀⠀ 
	[tag_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[tag_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_tag] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [tagging].[tag_browsing_tree_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀⠀ 
	[tag_browsing_tree_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_browsing_tree_names] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_browsing_tree_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [tagging].[tag_browsing_tree_nodes]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀⠀ 
	[browsing_tree_node_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[tag_id] [bigint] NOT NULL,਀ऀ嬀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀崀 嬀栀椀攀爀愀爀挀栀礀椀搀崀 一唀䰀䰀Ⰰ 
	[invert_tag] [bit] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [tagging].[tag_group_identifier_names](਀ऀ嬀琀愀最开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀琀愀最开最爀漀甀瀀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_group_identifier] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [tagging].[tag_to_document_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀⠀ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀琀愀最开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[tag_doc_link_id] [bigint] IDENTITY(1,1) NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开搀漀挀开氀椀渀欀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开搀漀挀开氀椀渀欀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [tagging].[tag_to_tag_group_links](਀ऀ嬀琀愀最开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[tag_group_id] [bigint] NOT NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开琀漀开琀愀最最爀漀甀瀀开氀椀渀欀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开椀搀崀 䄀匀䌀Ⰰ 
	[tag_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [tagging].[tag_tree_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀⠀ 
	[tag_tree_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开琀爀攀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开琀爀攀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [tagging].[tag_tree_nodes](਀ऀ嬀琀愀最开琀爀攀攀开渀漀搀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[tag_tree_id] [bigint] NOT NULL,਀ऀ嬀琀愀最开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[tag_tree_hierarchyid] [hierarchyid] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开琀爀攀攀开渀漀搀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开琀爀攀攀开渀漀搀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [user_restr].[authoriser_privilege_requests](਀ऀ嬀爀攀焀甀攀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀甀猀攀爀渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
	[type] [nvarchar](20) NOT NULL,਀ऀ嬀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[approved_by_username_1] [nvarchar](128) NULL,਀ऀ嬀愀瀀瀀爀漀瘀攀搀开漀渀开㄀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[approved_by_sid_id_2] [bigint] NULL,਀ऀ嬀愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㈀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
	[approved_on_2] [datetime2](7) NULL,਀ऀ嬀猀琀愀琀甀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㈀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_authoriser_privilege_requests] PRIMARY KEY CLUSTERED ਀⠀ 
	[request_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[authorisers]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀猀崀⠀ 
	[authoriser_sid_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_authorisers] PRIMARY KEY CLUSTERED ਀⠀ 
	[authoriser_sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[controller_doc_group_sid_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀崀⠀ 
	[controller_doc_group_name_id] [bigint] NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[controller_file_grp_sid_links]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀崀⠀ 
	[controller_file_group_name_id] [bigint] NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[doc_group_edit_perm_funct_lst]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀⠀ 
	[doc_group_id] [bigint] NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀椀漀渀开氀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[function_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[doc_group_edit_perm_people_lst]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀崀⠀ 
	[doc_group_id] [bigint] NOT NULL,਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[people_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[file_group_edit_perm_funct_lst]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀⠀ 
	[file_group_id] [bigint] NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[function_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[file_group_edit_perm_ppl_lst]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀崀⠀ 
	[file_group_id] [bigint] NOT NULL,਀ऀ嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[people_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[form_group_owners]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀崀⠀ 
	[form_group_id] [bigint] NOT NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开昀漀爀洀开漀眀渀攀爀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀漀爀洀开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[sid_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[role_list]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀爀漀氀攀开氀椀猀琀崀⠀ 
	[role_name] [nvarchar](50) NOT NULL,਀ऀ嬀爀漀氀攀开搀攀猀挀爀椀瀀琀椀漀渀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_role_list] PRIMARY KEY CLUSTERED ਀⠀ 
	[role_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[tag_br_tree_permissions_flist]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀⠀ 
	[tag_browsing_tree_id] [bigint] NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_br_tree_permissions_flist] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_browsing_tree_id] ASC,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [user_restr].[tag_br_tree_permissions_plist](਀ऀ嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[people_list_id] [bigint] NOT NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀 䄀匀䌀Ⰰ 
	[people_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[tag_group_permissions_flist]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀⠀ 
	[tag_group_id] [bigint] NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_group_permissions_flist] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_group_id] ASC,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [user_restr].[tag_group_permissions_plist](਀ऀ嬀琀愀最开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[people_list_id] [bigint] NOT NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开最爀漀甀瀀开椀搀崀 䄀匀䌀Ⰰ 
	[people_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[tag_tree_permissions_flist]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀⠀ 
	[tag_tree_id] [bigint] NOT NULL,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_tag_tree_permissions_flist] PRIMARY KEY CLUSTERED ਀⠀ 
	[tag_tree_id] ASC,਀ऀ嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [user_restr].[tag_tree_permissions_plist](਀ऀ嬀琀愀最开琀爀攀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[people_list_id] [bigint] NOT NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开琀爀攀攀开椀搀崀 䄀匀䌀Ⰰ 
	[people_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [user_restr].[user_privilege_revoke_log]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最崀⠀ 
	[primary_key] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀瀀爀椀瘀椀氀攀最攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[privilege_name] [nvarchar](50) NULL,਀ऀ嬀猀椀搀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[username] [nvarchar](128) NULL,਀ऀ嬀最爀愀渀琀攀搀开漀渀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[granted_by] [nvarchar](128) NULL,਀ऀ嬀爀攀瘀漀欀攀搀开漀渀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[revoked_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀瀀爀椀洀愀爀礀开欀攀礀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开爀漀氀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [user_restr].[user_role_link](਀ऀ嬀爀漀氀攀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[sid_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀最爀愀渀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_user_role_link] PRIMARY KEY CLUSTERED ਀⠀ 
	[role_name] ASC,਀ऀ嬀猀椀搀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_instances].[workflow_instance_definitions](਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[present_step_id] [bigint] NULL,਀ऀ嬀挀爀攀愀琀攀开搀愀琀攀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[notes] [nvarchar](max) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_instances].[workflow_track_log](਀ऀ嬀眀昀开氀漀最开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[wf_log_index_id] [bigint] NOT NULL,਀ऀ嬀爀攀挀漀爀搀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[field_type] [nvarchar](50) NULL,਀ऀ嬀昀椀攀氀搀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[field_mnemonic] [nvarchar](10) NULL,਀ऀ嬀昀椀攀氀搀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[attr_id] [bigint] NULL,਀ऀ嬀愀琀琀爀开洀渀攀洀漀渀椀挀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NULL,਀ऀ嬀氀漀渀最开琀攀砀琀开瘀愀氀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[step_order] [int] NULL,਀ऀ嬀攀搀最攀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
	[to_node_id] [bigint] NULL,਀ऀ嬀爀甀氀攀开瘀愀氀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
	[date_val] [datetime2](7) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀眀昀开氀漀最开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开椀渀搀攀砀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [workflow_instances].[workflow_track_log_index](਀ऀ嬀眀昀开氀漀最开椀渀搀攀砀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[create_date] [datetime2](7) NOT NULL,਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[triggered_by] [nvarchar](50) NOT NULL,਀ऀ嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[model_name] [nvarchar](50) NULL,਀ऀ嬀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_workflow_track_log_index] PRIMARY KEY CLUSTERED ਀⠀ 
	[wf_log_index_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY]਀䜀伀 
/****** Object:  Table [workflow_models].[workflow_model_names]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀崀⠀ 
	[workflow_model_id] [bigint] IDENTITY(1,1) NOT NULL,਀ऀ嬀洀渀攀洀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀　⤀ 一唀䰀䰀Ⰰ 
	[attr_name] [nvarchar](50) NOT NULL,਀ऀ嬀搀攀猀挀爀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[list_position] [int] NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开眀漀爀欀昀氀漀眀开洀漀搀攀氀开搀攀昀椀渀椀琀椀漀渀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [xref].[controller_doc_group_links](਀ऀ嬀搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[controller_doc_group_name_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_controller_doc_group_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [xref].[controller_doc_group_names](਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[created_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [xref].[controller_file_group_links](਀ऀ嬀昀椀氀攀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[controller_file_group_name_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
	[created] [datetime2](7) NULL,਀ऀ嬀挀爀攀愀琀攀搀开戀礀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㄀㈀㠀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_controller_file_group_links] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_id] ASC,਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [xref].[controller_file_group_names](਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀挀爀攀愀琀攀搀崀 嬀搀愀琀攀琀椀洀攀㈀崀⠀㜀⤀ 一唀䰀䰀Ⰰ 
	[created_by] [nvarchar](128) NULL,਀ 䌀伀一匀吀刀䄀䤀一吀 嬀倀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀 倀刀䤀䴀䄀刀夀 䬀䔀夀 䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [xref].[cross_reference_types](਀ऀ嬀砀爀攀昀开琀礀瀀攀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK__xref_type_id] PRIMARY KEY CLUSTERED ਀⠀ 
	[xref_type_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
/****** Object:  Table [xref].[doc_cross_references]    Script Date: Mon 23-03-2026 5:17:41 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀䌀刀䔀䄀吀䔀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀崀⠀ 
	[source_doc_id] [nvarchar](50) NOT NULL,਀ऀ嬀砀爀攀昀开搀漀挀开椀搀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[xref_type_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_doc_xref] PRIMARY KEY CLUSTERED ਀⠀ 
	[source_doc_id] ASC,਀ऀ嬀砀爀攀昀开搀漀挀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [xref].[file_group_links](਀ऀ嬀昀椀氀攀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 一伀吀 一唀䰀䰀Ⰰ 
	[file_id] [bigint] NOT NULL,਀ऀ嬀渀漀琀攀猀崀 嬀渀瘀愀爀挀栀愀爀崀⠀洀愀砀⤀ 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_group_link] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_group_id] ASC,਀ऀ嬀昀椀氀攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 吀䔀堀吀䤀䴀䄀䜀䔀开伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  吀愀戀氀攀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㄀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
CREATE TABLE [xref].[file_group_names](਀ऀ嬀昀椀氀攀开最爀漀甀瀀开椀搀崀 嬀戀椀最椀渀琀崀 䤀䐀䔀一吀䤀吀夀⠀㄀Ⰰ㄀⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[mnem] [nvarchar](10) NULL,਀ऀ嬀愀琀琀爀开渀愀洀攀崀 嬀渀瘀愀爀挀栀愀爀崀⠀㔀　⤀ 一伀吀 一唀䰀䰀Ⰰ 
	[descr] [nvarchar](max) NULL,਀ऀ嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀 嬀椀渀琀崀 一唀䰀䰀Ⰰ 
 CONSTRAINT [PK_file_group_details] PRIMARY KEY CLUSTERED ਀⠀ 
	[file_group_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]਀䜀伀 
INSERT [base].[culture_codes] ([culture_code], [name]) VALUES (N'de-DE     ', N'German')਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀挀甀氀琀甀爀攀开挀漀搀攀猀崀 ⠀嬀挀甀氀琀甀爀攀开挀漀搀攀崀Ⰰ 嬀渀愀洀攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀攀渀ⴀ䜀䈀     ✀Ⰰ 一✀䈀爀椀琀椀猀栀 䔀渀最氀椀猀栀✀⤀ 
INSERT [base].[culture_codes] ([culture_code], [name]) VALUES (N'en-US     ', N'US English')਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀挀甀氀琀甀爀攀开挀漀搀攀猀崀 ⠀嬀挀甀氀琀甀爀攀开挀漀搀攀崀Ⰰ 嬀渀愀洀攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀昀爀ⴀ䘀刀     ✀Ⰰ 一✀䘀爀攀渀挀栀✀⤀ 
INSERT [base].[culture_codes] ([culture_code], [name]) VALUES (N'zh-CN     ', N'Chinese Simplified')਀䜀伀 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (23, N'yyyy-mm-dd', 11)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　Ⰰ 一✀洀漀渀 搀搀 礀礀礀礀 栀栀㨀洀椀䄀䴀✀Ⰰ ㄀㈀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (101, N'mm/dd/yyyy', 5)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㈀Ⰰ 一✀礀礀礀礀⸀洀洀⸀搀搀✀Ⰰ 㐀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (103, N'dd/mm/yyyy', 3)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㐀Ⰰ 一✀搀搀⸀洀洀⸀礀礀礀礀✀Ⰰ ㄀㄀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (105, N'dd-mm-yyyy', 1)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㘀Ⰰ 一✀搀搀 洀漀渀 礀礀✀Ⰰ 㘀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (107, N'Mon dd, yyyy', 7)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　㠀Ⰰ 一✀栀栀㨀洀椀㨀猀猀✀Ⰰ ㄀㌀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (109, N'mon dd yyyy', 8)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㄀　Ⰰ 一✀洀洀ⴀ搀搀ⴀ礀礀礀礀✀Ⰰ ㈀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (111, N'yyyy/mm/dd', 9)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㄀㈀Ⰰ 一✀礀礀礀礀洀洀搀搀✀Ⰰ ㄀　⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (113, N'dd mon yyyy hh:mi:ss:mmm (24 hour)', 14)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㄀㐀Ⰰ 一✀栀栀㨀洀椀㨀猀猀㨀洀洀洀 ⠀㈀㐀ⴀ栀漀甀爀⤀✀Ⰰ ㄀㔀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (120, N'yyyy-mm-dd hh:mi:ss (24-hour)', 16)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀Ⰰ 嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㈀㄀Ⰰ 一✀礀礀礀礀ⴀ洀洀ⴀ搀搀 栀栀㨀洀椀㨀猀猀⸀洀洀洀 ⠀㈀㐀ⴀ栀漀甀爀⤀✀Ⰰ ㄀㜀⤀ 
INSERT [base].[datetime_styles] ([datetime_style], [datetime_style_name], [list_position]) VALUES (126, N'yy-mm-ddThh:mi:ss.mmm (no spaces)', 18)਀䜀伀 
SET IDENTITY_INSERT [base].[eula] ON ਀ 
INSERT [base].[eula] ([eula_id], [document_name], [release_number], [language_code], [title], [doc_content], [effective_from], [status], [created_at], [change_notes]) VALUES (1, N'EULA', N'1.0', N'EN', N'End User License Agreement', N'਀ 
END USER LICENSE AGREEMENT (EULA)਀吀栀椀猀 䔀渀搀 唀猀攀爀 䰀椀挀攀渀猀攀 䄀最爀攀攀洀攀渀琀 ⠀琀栀攀 ∀䄀最爀攀攀洀攀渀琀∀⤀ 椀猀 愀 氀攀最愀氀 愀最爀攀攀洀攀渀琀 戀攀琀眀攀攀渀 礀漀甀 ⠀攀椀琀栀攀爀 愀渀 椀渀搀椀瘀椀搀甀愀氀 漀爀 愀 猀椀渀最氀攀 攀渀琀椀琀礀⤀ 愀渀搀 匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ⠀∀䰀椀挀攀渀猀漀爀∀⤀ 爀攀最愀爀搀椀渀最 琀栀攀 甀猀攀 漀昀 琀栀攀 䔀氀礀猀攀 搀愀琀愀戀愀猀攀 ⠀琀栀攀 ∀匀漀昀琀眀愀爀攀∀⤀⸀ 䈀礀 愀挀挀攀猀猀椀渀最 漀爀 甀猀椀渀最 琀栀攀 匀漀昀琀眀愀爀攀 礀漀甀 愀最爀攀攀 琀漀 戀攀 戀漀甀渀搀 戀礀 琀栀攀 琀攀爀洀猀 漀昀 琀栀椀猀 䄀最爀攀攀洀攀渀琀⸀ 
1. Definitions਀∀ठ∀匀漀昀琀眀愀爀攀∀ 爀攀昀攀爀猀 琀漀 琀栀攀 䔀氀礀猀攀 搀愀琀愀戀愀猀攀Ⰰ 椀渀挀氀甀搀椀渀最 愀氀氀 猀挀栀攀洀愀 搀攀昀椀渀椀琀椀漀渀猀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 昀甀渀挀琀椀漀渀猀Ⰰ 愀渀搀 愀渀礀 甀瀀搀愀琀攀猀 漀爀 甀瀀最爀愀搀攀猀 瀀爀漀瘀椀搀攀搀 戀礀 琀栀攀 䰀椀挀攀渀猀漀爀⸀  ∀匀漀昀琀眀愀爀攀∀ 搀漀攀猀 渀漀琀 椀渀挀氀甀搀攀 愀渀礀 愀瀀瀀氀椀挀愀琀椀漀渀 猀漀昀琀眀愀爀攀 琀栀愀琀 洀愀礀 戀攀 甀猀攀搀 椀渀 愀猀猀漀挀椀愀琀椀漀渀 眀椀琀栀 琀栀椀猀 搀愀琀愀戀愀猀攀⸀   
•	"User" means a single human individual who accesses or uses the Software.  ਀∀ठ∀䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀∀ 洀攀愀渀猀 愀 猀椀渀最氀攀Ⰰ 昀甀渀挀琀椀漀渀愀氀氀礀 椀渀搀攀瀀攀渀搀攀渀琀 椀渀猀琀愀氀氀愀琀椀漀渀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀ᤀ猠 猀挀栀攀洀愀 漀爀 搀愀琀愀 洀漀搀攀氀 眀椀琀栀椀渀 愀 搀愀琀愀戀愀猀攀 洀愀渀愀最攀洀攀渀琀 猀礀猀琀攀洀Ⰰ 爀攀最愀爀搀氀攀猀猀 漀昀 琀栀攀 搀愀琀愀戀愀猀攀 攀渀最椀渀攀 甀猀攀搀Ⰰ 琀栀攀 猀攀爀瘀攀爀 漀爀 栀愀爀搀眀愀爀攀 椀琀 椀猀 椀渀猀琀愀氀氀攀搀 漀渀Ⰰ 漀爀 琀栀攀 攀渀瘀椀爀漀渀洀攀渀琀 ⠀攀⸀最⸀Ⰰ 瀀爀漀搀甀挀琀椀漀渀Ⰰ 猀琀愀最椀渀最Ⰰ 琀攀猀琀椀渀最Ⰰ 漀爀 搀攀瘀攀氀漀瀀洀攀渀琀⤀Ⰰ 眀栀攀爀攀 琀栀攀 猀挀栀攀洀愀 椀猀 椀渀猀琀愀渀琀椀愀琀攀搀 愀渀搀 愀挀挀攀猀猀椀戀氀攀 昀漀爀 甀猀攀⸀  䄀 渀攀眀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀 椀猀 搀攀攀洀攀搀 挀爀攀愀琀攀搀 眀栀攀渀攀瘀攀爀 琀栀攀 猀挀栀攀洀愀 漀爀 搀愀琀愀 洀漀搀攀氀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 椀渀猀琀愀氀氀攀搀 漀爀 椀渀猀琀愀渀琀椀愀琀攀搀 猀攀瀀愀爀愀琀攀氀礀 昀爀漀洀 愀渀礀 漀琀栀攀爀 椀渀猀琀愀渀挀攀Ⰰ 攀瘀攀渀 椀昀 眀椀琀栀椀渀 琀栀攀 猀愀洀攀 搀愀琀愀戀愀猀攀 猀攀爀瘀攀爀 漀爀 猀礀猀琀攀洀⸀  䄀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀 猀栀愀氀氀 渀漀琀 椀渀挀氀甀搀攀 椀渀愀挀琀椀瘀攀 戀愀挀欀甀瀀 挀漀瀀椀攀猀 漀爀 椀渀猀琀愀渀挀攀猀 甀猀攀搀 猀漀氀攀氀礀 昀漀爀 搀椀猀愀猀琀攀爀 爀攀挀漀瘀攀爀礀 瀀甀爀瀀漀猀攀猀Ⰰ 瀀爀漀瘀椀搀攀搀 琀栀攀礀 愀爀攀 渀漀琀 愀挀挀攀猀猀攀搀 挀漀渀挀甀爀爀攀渀琀氀礀 眀椀琀栀 愀渀 愀挀琀椀瘀攀 氀椀挀攀渀猀攀搀 椀渀猀琀愀渀挀攀⸀ 
•	"Single User Context" refers to the Software being used by one User at a time on a single computer or device. This includes situations where a computer may have multiple user accounts, but only one User is actively accessing the Software at any given moment.਀∀ठ∀䌀漀渀挀甀爀爀攀渀琀 唀猀攀∀ 洀攀愀渀猀 琀栀攀 匀漀昀琀眀愀爀攀 戀攀椀渀最 愀挀琀椀瘀攀氀礀 甀猀攀搀 戀礀Ⰰ 漀爀 愀挀挀攀猀猀椀戀氀攀 琀漀Ⰰ 洀漀爀攀 琀栀愀渀 漀渀攀 唀猀攀爀 愀琀 琀栀攀 猀愀洀攀 琀椀洀攀Ⰰ 爀攀最愀爀搀氀攀猀猀 漀昀 琀栀攀 渀甀洀戀攀爀 漀昀 匀漀昀琀眀愀爀攀 椀渀猀琀愀氀氀愀琀椀漀渀猀 漀爀 瀀栀礀猀椀挀愀氀 搀攀瘀椀挀攀猀⸀ 吀栀椀猀 椀渀挀氀甀搀攀猀Ⰰ 戀甀琀 椀猀 渀漀琀 氀椀洀椀琀攀搀 琀漀Ⰰ 猀椀琀甀愀琀椀漀渀猀 眀栀攀爀攀㨀 
-  Multiple individuals are logged into and interacting with the Software from different computers simultaneously.਀ⴀ  䴀甀氀琀椀瀀氀攀 椀渀搀椀瘀椀搀甀愀氀猀 愀爀攀 愀挀挀攀猀猀椀渀最 漀爀 椀渀琀攀爀愀挀琀椀渀最 眀椀琀栀 琀栀攀 匀漀昀琀眀愀爀攀 瘀椀愀 愀 猀栀愀爀攀搀 猀攀爀瘀攀爀Ⰰ 瘀椀爀琀甀愀氀 搀攀猀欀琀漀瀀 椀渀昀爀愀猀琀爀甀挀琀甀爀攀 ⠀嘀䐀䤀⤀Ⰰ 漀爀 挀氀漀甀搀 攀渀瘀椀爀漀渀洀攀渀琀 挀漀渀挀甀爀爀攀渀琀氀礀⸀ 
-  The Software is installed on a server and accessed by multiple clients or users at the same time.਀∀ठ∀䴀甀氀琀椀ⴀ唀猀攀爀 䔀渀瘀椀爀漀渀洀攀渀琀∀ 爀攀昀攀爀猀 琀漀 愀渀礀 猀攀琀甀瀀 眀栀攀爀攀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 搀攀瀀氀漀礀攀搀 漀爀 挀漀渀昀椀最甀爀攀搀 琀漀 攀渀愀戀氀攀Ⰰ 昀愀挀椀氀椀琀愀琀攀Ⰰ 漀爀 猀甀瀀瀀漀爀琀 愀挀挀攀猀猀 漀爀 甀猀攀 戀礀 洀漀爀攀 琀栀愀渀 漀渀攀 唀猀攀爀Ⰰ 眀栀攀琀栀攀爀 猀椀洀甀氀琀愀渀攀漀甀猀氀礀 漀爀 猀攀焀甀攀渀琀椀愀氀氀礀Ⰰ 昀漀爀 猀栀愀爀攀搀 漀爀 挀漀氀氀愀戀漀爀愀琀椀瘀攀 瀀甀爀瀀漀猀攀猀Ⰰ 漀爀 椀渀 愀 洀愀渀渀攀爀 琀栀愀琀 愀氀氀漀眀猀 昀漀爀 琀栀攀 瀀漀漀氀椀渀最 漀爀 猀栀愀爀椀渀最 漀昀 匀漀昀琀眀愀爀攀 昀甀渀挀琀椀漀渀愀氀椀琀礀 愀洀漀渀最 洀甀氀琀椀瀀氀攀 唀猀攀爀猀⸀ 吀栀椀猀 椀渀挀氀甀搀攀猀Ⰰ 戀甀琀 椀猀 渀漀琀 氀椀洀椀琀攀搀 琀漀Ⰰ 渀攀琀眀漀爀欀 椀渀猀琀愀氀氀愀琀椀漀渀猀Ⰰ 琀攀爀洀椀渀愀氀 猀攀爀瘀攀爀 搀攀瀀氀漀礀洀攀渀琀猀Ⰰ 漀爀 挀氀漀甀搀ⴀ戀愀猀攀搀 猀栀愀爀攀搀 椀渀猀琀愀渀挀攀猀⸀ 
•	"Production Environment" means any system, server, or configuration where the Software is used to process live data, support real-world operations, or provide services to end-users (internal or external) who are not directly involved in the development, testing, or evaluation of the Software.਀∀ठ∀一漀渀ⴀ倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀∀ 洀攀愀渀猀 愀渀礀 猀礀猀琀攀洀Ⰰ 猀攀爀瘀攀爀Ⰰ 漀爀 挀漀渀昀椀最甀爀愀琀椀漀渀 眀栀攀爀攀 琀栀攀 匀漀昀琀眀愀爀攀 椀猀 甀猀攀搀 猀漀氀攀氀礀 昀漀爀 搀攀瘀攀氀漀瀀洀攀渀琀Ⰰ 琀攀猀琀椀渀最Ⰰ 焀甀愀氀椀琀礀 愀猀猀甀爀愀渀挀攀Ⰰ 猀琀愀最椀渀最Ⰰ 搀攀洀漀渀猀琀爀愀琀椀漀渀Ⰰ 漀爀 琀爀愀椀渀椀渀最 瀀甀爀瀀漀猀攀猀Ⰰ 愀渀搀 搀漀攀猀 渀漀琀 瀀爀漀挀攀猀猀 氀椀瘀攀 搀愀琀愀 漀爀 瀀爀漀瘀椀搀攀 猀攀爀瘀椀挀攀猀 琀漀 瀀爀漀搀甀挀琀椀漀渀 攀渀搀ⴀ甀猀攀爀猀⸀ 
2. License Grants਀∀ठ㈀⸀㄀ 䔀瘀愀氀甀愀琀椀漀渀 ☀ 䐀攀瘀攀氀漀瀀洀攀渀琀 唀猀攀 䰀椀挀攀渀猀攀 ⠀䘀爀攀攀⤀㨀 吀栀攀 䰀椀挀攀渀猀漀爀 最爀愀渀琀猀 礀漀甀 愀 渀漀渀ⴀ攀砀挀氀甀猀椀瘀攀Ⰰ 渀漀渀ⴀ琀爀愀渀猀昀攀爀愀戀氀攀Ⰰ 氀椀洀椀琀攀搀 氀椀挀攀渀猀攀 琀漀 甀猀攀 琀栀攀 匀漀昀琀眀愀爀攀 昀爀攀攀 漀昀 挀栀愀爀最攀 昀漀爀 攀瘀愀氀甀愀琀椀漀渀Ⰰ 搀攀瘀攀氀漀瀀洀攀渀琀Ⰰ 琀攀猀琀椀渀最Ⰰ 焀甀愀氀椀琀礀 愀猀猀甀爀愀渀挀攀Ⰰ 猀琀愀最椀渀最Ⰰ 愀渀搀 搀攀洀漀渀猀琀爀愀琀椀漀渀 瀀甀爀瀀漀猀攀猀 漀渀氀礀⸀ 吀栀椀猀 氀椀挀攀渀猀攀 椀猀 瀀攀爀瀀攀琀甀愀氀 愀渀搀 渀漀琀 琀椀洀攀ⴀ戀漀甀渀搀⸀ 唀猀攀 甀渀搀攀爀 琀栀椀猀 氀椀挀攀渀猀攀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 愀 一漀渀ⴀ倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀 愀渀搀 洀愀礀 渀漀琀 戀攀 甀猀攀搀 昀漀爀 愀渀礀 挀漀洀洀攀爀挀椀愀氀 瀀甀爀瀀漀猀攀 漀爀 椀渀 愀 倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀⸀ 䄀渀礀 渀甀洀戀攀爀 漀昀 唀猀攀爀猀 洀愀礀 愀挀挀攀猀猀 琀栀攀 匀漀昀琀眀愀爀攀 眀椀琀栀椀渀 愀 一漀渀ⴀ倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀 昀漀爀 琀栀攀猀攀 搀攀昀椀渀攀搀 瀀甀爀瀀漀猀攀猀⸀ 吀栀椀猀 氀椀挀攀渀猀攀 搀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀 瀀攀爀ⴀ䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀 昀攀攀 昀漀爀 一漀渀ⴀ倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀猀⸀ 
•	2.2 Single-User Environment License (Free): Subject to the terms and conditions of this Agreement, the Licensor grants you a non-exclusive, non-transferable, limited license to use the Software solely for use on a single computer within a Single User Context, whether for personal or commercial use.  This license applies only when the Software is connected to one (1) Database Instance. For the avoidance of doubt, ''single computer'' means a device on which the Software is installed and accessed by one human user at a time, even if that device supports multiple user accounts or profiles. This license expressly excludes any form of Concurrent Use or use in a Multi-User Environment.਀∀ठ㈀⸀㌀ 䌀漀洀洀攀爀挀椀愀氀 ⼀ 倀爀漀搀甀挀琀椀漀渀 唀猀攀 䰀椀挀攀渀猀攀 ⠀倀愀椀搀 ⴀ 倀攀爀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀⤀㨀 䄀 猀攀瀀愀爀愀琀攀 瀀愀椀搀 氀椀挀攀渀猀攀 椀猀 爀攀焀甀椀爀攀搀 昀漀爀 愀渀礀 甀猀攀 漀昀 琀栀攀 匀漀昀琀眀愀爀攀 椀渀 愀 倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀⸀ 䘀漀爀 攀愀挀栀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀 挀漀渀渀攀挀琀攀搀 琀漀 愀渀搀 甀琀椀氀椀稀攀搀 戀礀 琀栀攀 匀漀昀琀眀愀爀攀 椀渀 愀 倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀Ⰰ 愀 搀椀猀琀椀渀挀琀 䌀漀洀洀攀爀挀椀愀氀 ⼀ 倀爀漀搀甀挀琀椀漀渀 唀猀攀 䰀椀挀攀渀猀攀 洀甀猀琀 戀攀 瀀甀爀挀栀愀猀攀搀⸀  䘀漀爀 瘀椀爀琀甀愀氀椀稀攀搀 漀爀 挀漀渀琀愀椀渀攀爀椀稀攀搀 搀攀瀀氀漀礀洀攀渀琀猀Ⰰ 攀愀挀栀 搀椀猀琀椀渀挀琀 氀漀最椀挀愀氀 搀愀琀愀戀愀猀攀 椀渀猀琀愀渀挀攀 挀漀渀猀琀椀琀甀琀攀猀 愀 猀攀瀀愀爀愀琀攀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀 愀渀搀 爀攀焀甀椀爀攀猀 愀 猀攀瀀愀爀愀琀攀 氀椀挀攀渀猀攀⸀  伀渀挀攀 愀 䌀漀洀洀攀爀挀椀愀氀 ⼀ 倀爀漀搀甀挀琀椀漀渀 唀猀攀 䰀椀挀攀渀猀攀 椀猀 愀挀焀甀椀爀攀搀 昀漀爀 愀 猀瀀攀挀椀昀椀挀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀Ⰰ 琀栀攀爀攀 愀爀攀 渀漀 爀攀猀琀爀椀挀琀椀漀渀猀 漀渀 琀栀攀 渀甀洀戀攀爀 漀昀 唀猀攀爀猀 眀栀漀 洀愀礀 挀漀渀挀甀爀爀攀渀琀氀礀 漀爀 猀攀焀甀攀渀琀椀愀氀氀礀 愀挀挀攀猀猀 愀渀搀 甀猀攀 琀栀攀 匀漀昀琀眀愀爀攀 椀渀 挀漀渀樀甀渀挀琀椀漀渀 眀椀琀栀 琀栀愀琀 氀椀挀攀渀猀攀搀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀⸀ 吀栀椀猀 氀椀挀攀渀猀攀 瀀攀爀洀椀琀猀 䌀漀渀挀甀爀爀攀渀琀 唀猀攀 愀渀搀 甀猀攀 椀渀 愀 䴀甀氀琀椀ⴀ唀猀攀爀 䔀渀瘀椀爀漀渀洀攀渀琀 昀漀爀 琀栀攀 猀瀀攀挀椀昀椀攀搀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀⸀ 吀栀攀 琀攀爀洀猀 愀渀搀 挀漀渀搀椀琀椀漀渀猀 昀漀爀 猀甀挀栀 氀椀挀攀渀猀攀猀Ⰰ 椀渀挀氀甀搀椀渀最 瀀爀椀挀椀渀最 愀渀搀 愀挀琀椀瘀愀琀椀漀渀Ⰰ 愀爀攀 愀瘀愀椀氀愀戀氀攀 愀琀 猀椀氀欀眀漀漀搀猀漀昀琀眀愀爀攀⸀挀漀洀⸀ 
3. License Restrictions਀∀ठ夀漀甀 洀愀礀 渀漀琀 甀猀攀 琀栀攀 匀漀昀琀眀愀爀攀 椀渀 愀 䌀漀渀挀甀爀爀攀渀琀 唀猀攀 倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀 漀爀 䴀甀氀琀椀ⴀ唀猀攀爀 倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀 眀椀琀栀漀甀琀 愀 瘀愀氀椀搀 䌀漀洀洀攀爀挀椀愀氀 ⼀ 倀爀漀搀甀挀琀椀漀渀 唀猀攀 䰀椀挀攀渀猀攀 ⠀瀀愀椀搀 氀椀挀攀渀猀攀⤀ 昀漀爀 攀愀挀栀 䐀愀琀愀戀愀猀攀 䤀渀猀琀愀渀挀攀 挀漀渀渀攀挀琀攀搀⸀ 
•	You may not rent, lease, lend, sell, redistribute, or sublicense the Software, except as expressly permitted by this Agreement.਀∀ठ夀漀甀 洀愀礀 渀漀琀 洀漀搀椀昀礀 漀爀 愀搀搀 琀漀 漀爀 搀攀氀攀琀攀 琀栀攀 猀挀栀攀洀愀 搀攀昀椀渀椀琀椀漀渀猀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀Ⰰ  昀甀渀挀琀椀漀渀猀Ⰰ 猀挀栀攀洀愀 攀氀攀洀攀渀琀猀Ⰰ 挀漀渀猀琀爀愀椀渀琀猀Ⰰ 琀爀椀最最攀爀猀Ⰰ 漀爀 琀愀戀氀攀 搀攀昀椀渀椀琀椀漀渀猀 琀栀愀琀 挀漀渀猀琀椀琀甀琀攀 琀栀攀 匀漀昀琀眀愀爀攀Ⰰ 攀砀挀攀瀀琀 愀猀 昀漀氀氀漀眀猀㨀 
   - You may configure SQL Server audit logging using native features, provided that no schema changes are made to the licensed database objects.਀   ⴀ 夀漀甀 洀愀礀 愀搀搀 漀爀 洀漀搀椀昀礀 椀渀搀攀砀攀猀 猀漀氀攀氀礀 昀漀爀 瀀攀爀昀漀爀洀愀渀挀攀 漀瀀琀椀洀椀稀愀琀椀漀渀 瀀甀爀瀀漀猀攀猀⸀ 
•	You may not modify or delete the contents or definitions of Extended Properties or the `eula` table.਀∀ठ夀漀甀 洀愀礀 渀漀琀 最爀愀渀琀 愀渀礀 愀瀀瀀氀椀挀愀琀椀漀渀 漀爀 猀攀爀瘀椀挀攀 搀椀爀攀挀琀 瀀攀爀洀椀猀猀椀漀渀猀 漀渀 琀栀攀 甀渀搀攀爀氀礀椀渀最 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 漀戀樀攀挀琀猀 ⠀椀渀挀氀甀搀椀渀最 琀愀戀氀攀猀Ⰰ 瘀椀攀眀猀Ⰰ 漀爀 椀渀琀攀爀渀愀氀 昀甀渀挀琀椀漀渀猀⤀⸀  
•	You may not bypass, disable, or otherwise circumvent the application role-based access control model, under which application access to data is permitted only through the execution of stored procedures via permissions granted to application roles.਀∀ठ䄀搀洀椀渀椀猀琀爀愀琀椀瘀攀 甀猀攀爀猀 洀愀礀 爀攀琀愀椀渀 猀甀昀昀椀挀椀攀渀琀 瀀爀椀瘀椀氀攀最攀猀 昀漀爀 猀礀猀琀攀洀 挀漀渀昀椀最甀爀愀琀椀漀渀 愀渀搀 洀愀椀渀琀攀渀愀渀挀攀 瀀甀爀瀀漀猀攀猀 ⠀猀甀挀栀 愀猀 猀攀琀甀瀀Ⰰ 搀愀琀愀 挀漀渀昀椀最甀爀愀琀椀漀渀Ⰰ 戀愀挀欀甀瀀猀 漀爀 瀀攀爀昀漀爀洀愀渀挀攀 琀甀渀椀渀最⤀Ⰰ 戀甀琀 琀栀攀礀 洀甀猀琀 渀漀琀 挀漀渀昀椀最甀爀攀 愀渀礀 甀猀攀爀Ⰰ 愀瀀瀀氀椀挀愀琀椀漀渀Ⰰ 漀爀 猀攀爀瘀椀挀攀 琀漀 戀礀瀀愀猀猀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 爀漀氀攀 攀渀昀漀爀挀攀洀攀渀琀 洀漀搀攀氀 搀攀猀挀爀椀戀攀搀 栀攀爀攀椀渀⸀  䄀渀礀 搀攀瘀椀愀琀椀漀渀 昀爀漀洀 琀栀椀猀 洀漀搀攀氀 挀漀渀猀琀椀琀甀琀攀猀 愀 戀爀攀愀挀栀 漀昀 琀栀椀猀 䄀最爀攀攀洀攀渀琀 愀渀搀 洀愀礀 挀漀洀瀀爀漀洀椀猀攀 琀栀攀 猀攀挀甀爀椀琀礀 昀爀愀洀攀眀漀爀欀 甀瀀漀渀 眀栀椀挀栀 琀栀攀 匀漀昀琀眀愀爀攀 爀攀氀椀攀猀⸀ 
•	You may not remove or alter any copyright, trademark, or other proprietary notices from the Software or its documentation.਀∀ठ吀栀攀 昀爀攀攀 䔀瘀愀氀甀愀琀椀漀渀 ☀ 䐀攀瘀攀氀漀瀀洀攀渀琀 唀猀攀 䰀椀挀攀渀猀攀 ⠀匀攀挀琀椀漀渀 ㈀⸀㄀⤀ 攀砀瀀氀椀挀椀琀氀礀 瀀爀漀栀椀戀椀琀猀 甀猀攀 椀渀 愀 倀爀漀搀甀挀琀椀漀渀 䔀渀瘀椀爀漀渀洀攀渀琀 昀漀爀 愀渀礀 瀀甀爀瀀漀猀攀⸀ 
•	You shall maintain an accurate, complete and up-to-date list of all Database Instances to which a paid license is applicable.  Such records shall include the environment type, database host location, and date of installation for each instance. You shall retain these records for the duration of the license term and for a period of one (1) year thereafter.  Such records shall be made available to the Licensor or authorised representative for auditing purposes.  ਀㐀⸀ 伀眀渀攀爀猀栀椀瀀 
The Software is licensed, not sold. All intellectual property rights in and to the Software, including copyrights, trademarks, and trade secrets, remain with the Licensor. You acknowledge that you do not acquire any ownership rights by downloading, installing, or using the Software.਀㔀⸀ 䐀椀猀挀氀愀椀洀攀爀 漀昀 圀愀爀爀愀渀琀礀 
THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.਀㘀⸀ 䰀椀洀椀琀愀琀椀漀渀 漀昀 䰀椀愀戀椀氀椀琀礀 
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, OR ANY LOSS OF PROFITS OR REVENUES, WHETHER INCURRED DIRECTLY OR INDIRECTLY, OR ANY LOSS OF DATA, USE, GOODWILL, OR OTHER INTANGIBLE LOSSES, RESULTING FROM (A) YOUR ACCESS TO OR USE OF OR INABILITY TO ACCESS OR USE THE SOFTWARE; (B) ANY CONDUCT OR CONTENT OF ANY THIRD PARTY ON THE SOFTWARE; (C) ANY CONTENT OBTAINED FROM THE SOFTWARE; AND (D) UNAUTHORIZED ACCESS, USE, OR ALTERATION OF YOUR TRANSMISSIONS OR CONTENT, WHETHER BASED ON WARRANTY, CONTRACT, TORT (INCLUDING NEGLIGENCE), OR ANY OTHER LEGAL THEORY, WHETHER OR NOT WE HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGE, AND EVEN IF A REMEDY SET FORTH HEREIN IS FOUND TO HAVE FAILED OF ITS ESSENTIAL PURPOSE.਀㜀⸀ 吀攀爀洀椀渀愀琀椀漀渀 
This Agreement is effective until terminated. Your rights under this Agreement will terminate automatically without notice from the Licensor if you fail to comply with any of its terms. Upon termination, you must cease all use of the Software.਀㠀⸀ 䜀漀瘀攀爀渀椀渀最 䰀愀眀 
This Agreement shall be governed by and construed in accordance with the laws of Queensland Australia.਀㤀⸀ 䔀渀琀椀爀攀 䄀最爀攀攀洀攀渀琀 
This Agreement constitutes the entire agreement between you and the Licensor regarding the Software and supersedes all prior and contemporaneous understandings, agreements, representations, and warranties, both written and oral, regarding such subject matter.਀ 
਀✀Ⰰ 䌀䄀匀吀⠀一✀㈀　㈀㘀ⴀ　㈀ⴀ㈀㌀✀ 䄀匀 䐀愀琀攀⤀Ⰰ 一✀䌀甀爀爀攀渀琀✀Ⰰ 䌀䄀匀吀⠀一✀㈀　㈀㔀ⴀ　㤀ⴀ㈀㄀吀㄀㘀㨀㐀㔀㨀㌀㤀⸀㈀㘀㠀㌀㜀㔀㠀✀ 䄀匀 䐀愀琀攀吀椀洀攀㈀⤀Ⰰ 一✀䤀渀椀琀椀愀氀 爀攀氀攀愀猀攀✀⤀ 
SET IDENTITY_INSERT [base].[eula] OFF਀䜀伀 
INSERT [base].[file_metadata] ([file_id], [filename], [content_hash], [transaction_group_id], [file_size], [created], [created_by_username], [created_by_sid_id], [retention_date]) VALUES (1000, N'What is a Controlled Document.pdf', 0x0B918F4C4E11C547317DFDAD40C680E9A6AFADA10A0EA66BBD5E83AEF6732AC7, NULL, 201541, CAST(N'2026-03-08T17:30:22.6486165' AS DateTime2), N'', 0, NULL)਀䜀伀 
INSERT [base].[file_plain_text_content] ([file_id], [plain_text_content]) VALUES (1000, N'1
FUNDAMENTALS OF CONTROLLED DOCUMENT 
MANAGEMENT
WHAT IS A CONTROLLED DOCUMENT
Controlled documents have characteristics that differentiate them from other types of 
documents. The management of these types of documents are governed by strict rules, 
often dictated by regulatory or compliance obligations. Examples of controlled documents 
include standards, procedures and policies.
The following are typical key characteristics of controlled documents.
1. Review and approval. All controlled documents are subjected to review and 
approval. A document must be formally approved before it can be released and 
used.
2. Formal issuance and withdrawal. Controlled documents are formally issued for 
use, and withdrawn from use when no longer valid. 
3. Currency status and distribution control. All controlled documents must have a 
currency status. That is, a document may have a status of current, superseded, 
obsolete or cancelled for example. Controlled documents that are no longer current 
must be withdrawn from use so that they are not inadvertently used.
4. Issue history. Different issues or releases of a controlled document must be 
uniquely identified (e.g. with a revision or version number). 
5. Directive authority. Controlled documents, such as standard operating 
procedures for example, typically carry directive authority. That is, the document 
gives instructions that must be followed.
6. Periodic review. Directive authority type controlled documents, such as 
standards, procedures and policies, must be reviewed on a periodic schedule and 
revised and re-issued as appropriate. Engineering drawings are a class of 
controlled document but are generally not subjected to review on a time-based 
schedule but are revised based on other triggers. 
7. Unique identification. Controlled documents must be uniquely identifiable. 
Generally this is via a document ID, being a string of characters, a sequence 
number or a combination thereof.
Effectively managing controlled documents requires a system specifically designed to handle 
these unique characteristics.
ESSENTIAL REQUIREMENTS OF A CONTROLLED DOCUMENT 
MANAGEMENT SYSTEM
Structure and Relationships
The characteristics of controlled documents dictate that they must be managed in a system 
which has structure. Furthermore, the management of relationships between different 
entities must be embodied within the structure. For example, the different releases of a 
particular document are all related to the same document ID. At the same time, the 
document ID must be unique. 
2
To effectively manage these relationships a robust data management platform is essential. 
Relational databases are the most appropriate platform for this purpose. A relational 
database natively enforces referential integrity and manages relationships. To effectively 
manage controlled documents in a relational database the database structure must be 
designed to mirror the real-world structure of how controlled documents must be managed.
Document Identification
A fundamental rule of controlled document management systems (CDMS) is that each 
document must be uniquely identified. The CDMS must enforce the uniqueness of each 
document ID. The most effective way to implement this requirement is via a single register 
of document IDs. Hence the first requirement of a CDMS is that it must contain a single 
register of document IDs, with an associated constraint that all entries must be unique. 
The document ID which must be unique is that which is displayed on the published 
document. Document IDs are cross-referenced in the text of documents, and they must be 
able to be readily verbally communicated and transcribed, i.e. they must be human-friendly. 
For this reason GUIDs (globally unique identifiers) are unsuitable for use as document IDs, 
even though they can be guaranteed to be unique without needing to be managed in a 
single register. The identifiers of national and international standards (e.g. ISO 9001, IEC 
60167, IEEE 1584, ANSI Z535.1) are good examples of document IDs.
Conceptually a document ID is an abstract entity separate from the files which represent the 
actual document object. With a dedicated document ID register the function of reserving 
document IDs, for example, is straightforward. There is no need to supply or create dummy 
files in order to reserve document IDs.
For various reasons (such as inflexibility, explained in more detail elsewhere) embedding 
metadata into document IDs is poor practice. The advent of relational databases many 
decades ago obviated the need to use a structured document ID as the primary means of 
searching, sorting and grouping documents. The only structure which may be applicable is 
one which indicates the namespace or originating register (e.g. ISO, IEC, IEEE, ANSI), 
ensuring its unique context. 
Despite the fact that metadata should not be embedded within a document ID, apart from 
enforcing uniqueness a CDMS should not impose constraints on the format of the document 
ID. Most organisations will use some type of document ID format. The organisation should 
be able to decide on the document ID format independently of the CDMS. The CDMS 
should also maintain only a single document ID register and not maintain a parallel or proxy 
document ID register. To guarantee that no duplicate document identifiers can be created, 
the CDMS must not maintain different registers for different document types and hence allow 
the configuration of duplicate identifiers across different registers. 
Relationship Between Documents and Files
While enforcing the uniqueness of the document ID, the CDMS must also cater for the 
relationship structure that a single document ID is related to a series of releases. Within 
each release there will typically be two renditions. For example, there will be a source file 
(e.g. .docx or .dwg) and a published file (.pdf). Theoretically, the published rendition of a 
single release may comprise multiple files, such as a main document and a separate 
appendix file in a different format. The document ID is not a metadata attribute of the file. 
The file is related to the document ID. The document ID is the parent and the file is the 
child. This logical separation of the document ID from the physical files is critical, allowing 
for flexible management of various renditions and formats over time. The CDMS must be 
3
flexible enough to handle these requirements and mirror the real-world nature of the data. 
Relational databases are specifically designed to efficiently manage these types of 
relationships. 
User Interface and Control
Document search results must be presented to end users in such a manner that users are 
not likely to inadvertently use a document which is not the latest release of a current 
document. Documents which have been cancelled, or releases which have been 
superseded, should not be presented without additional deliberate actions by the user or 
perhaps specific authorisation. The most efficient way to handle these requirements is via 
metadata.
Given that users must be able to download document files for various reasons, a strategy 
must be applied to reduce the risk of non-current documents being used. The simplest and 
most efficient strategy for ensuring that users are only referring to the current release of a 
document is to explicitly communicate on each document that the master copy resides in a 
given nominated single repository. Documents viewed through channels outside of that 
repository are defined as uncontrolled by default. Thus, the designation of what constitutes 
a ''controlled copy'' is not by what is displayed on the document, or whether or not it is 
printed, but by the user interface channel through which it is being viewed. 
Metadata
Metadata is used in a CDMS for both controlling documents and also for searching, sorting 
and grouping documents and communicating information. 
Some metadata is related to the document ID and some is related to the file. The metadata 
which is related to the document ID should only be that which does not change from one 
release to the next. For example, the title and subject matter would generally be related to 
the document ID, remaining constant across releases, while the specific release number, 
author and release date would be related to the file issued for a particular release. These 
relationships reflect the logical structure of the real-world data. The two are combined in 
search results data and the fact that they are stored separately should be invisible to the end 
user. 
Release identifiers are variously referred to as version or revision number. (Engineering 
drawing releases are generally referred to as revisions, and pre-release copies as versions, 
but the terminology is often reversed in other contexts.) Organisations will have different 
policies as to how releases are identified. While typically referred to as ''numbers'', release 
identifiers can sometimes be letters, or even dates. The CDMS should not constrain how 
release identifiers are formatted. The set of release numbers for a given document ID must 
also remain as a single unified set, for example across changes in file type of the underlying 
source files. 
Basic principles of metadata management dictate that document control metadata must be 
related to files, not embedded within the file. For example, the status of a file as current 
latest release or superseded should be by linking a reference to the file to an element in a 
lookup table. The status is changed by changing the link table without accessing or 
modifying the file, and the status is read without needing to read the file. 
In keeping with basic data structure principles, the metadata should be in a normalised 
structure. This ensures data integrity and efficiency by storing each piece of data only once, 
referencing it via keys across related tables. 
4
Storing Files
The principle of ensuring that data remains consistent with the associated files is that of 
transactional integrity. Specifically, the transactions must be ACID-compliant. Otherwise the 
data can readily become corrupted. A relational database engine can guarantee 
transactional integrity, but only if the binary content of the file is under the full control of the 
database. 
The approaches to storing files and associated metadata have evolved over time. The most 
recent development is cloud object storage. Cloud object storage offers extreme levels of 
scalability and other benefits, but has the drawback of compromising transactional integrity 
compared with frameworks where the file binary content is under the full control of the 
database. For some solution needs transactional integrity is less important. For a CDMS 
solution however the integrity of the data is critical. The prospect of users being presented 
with an obsolete document, or a sensitive and restricted document, due to data corruption 
caused by a failed transaction for example, would not be acceptable. Transactional integrity 
with cloud object storage can be managed by the application layer, but it inherently can 
never be as robust as where it is entirely managed within the relational database engine. 
Ultimately a CDMS user must be able to extract a document file from the system. As with 
document IDs, the CDMS should not constrain the user or organisation with regards to how 
extracted files are named. The filename should generally simply match that given when the 
file was uploaded.
A SHORT HISTORY OF FILE STORAGE AND RELATIONAL 
DATABASES
The binary content of files can be stored directly within a binary column within a database 
table (referred to as a Binary Large Object – BLOB). This approach tends to create 
scalability and maintainability issues however. Conversely, when file binary data is stored 
external to the database the database loses its inherent ability to guarantee transactional 
integrity. If the data is stored external to the database then the application layer must 
assume responsibility for managing transactional integrity. In 2007/8 Oracle and Microsoft 
introduced solutions to this problem with SecureFiles and FILESTREAM respectively. 
However SecureFiles and FILESTREAM still present limitations in the context of extremely 
large and distributed architectures. Hence for very large scale and distributed requirements
(e.g. petabyte scale volumes), cloud object storage (such as Azure Blob Storage, Amazon 
S3 and Google Cloud Storage) have been developed as a more cost-effective solution. 
These solutions allow multi-tenanted, centrally managed storage for any scale, small or 
large. 
The drawback of cloud object storage is that transactional integrity with an associated 
relational database must be mediated by an application layer. For solutions where 
transactional integrity is important, cloud object storage is inherently less robust in its 
integrity guarantees than options where the file binary data is under the full control of the 
relational database engine. Cloud object storage also introduces a security framework 
which is separate from and in addition to that of the relational database. All these 
challenges are manageable, but the solutions entail compromises. A security and integrity 
framework comprising an encapsulated single security model with transactional integrity fully 
assured, all within a single system without involvement of an application layer, is not 
possible with cloud object storage. However this framework is possible with a solution 
based on a relational database which retains full control of the file binary data content. 
5
Silkwood Software
March 2026')਀䜀伀 
SET IDENTITY_INSERT [base].[file_storage] ON ਀ 
INSERT [base].[file_storage] ([file_id], [file_guid], [file_content]) VALUES (1000, N'43d56ca4-29fe-4e97-8044-f4b85640f984', 0x255044462D312E370D0A25B5B5B5B50D0A312030206F626A0D0A3C3C2F547970652F436174616C6F672F50616765732032203020522F4C616E6728656E29202F53747275637454726565526F6F74203239203020522F4D61726B496E666F3C3C2F4D61726B656420747275653E3E2F4D6574616461746120313132203020522F566965776572507265666572656E63657320313133203020523E3E0D0A656E646F626A0D0A322030206F626A0D0A3C3C2F547970652F50616765732F436F756E7420352F4B6964735B203320302052203135203020522031372030205220313920302052203236203020525D203E3E0D0A656E646F626A0D0A332030206F626A0D0A3C3C2F547970652F506167652F506172656E742032203020522F5265736F75726365733C3C2F466F6E743C3C2F46312035203020522F46322039203020522F4633203131203020522F4634203133203020523E3E2F4578744753746174653C3C2F4753372037203020522F4753382038203020523E3E2F50726F635365745B2F5044462F546578742F496D616765422F496D616765432F496D616765495D203E3E2F4D65646961426F785B20302030203539352E3332203834312E39325D202F436F6E74656E74732034203020522F47726F75703C3C2F547970652F47726F75702F532F5472616E73706172656E63792F43532F4465766963655247423E3E2F546162732F532F537472756374506172656E747320303E3E0D0A656E646F626A0D0A342030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E67746820343434343E3E0D0A73747265616D0D0A789CBD1D5D6FDB46F2DD80FF031FA522A6B95C72490245012776723DE4A38D1D1487B40F3445CBBAB34547A49CFADFDFCC2CB94B8ABB8A1A7353202E25519CD9D9D9F99ED1E9D9A659DDE445E3FDFCF3E959D3E4C56DB9F03E9F5E550F7F9D5E3D3D94A7BFE5CBD53A6F56D5FAF4727BDDE05BFF2AF345B9F9E517EFE5F92BEFCBF151E007F85F9A26CC0BBC388B7D1E7A69C4FC2CF436E5F1D11F3F79EBE3A39757C747A7AF99C7981F44DED5CDF111DE1D78CC4B423F08232FC9841F7A57F770DB9BCBC45BD6F0646F49AFD2F6D59BE3A3CF336FFE9777F5EFE3A30B78E0EFC747072370AAD6FAF29DC41B9F9E047E9C22F0D08F522F8A233F4CBC00AFF19B373F1D1F791770FBEF048B2E4F2D347B59354D756F27DBEBAA6AA6245BCC3240DDE3A19FA644365A4F4B24F69D44DA032E8CFDC402CDC9964491CF04EC88F0E3187724C932FBA678A7970FF91A77E4DDAB5FCFBDE0F46DBE5E7AB3727D72F669FE7D340FBD30D825020B38D23C89B3110D5E7F7A7F7EF66E9ECC2EE627E1ECFD5CCCAECEE6F1ECEDA5373FE1B30F70F99AAE5E7D783F4F67571F3FCCF9ECEDDB8B73EFFCC3AB4FF4BDF7F0CED5F792D28E73C8B99FC22983AD4B4658BF3B7B7FF6067023A4DF01D21AFBC911E182F9825B10D959B76953D9049B0A5B1859E48F00F9C3A3EF412C9C0031BE073111FAD9F8D0FD318F66FF428E3A838B2BF847ECF52BFEB99C67F2D519BD1DCD5E491ECC6067E5BD1FBB37DEE2C55B78E7E2BCBDF7BCFB88BEF409DE79871FCB6F3E87274C4BE41C040DB72DF100DAF36998C2A6944414FB613842EC151C996A0DE7B5999F44B30D12AABA83437307EF970B78DFC3F717155C15DB39E3B37BBCA554DFA8E78CC97B6EF3398B668FA557DCE6F49C1C6F2FE8AE122FE9CD153CB7A6F7F0AAA83D80D5B45FC7478A16E00AAE6EE81F7E7D0300593853DFCB9BD283FFC92F9673C42A9979DDED72150A597A20BD94F7E355B94106A1D7A0D1E001B5BEEB8690985AEB74DB006C128FCF664BE0FB72DDC04A6ABFA303FDB9BA9DB724A497B4A81C77205F22C9CBF65B7205372093E9AA230EDC5103B5D2C16AD5AEB5F78B5D0CE8C35C6D5BE92DAB47BD8B6B7CC8426174FD343DBDA22801E16A2117E1AF39965849BE35391AA0C35361C3C3C1B213BE071EAD768BE7B3ACA7079D01C52D1CEA9DC0D345C6BCABE2F3EC85BBD3C1125CFDEEB2AB1BD8EB04A5CED4704153C68115EEF4EBCC325FD8D749524F4ACC5CC92B2D85AF9FD489938772396FB9216FE014571B388627420AB18D927C8596840F782FC94F941E45E955D728E7F19D65277E579D42989EC15045669979F16017077190117FF9DEF484E7702B8F6D84BF70002FF5456283F7773EDC93B276B0627004E1ABB623A5351DF1C8BADDFE0D087FBB0140DAE144E90F57522088FC686CAA2067AE0BC46D8B78955E4D5281787981EC4B3CBFA871652FA4F214B3874D5594683B2CB6DD1D40EC7CAD95D7032EAD3B0605FE2941FF4EBDB430E5BE60B6A51D601E466ECDC33835F932D2F2F06E90CE8A2BAAAFAD98582F3BF6C837A532E49E1E488AE577C45C62F6BFF2094D42E4186916160D6C4860360777ED1225BFD6CD8664DB3FB64DA7DFCA2800A5C12C143B602763473B09EA1BA30DB108FC2C36E96F9686245F99FF6D2485232419102F31E3F85C7DCB4DE0588C610E0BBC8FC8488F73644354B45F3B960391027CE5E50F0FF0FF4D856CF4989394100EF8290C539F596832B0BB1CA8C5904756D89FC9E9C6C386FF067AE299AE22880B9400745D6FAFE186FFCE4F62E9E2149DD1C3A29E1F53ED583E8F2863CAAFAD88912A607AEA74DC03AE48383EEAF9034005FDF2984BBE68358E033444024C604343464624E58166A4A495B3EC8063805B93C4860CFAE1DBBAF150615C976A0F6FD41ED2F6490FB6E39D27C913444D750B7A9B0317135FEE3CA6F4568DD212C0031D34BAD7236306EF22030B8F6FADB9D435C770EE1B22ABDB5A2E6A72A83CF32361833ABDC46251B807DE012A3071AC023164CBF7A9C0F0001598BA5581261C5DAA4033BCD7159CC0CD3D9D89BBEE30913AAC6BF42E73902EEB62CE403A4BABB93D63D20694E299CF6E17F8941C85FA57E5BDDE4DBE94308DC14BB42DC585D19E5AE1F51D56178A398BFC30B32DB58DDAB2E81BBA18B7A12AB6F3A12E1686F01E6CBD94AE9B796694CF64A9A306AFB724C45AA7A0176B70254BE1B8F0B16D82B2747A39CA31716281F8420564A5F690BA697A650FA6981587AFAD9F2A83BB8BCEA5CDF138AE95B2BCE9745F752FF32751AB7ADAA31BCBA0B9FEC2BAEA3EBCEBC23FCB921EDE8695A58D8390A7D75E1C56CC996DC50EED2A2E406D721BE003D458E6568D45598831A43D6A8C1FA0C6D8142964BB1E3322E9508F59E0A144DC6E3625E82A0E12AB465544AA296FB6CF8B641A71C9329FFFC0B58701185C990D5EEBAE2E503AA35F5463ACA4D5E2D75BD4DD8D8CB5A07C5FE3EB2EB00227BF0109B1A9A6D7D53C8CFDD44AA2E9753507BF24B390C8B517CD79EC33665BEBD88BC68D9AC09316F27DBAA36E9476A24CEAA3CE17E68E14557B1E13A2FBEEA20B388CE4D353A6E149B9FE3A734707134EA94BC7198E291E1B338A14DCD479166DE5BCE8C2E2B9B7A8C61B2034E9F3274F46361FC13AD6218D9D0CCEB6F62AFC5087DBB768656D06CFD4D645BD7DA0B4EEA6869B881DCAE9956E1C30EBEEF54D5B07B9BE8E71448CDA779498C070504DC7A16C1C98787182651016E06ECC3930296D8BDD74F659D1A6E476C480E859E5745FF9773E1F648E90CBDCA42BC2D88CB6F398642A95AB9964AF1CB85A09BA5AB62D3A444E7771B7E9EB0F7806EE00B321E720479B0904F4C3CE07CFB23DF0762B83264FE584FBA88B61EAC92172309A2D07CB493D09CF7C2B6F9BDCBEAE3AEA44B4B607B17DA7ABBA88833BAD1033A4CF38AE8C864EADC2BDD7036FB6EF11B3A8EF12ABB8C6A8264C38892084B1949BE655389095B1205969865757AAEE4B56E7B9CA0980E16BC74257E9392813E30C0890D940F7235CEB4A999EADA9078ED01A65CBE2B1EC022932F9A4F95CC7BF5CC5EEA328F4ADF83B485E47B11DDC21A5CB13D52E5B631E3CF583BD318FE89098C71485CC7B621E26245DC63CCCF07ED561FAE7493223E888FB8915B483A5460219D30C8E6A766556A2A9364FD26D9C5C03A5C28FB98503DD46FB19D66A59F9EABC5571E67A68174501D2203663432EB24C02B445D3D23999DE0D88FC28B661314AEDD62ADEA14B8772547FCF8BB6885ECD75176811031BC495211446A8D846698FF55C564D7DC1AC0E11E0C981930C27C186818315C758156B834749074A5734AB9B95CC3DFD399B9EDD5840A7DF8C44EB66C3AE2FFDB6607E68783AB0EC98CFADF8B8B024E57133C11BE8DFDC016CC1FD38B1ADB557F153ABEA646F1816792CF172E7E3B54A7CCA52147AD09FF379D2C51CA7AF0CE498AD3D6CCF8C768BAB26A0CEBA02264FF71646C4875857AE6A515BEBCA84A44BEBCA0C4F6A5DD41865817EE74AF299AA20D289955BAAA100FED305114F8EC27280310A05EB36BA0CCB858C0484995ACFEF237391108A9985566E23DC9C47D81F6A2155BD2D6E551D4D5E7B75E7A3EF56B26B8B066BE374F755DEAC2854E3CCF6E0202ED81871AAA55F6CE75D11E6F47BC692C017C206DFC17A1372722CF076CA0D65FC1D5FFE9DDF3FDC514FDEF4A63743D3DB82D00B27F5BF7678CE5C0B0BBC51FF800EBF14B94A993DE90E51C987BA6C18F57F978ADB36B795EA31904F96FD00CED28D51106287BF6571DF4E37F63A367BD21291DEAA164F57273EE528DC77715E22911FCBDA2381536BD9BE1DD25C368C997A79C5FE92E0414F09E9090795010CED1BDB120FB1CA1C776C601D52B237E6250EB1CADCB66C189174689559E0FD866277234B59169D8556E8EE80F21103235D3FC7F4753F146E376FD8A083717AC9294B809C6C83195E8C0D6B16785D484A0AE04249B54E006F3BC398F55AB4B510D6E20EFBD13B91501C52D2AA1A115500CC41277448F53C96B54FAF8523305543FEE3F636E2D40C6B81574BE17EEBE5B52C6971A57362E1876C0CDE680BF7BB3AE14FAF51A4A090D056711AB67722DE6BC533A60E4F07E14A81993FCBA21C586EB24AC202CF598ECF02CF929F153A78C312D9AFA58FB20ED4E4DE03EE18C8752C49945DF0B214AA90E61035EF92207030F580E1D4831F46C7288BB01FDB086F18675BBBEB4FE25188C1CE7D91B6DD5EA99D063C07D9170A6D58303B71002FC3DE0E0BBC5E9263A1E4E049A47AFE1E50FB28C5963B28546B1B402CF8F506C44C6E2EE36430EB465C60CDF0B2CD41D0181838B55453BCF41654769C0FDAC3C79D26BA4EB2C0139DD783EA48570C0F1A361D1BFFDFDFCFDAE580B6D26299DE4FE63ED89216B45DF8E5620F3C6AEF9F3EE11063EBB10524B59FAC75D87E271C40954B6A170C3DC47D45F3CD0EE2B62EBE0BC9A9A219E4E27B37E22E129C225DE6D54F2FEE2291F8DC7A0EAE9138B9AC70717706196DF8C8DE2B6E5B0BCE958A6FF38B16F82E6A7E433229CCF0AEB77DD6EDB7C2EFA85FD5CEBCD3BBDC63D5AA41FB8875F149B133136BB91CC48D1DC4D8B18E2833AF74908F7032D2470456E087C5751CB721F380A10BBDC7C64B0E89EBB8ED433622E932AE6386F7090D86D517B0B8546814952FBE5CB7D1053E934301BB56A6A22B691CB436B998CF9160E0D0BC9B8EBB803925C62D349B6E76A325466B2A3651716B5D9381F2E95A767C03609F9EE24C8B8469E26763BBF44D5BB889F6687E3757959B5D447AA5BA9EC9B4C70F1EC974F740DD83DD3028E26F9B5EA9BEEE1C994A071EC8B16DAD5B6D30A8149E12BDBD8F7BA38C6E554023D7313359BAE020A81461FED3422F1741AC640F3C1741AC0093AC1678B027A59426243E0A07066CC79049848191516D7DBFF804377D7AAB060B872DD05D1469818710DAE0E94A9CDC2BC89D934BC763B7CEE7BDE87067BD4C2E2AA3C08F980DBF5E6A4D5A59158D93991C09802EAC4838504D49B207DE212690AB16F676AC5C084C2AC6FE0646116E541670943FD08A6630EB762459FF41C260AFFA932CF1050BA9295089630F308C4C9A816E7BAAF51C63D54052D32CDD4296E6B6C80FF2D6422A492A4B5BAE6523E7C027454F93740205AB0971675315439EA18B6FEFCEA84B6FBBD6DA5EF9CB36ADB5AA07DB56B8989A086F45990DF543069A4F31FC60CF44F31067014663FEBEBCBC780F34C101E5BF76E3CBDFCE9F2BF74C8830ACDB143644683AFAC5EF209C3FC999EAEDC0F40B78E71DEEDC851AA54ED3D6A7C62E140949653376D353234C1866612CF03EBCEE86CB9FB5DCCDC1888E661F0E1A260FF7E1CD728EFC891A24EF62535BEEC21875389EDD4AD091A3DE77ACF5C6BC9F88374ED0FFCFE595DEF4C949CE63543E165C0F39A353B4140166600E092315314E60F2C283884B37FCB2D96C8B660B220E44FDB35B694678B030C37890098F09CEC0189C9C6264064759A59374F6B1BCCB1BBC5855EBFA76F5F06CFF638446185142E7A0551BD9C2550F57C71668308E47F1B6236FD58F18ECD5789E8A2CDF280FF199F36A7571DB6010B8009C68DCF1A09153F4D4F7931E08520FABCC7A1E3D3AFA725222D9531A2BB2ACEC168F0B87BEDB8750E0E9304DBA22AFBD98BEB7820581CF6C801DB84E01C799131678645D3D73FE7764820AFEBF75913B3FA0B0D55CBE75D0F4CE84F0532B017A159970F15AD617273DCEC657C4D89503DC30F3152736DC5C54DC66BEC87E1CF38551B8079E26B29E69A3BC2D75F6B5881A09BCFE9055FC9530F465EADBD6557BA8BDEB52711A9EE89282861EC837DE7700757A5867575D891BC67198EEA8C14B2D5155AA392A14C2B07B66C5C385F4C9F6C0B316EE94F7D7156C532237C74156300C28B66DC1CB75775DC8B146DB025C2A43A96EB5EEAC9B8EDB1D8BCB10BE91C636E476C4258DF894F33A7036108BFAC3815E187E0C481B18DF388086F9C9AA54A313058E668BB56735CBE8D759467D282A1EA14D31F93328F4AB4E861251D3B85315A8E98580A4142B81DB935E84A62F24910FF48F77E8208975D4EA4E2661B87B67F4235496F2FF0E4ED2997E2ECB1162E1331BBD1DE40AE20C2D220B3C07B90211EE813720BC23564E6310C263D0C35FDDDAE1956F759EEB0C1D5341BBE92370643E58D077D84C83ED8629B30136F98FFF07D431B04F0D0A656E6473747265616D0D0A656E646F626A0D0A352030206F626A0D0A3C3C2F547970652F466F6E742F537562747970652F54727565547970652F4E616D652F46312F42617365466F6E742F4243444545452B417269616C4D542F456E636F64696E672F57696E416E7369456E636F64696E672F466F6E7444657363726970746F722036203020522F4669727374436861722033322F4C61737443686172203132322F57696474687320313035203020523E3E0D0A656E646F626A0D0A362030206F626A0D0A3C3C2F547970652F466F6E7444657363726970746F722F466F6E744E616D652F4243444545452B417269616C4D542F466C6167732033322F4974616C6963416E676C6520302F417363656E74203930352F44657363656E74202D3231302F436170486569676874203732382F4176675769647468203434312F4D6178576964746820323636352F466F6E74576569676874203430302F58486569676874203235302F4C656164696E672033332F5374656D562034342F466F6E7442426F785B202D363635202D3231302032303030203732385D202F466F6E7446696C653220313033203020523E3E0D0A656E646F626A0D0A372030206F626A0D0A3C3C2F547970652F4578744753746174652F424D2F4E6F726D616C2F636120313E3E0D0A656E646F626A0D0A382030206F626A0D0A3C3C2F547970652F4578744753746174652F424D2F4E6F726D616C2F434120313E3E0D0A656E646F626A0D0A392030206F626A0D0A3C3C2F547970652F466F6E742F537562747970652F54727565547970652F4E616D652F46322F42617365466F6E742F4243444645452B43616C696272692D426F6C642F456E636F64696E672F57696E416E7369456E636F64696E672F466F6E7444657363726970746F72203130203020522F4669727374436861722033322F4C617374436861722038352F57696474687320313036203020523E3E0D0A656E646F626A0D0A31302030206F626A0D0A3C3C2F547970652F466F6E7444657363726970746F722F466F6E744E616D652F4243444645452B43616C696272692D426F6C642F466C6167732033322F4974616C6963416E676C6520302F417363656E74203735302F44657363656E74202D3235302F436170486569676874203735302F4176675769647468203533362F4D6178576964746820313738312F466F6E74576569676874203730302F58486569676874203235302F5374656D562035332F466F6E7442426F785B202D353139202D3235302031323633203735305D202F466F6E7446696C653220313037203020523E3E0D0A656E646F626A0D0A31312030206F626A0D0A3C3C2F547970652F466F6E742F537562747970652F54727565547970652F4E616D652F46332F42617365466F6E742F4243444745452B417269616C2D426F6C644D542F456E636F64696E672F57696E416E7369456E636F64696E672F466F6E7444657363726970746F72203132203020522F4669727374436861722033322F4C61737443686172203132312F57696474687320313038203020523E3E0D0A656E646F626A0D0A31322030206F626A0D0A3C3C2F547970652F466F6E7444657363726970746F722F466F6E744E616D652F4243444745452B417269616C2D426F6C644D542F466C6167732033322F4974616C6963416E676C6520302F417363656E74203930352F44657363656E74202D3231302F436170486569676874203732382F4176675769647468203437392F4D6178576964746820323632382F466F6E74576569676874203730302F58486569676874203235302F4C656164696E672033332F5374656D562034372F466F6E7442426F785B202D363238202D3231302032303030203732385D202F466F6E7446696C653220313039203020523E3E0D0A656E646F626A0D0A31332030206F626A0D0A3C3C2F547970652F466F6E742F537562747970652F54727565547970652F4E616D652F46342F42617365466F6E742F4243444845452B417269616C2D4974616C69634D542F456E636F64696E672F57696E416E7369456E636F64696E672F466F6E7444657363726970746F72203134203020522F4669727374436861722033322F4C61737443686172203132312F57696474687320313130203020523E3E0D0A656E646F626A0D0A31342030206F626A0D0A3C3C2F547970652F466F6E7444657363726970746F722F466F6E744E616D652F4243444845452B417269616C2D4974616C69634D542F466C6167732033322F4974616C6963416E676C65202D31322F417363656E74203930352F44657363656E74202D3230382F436170486569676874203732382F4176675769647468203434312F4D6178576964746820313837362F466F6E74576569676874203430302F58486569676874203235302F4C656164696E672033332F5374656D562034342F466F6E7442426F785B202D353137202D3230382031333539203732385D202F466F6E7446696C653220313131203020523E3E0D0A656E646F626A0D0A31352030206F626A0D0A3C3C2F547970652F506167652F506172656E742032203020522F5265736F75726365733C3C2F466F6E743C3C2F46312035203020522F4633203131203020522F4634203133203020523E3E2F4578744753746174653C3C2F4753372037203020522F4753382038203020523E3E2F50726F635365745B2F5044462F546578742F496D616765422F496D616765432F496D616765495D203E3E2F4D65646961426F785B20302030203539352E3332203834312E39325D202F436F6E74656E7473203136203020522F47726F75703C3C2F547970652F47726F75702F532F5472616E73706172656E63792F43532F4465766963655247423E3E2F546162732F532F537472756374506172656E747320313E3E0D0A656E646F626A0D0A31362030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E67746820353130343E3E0D0A73747265616D0D0A789CBD5D6D6FE33612FE1E20FF811FE3225144BD0B280A74BBDD5E0FD7EBB59BA2C0B5FDA0C8F2CB21B65CCB4EE27F7F9CE1AB24D2EB76C514D8D4B165911A0E679E796638B9FF7A7F582FAAFA40BEFCF2FEEBC3A1AA57CD9CFC76FFD0EEFEB87F38ED9AFBFF54CBF5B63AACDBEDFDC7E3E301DEFA4753CD9BFD575F9177EFBF217F5E5F854108FF15454E4948D2320DE28814090DCA88EC9BEBAB5FBF20DBEBAB770FD757F71F28A1340813F2B0B8BE82AB4342491E05619490BCCC82883C6CD865DF7DCCC9B26377264BFCAD10BF7D777DF5DB0D99FD411EFE797DF52DBBE14FD757174FE05E3DEBBB1FF8BCE1EE7918A4050C1E054941923409A29C84F01ABEB9F8E2FA8A7CCB2EFF09C7C297F70E99BD6B0F8776E316DB87B63D4C29B694966CEA248E82A240B1E1F30821457F534867868BD220778CE665499224A0195B912C48535891BC2CDD8B42EE3FEEAA2DACC80FDF7CFF9E84F7FFAAB64B72D36CEFBEFE6536BDAA6679902523313CB4B384C9E22EB96916B3E26681AFEAC3FAB999C5374FB3F4E64466D9CD667617DF545BF656B5643F9A198DF9970EF06305BF361D7C03DFDCC3D5CD13FB1E68137B77DBADD8CF35BBDBAE535FAD081B0F2F6D1FD9A747FC04EF871FCFAB1915F7C72B6D53C0F71A78EFC006C3AFEDF8B00BF65EBBDFB011F15D18BAE34FD9E13CB76A30F8A87A9A5EF5C232880B97D403FE98D9DFD6C24F2F37B30A61361AF8E7E9C72B8332718ED7D3824AA8945C5FB102152C7F85CBD24D2F0F9AE701DB848EF955A0075C5FA71FB98C833C768DECE14999332A52D7787CA736B0A950FEB8775A73D3B185DAB135D8EDDBDD8C465C2AB83B0ED3CB262AF320CFDF4E3671180645E91A8F1B0D250A3482ADD28CCD2CE7221BBC0F12E3525DB357DCBCEC8E2060FC78073ADF4D2FBA84F9D0C429BA401AC2E965984445903A65E861BC989E19EF6BE9B7C6DE46DB195FC63509C1B80FA764356938C7AD7666B0A39E71BA27EE90B6F01157AD7D3D2B998722EC9132EEE1B83FDEC34551CF5F65DAB16D0FCD526DD683BA7185379E930DDCCC709CDA031B92EBB9C3162EEE50AB775DC07CAF2F8562628C3297347D8C17A34FB68F672021257901877AD2518BE74BB9A28C81D6E1EC86F087D46C9528E5D3E2280AA6056ADFCCA5DACD613BD4C72154629F74F05DAD41842940F8E9ED64C0B26CA4E3430733DC0D308BAE211DD3273D699C5B8DBF1FF78D9AC4467DD62964F7C847F225751A07740CD4E6884A40464B909D162D4EB955C014AED8333FC15762CFB6B155260269B0E7F2003923E6E392D4F524771EC663D14EEE1AEF050CC9FE692E37152E245FF3FA708495E6C20011B60B3432D3830C1A644E81AC40B95FBCB889982641E91CB86E65C4F2897DBB31CC7EE70D47D827E9033E44E8CEEDE301C83A7607F6F839ECF41E4A95668FBDC9643479A446C3C02986C0C370B17BB881D46D34019D802688098D8232B3D9C1AC48836C8CB6DEB7A08EB3BB82A10DF2FD5CBC5A2FD635BC42D2E87325359A511485018D5D33BA4054915F4625CB52802F4E608AE0E108BACB9DE6C0050B10278D22FCD690160CE342912035461BDB0302C2CB1D7C36DA3C70C5127C99E5B2EED42924D16C98EBF21085C7256E7E87C87EBF81597DC31EED3DFBF703FCF27146D39BDF673CCE9A3EB248832476CD46904532B8AB4C5935F05BBDE210DA1314C9520A24E9088A28A770C08054B072CC684A84FEA8B0186A1D3CC79F188F1AE106BC89A006772FBC9807C40BB08A32B6A373D7D33C7818AF0CB2D2359E0461938F5A30571FBB46D52A9D338D9E1E66E441E41CDBC3266606394E5DE3096DECB3B8FDE85600FC4CE16287BA22D4EE3AC27061FA86FB2E2ED8FF3FB9EFD86CBE871FEFC14219442E7BF1B062B6BF5141C1805D6B160B4037A37092BCC0C39D5444765034930775CD699094AE4785F9E0CC91106B36B85ECCE14B9765105D1CBCFF09C4FD7A4645E0D328C43AB9C566B106A8BA7DDE1E3C4498A3AABBE52422E8E9517901D93CC7C0CFC8FE78F0875110D337942EF3BFEEF12AD2ADC1022C3924E264D8525888EEA0189ABD1F7020AD419404F118A1B70B0C51CE00AF4C9A0736598F6C2CCDD84E8E5CD3FC07C04498533DCCD5E9D86A214D100A5263408549E5F6CE0CDEC2821F45F40E90568D35C072492F0DA791952445D5A77DEC3A6080241AAED6805F48C5DE4C3939B35D0A8EAAF1A70F10268EBD1E97CC403B15FFA345731EA96B8DF19015A20850ECD3BF55D2072684AF80CCE84A1659BEEABA1616AC1639A13961EE1059C8443C37CAA2027DD92A4CDA5B69F1B4950C642444880D4610EE6E70D43D3D9073350802133AF848E225451944914B7C3EB32D65011BDB31F005D16FEC37FA4D99602C69190181E66D9FBEEA9945A56F882724AABB349E31CB0FCE856AC60064DD9139188D8E67FA4E18F790760B2ADC338B1964F0E29B47B80C6FBEE297FAB22A699E02CE388F390D90A9D44D88B2AD8F436A4199948C5B14BEE50C72BDE6B46337BDAD8952CC783B1ECA03039DE6C0783BC6D34E4B66D110CED662450B91FA38803F17B18850A4E6B51FC5B4EA262E5B2E1D5977AB8CDC560EA3839D93A1E5FD111E3D85A752CD1858C8C649254CCC70B789526809CC839AB90AD852F3B5B0D79C4278864B9AFDA332E327C33B6F78C61C1E51EED95A67173573C5C56360130132F0DA6D57EFD78F332F746F9C6210EB90C8AD87F1E233E37908D2D30C687DC778B01E684E9AE999ED98C59694BEE193E618133AC633CCFAC9EA5CB0688DAC8E92259DDC81E7715064AEE94D6F0C933C075AC631DE426EB0B58C0CE6480A7AC86F44506FE59886FFC2B734C983B21C0DFC01B2FBCEB21D69EB00CAB65BE10ABE834F7E61E232D0B9348E9CB15E820E8105C40AC6813D1C6016B206DBA7C12E7CA222B066DFFD3E93C8C8F4D578930E63309D4A17814E217935196D1C75329E67DBFF5AE4C19EEDD60F96954B132740BB8F6A04B1D6543A6298ED11E2A9952D7015AE86D7B60C63812508BADA571A76364DCF09F7FC9B0B53F603219C8E321ADB461601A8A87344D969E09A6156D328DA50DE4F145DF89374C4A28631221AC6CA566A05D4C9E336A54909018D6386227C907BC52C9A3237CB38BEDE56B3610593AE921A800D5134A56A10CE7E57F3229548E509E669EE21251F16B0411CB2F14136522854778CC76D1C6E0CD487252F0513811C903A3F4A219521934A48D98FDB9E61F976C6A9207F8A1EE6011D5BFB0CE64333F623BF05F65A4D46FEC329D2947D5424BEA839C7DC94842051FC6F261C90E4F7F2CDFFA6ECB7389D3E548A6810C7F6391176F33464EFD6CC41D3E9878EB12EC9210E99E3954E4B54052DDB760E09164E11BD8A047A2E3213981ABA9325699C9672F30DDDF45837A11954F8389EE9027626F1CBCE24450A51802D1FD9725A78276DDE51D6F769E852217F638B6FC73C8E3E5A61386584295DBF3EB1AAFB21EFC0BCE30B910463B00CE7C77CB9A6FB05672DABA636FD1A3B8EE625265A8BC7618AF2228F9ED42BE1EF76B3D8E006BA3E1EEAB1419E8C56C202A57CAC35557D3856BAD0F22C6C638093CDF07FB0079A1AE0C9F42A4E8B022C8675B2E48EDD3D2B299A0CE2E32843E21CFBB79B5FD787D520DF80250DC853D4404D2B90D793626EC0EFB1220F987C5D12E3ACE694053E607D841E53B1BF06E884DFBB6BD4E18067033FFAD2B2B48070FCF274B697EC430CC7835C73999E6DA1490CACB4633C1F68363B33DEE8C088CD9779A8CB8DC1DFBE99CCA3300BD2FCED641E8558E8E3184FFBA3A1FF01EBB05C092B2A42E7970AB62CC7F3C64907F6E301960D595B8148D61DD9B6CAB0C84850DA824104D81DF12895AEBBD2517A6D900DDCC090F911EE0B2A81A6DEDFD9822449ECE450DF67AEB509DB33CB2A0F8329E6A4554737F9A94FA87C7F668F01111500870B9886E9FD55C4F4214C5D8FE8A3BE8D5E3E9E0D02A69E21601405C5986D31893020F335E8C6E017164F726239A7FF392386693616124E7F3E935B50FB6CBB23A2C615A93ACCF6A3DB5C3C81D2BDC2EB47999AD010F2D60B6D11E5711095AE6936AF3B01A279FADB53D2308E6240F58E497052098F7BB54624356F348321A5E5ADC0D7259F27C4F42FECE74A1A0C0FB9FA24824A71C71C8C405357B22053371F107ABE8C2FF35B744CB3705379A8E63A4D56710B3CF02917D61C0DA2323C863AC0203BF56BD52F46AC1B510C7C278B1975210808E9D955F973F628A126D38C336170D9239A17E6707AE7FBFDB9BF987D311DDB6A0C1E6A7C4036976AA9458EBCFEB359F062469BDBA6E1C79B945B04065E2204EC5AE03AF50437985F50252179FC51C9ECAE67B6B9F0F6278931362A77BBD58900338BED4BC0058563D6232BDE28D6B4C6AC0B6E34458475088E94CE685A7DC0DB2EE132F4503B75137367F4CE4B7900184506E751ACCF6852681EE2E18859D7387789D7DCA919DF729ACB719EBB338911B5FF4EC31C06AC8282B23C9BAF53506B0F2745A4266545108DD13D3EDC60EE9323922881AE31F609A0824A7F015C838798998D4C9D12F0D121839E196F501E85B9126E5E3AA4E86A0F012C0BAA19D67A330144491924D4A972BA9A73BF5ECE848DEAA58CD0C82ECF552A4F5FE51141CAE6CD4414A7E999F144A628588279097A9E0CCF71FD08AFEC99A1F1BBFCDFE4D8903D8073FE8E94CCF4B5A479103B6538F350421A068E6D64FAAB5B7F463C4DE000F6281AE0450D7B0672995327EB432761E4B066C26C72803BE975FAA3255188E7D41C73F50023C2D4399E6F1841D9BA94AE47BD80B2C8FC5216711C41ADFAE8F031B252BB59ACA3FC46956DF6C87819CEF49239552F7B25C22DA67108F8AB833846C02B3D00E568C0B96DCD68472322237EC448006EC43310E44595EA70A02B4E2970840ABAAC51EA9017D3A5A33CF725313191742544CD22EFE56BC3D232881C1B561EE213BBF6B8D5FB549CD7D3B1A2C4A2F66320A6AC05A7DA3F05B211FD93A82071D1107407D95F431C31505643556C99315266544761190EEF2D600641A3A0EA4C61AF3F9187D698546945AFF8FB075EB9ADEA91DAFDB262EB90DF74B60E3EF00D59CD2413BCC342B1AEDD344A12A79DDE4FDE7A7244D0A4CCF1D4462ADF72D8D207ACC1D3768ED98CFA80C9FA6414566016E48BBAA556C5574B0CBEB1C250F6D1214CEF99D2E71E8F138074C331B63062B961C5773F835AABE3E17263F5F21B3A0C387B2856DB63BBF0CCDE5548BAECA4111127D39F4EF2E8EF688B0E2CCAF44D4A32C8383BE4E8B12C2E89B3208C5D030BF5FAE6BDB4011FFDEC07A94639A6FE47348E69B7AB274C0D88F6626891357FC95D5FBB354B4A7A873A2FAC2FC938533CAC5024AAA559CF578FDCBC7014E2BC20B87CB2ABB80B51BD341437A9E3BCDDBE7D3DF1125C5F02CEAC08ECD3BBEA4C91C2F4B44002B48063AA3E2B440B6CD3E61818F3B22D591EC785BE8E836088E2B88D3B6A268B72FAC640670E85BCEB37CD50F8014B513D18A0242872D7C3EB93BAAA0E5AD375D2548F13CC98A6F65BDB1DA52144352EF6C86EBDA556F70E79FA2838CE32D7043DA82F5033856BBC7E4821AD14CD0D33357DD4970605754D088BA68C66873A73D84BF558ED30EF159461555EBBF7D147AD04D6E9FCCCB36193CCE94122364A7B33058A334CA5BA9EDA12499AD1CC69C7BB717BE9D6499D1BDD4FB7CEC8B96FC5F1CA55B3AD79320EF1089EC579F179BC288AF3201D43A3819D13C7E2959FC093291C78886040A718758B00C33B19CEC9ED7CF61D0742D843531DEA5580DEB13DEECC0E0FB61D3DBD42177824D1213A8F67E831DF5BBA06BE80EFCAFD36DB834A365B26318CE00F16D4BFDDFCDC3CF1DE7A6C99BBD57A47DE618AE1F0D26027A1CF7416B699453404E0619B19EF0208FDFE00A07E9E9A58872E28D42DDA87F6F0A4450AF55BF6E1AA2D0BD2D9937E583F7DBE291D0D1DB34B61435CF2A436B52CFCD2B0B4288331F6FC75A52A0449B35DA846B7B5E5289CC1CB0E28FD416BAF4B28384B91CBAD83C0E3F892F608C7F1D15F0CFE3A2C62042BBB9706C8D9DFDD6BE7619AA750226DEF5E60FF231A843D4B2C93FA2AEA361B285B1BECE872F9E141C05E21CA9097D6054583DE007C7246B5FDA0608957C034FB75C316625C8392A9DB505969D874BAFEE8D7B59ABDA0D2BDAD00035C963E90A2E79C48EB226FC127693B982A8B2A64859DE25AF5B9961D3F9ED03F25ECA9AB759460A6C7F16438276CD0ECA10A1733088E81FD7499748FA70399B9CACB687EDC401EECC787569582F70BF5553F3C0FC0087B513826EFA11745119F19CF03FEE2C0EF9C167E62F718CC35E95A2C93E7656496B35EFEEC4352D81A5EDAAB1E02EDC55E3D94262135E698908F52A88C2101C7709A30E5CF0C71D7D2433554146491730D669228D5FD762AB23B3E429EC56CE084AD37B5AAB0B513D3DECD55A486371B74F454A740DA7DA3CB64B511772111FE8760467DA4B82F7118248B87F4D72280C689057CDA3B0418BE8F6C98E0AA13A931D5C58D63AF14152F615F3AA25B570FC82DE860193A3C9CDD1DEBD5CCCC1C771A3D1834FE286760B053662E0084D635BB6A5F6976DC9F14E158F518BCF192490CDA65ADE0AB86985A0DF5419B0A1A9449451C3371666AC3CC6B23A3E0E5F867C4F423CFED0FE8FBF86794E05F6B720857B59883F5FD5401B52E84EF258850D5A627EE62481E3AA6ED8328CC8292BAC6DBA842739E93C36A17E38801FEC9970387A8466FA0C7A3AC6CEC77A3B75657284DF6D4435CEEB230B7FD0900A10803D3FEB945C989D50F46012D5CF3184443D327145880E81ADB47FEA2700F3788F0FE4A5580B555B6DCC4E7BB13D1D1661EB20CBB4AC3C8A167C0BF82652D17EB2B4DF116D17E19076531DEACFC5804CC05DAF1DFE53ED6358C8167704C00D743CB178974490ED746371CDE9781BBA65C511346A7F6E1CA5CD47E4A178D38DA3B182B0D58E1D499F31A1AA30E96B346E8A20A06F5F5BACC4E8238CC18F83FFF05C15E3896FCA089D7428ABF79059578E4B869F847DC5CB513A23DB5E35467F68980D876E8E67C1194C1EA3C0F1A25A8423EDD41C853E94C8859428778FB8763EC0589E3969C999598412EF6FF4BAA1C2D0D0A656E6473747265616D0D0A656E646F626A0D0A31372030206F626A0D0A3C3C2F547970652F506167652F506172656E742032203020522F5265736F75726365733C3C2F466F6E743C3C2F46312035203020522F4633203131203020522F4634203133203020523E3E2F4578744753746174653C3C2F4753372037203020522F4753382038203020523E3E2F50726F635365745B2F5044462F546578742F496D616765422F496D616765432F496D616765495D203E3E2F4D65646961426F785B20302030203539352E3332203834312E39325D202F436F6E74656E7473203138203020522F47726F75703C3C2F547970652F47726F75702F532F5472616E73706172656E63792F43532F4465766963655247423E3E2F546162732F532F537472756374506172656E747320323E3E0D0A656E646F626A0D0A31382030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E67746820343734383E3E0D0A73747265616D0D0A789CBD5D596FE3C8117E37E0FFD06F6B05565BBC492008B0337B64832C72AC833C6CF240892D599931A9889467FCEFD3557D92ECD61819F62EB01E8D25B1BAABABEBF8EA98876FCFC3715FEF06F2FBDF3F7C3B0CF5EE8935E4D787C7EEF4EF87C7D7137BF86B7D38B6F570ECDA875F2EDB017EF5475637ECFC873F9077DFBD27FFBDBDD9D00DFC579645443624AB329AC4A44C235AC5E4CC6E6FFEF93BD2DEDEBC7BBCBD79F821225144372979DCDFDEC0A7372422454C37714A8A2AA731797CE61FFBF197821C7AFE6472C0BF95F26F3FDEDEFC7A4756FF268F7FBABDF99E3FF06FB7376F5EC083DEEBBB9FC5BAE1E9C5866625108F695A92344B695C900DBC866FEE7F777B43BEE71FFF1BD2C2970F1E9EBDEB86A17BF6B3ED87AE1B96645B16557CE92489695922DB703F9249C9FFC9A42BE4E28C161E6A418E244D6994F313C96996C1891455E53F14F2F0CBA96EE1447E7EFFD37764F3F0E7BA3D903BD6AEBFFDC76A7951CD0B9AA73336EC57EBF4EEE32ABB639F8FABFC6EFB91FF6084B5DD6595DE1D9E56096714FFC4003FBA5524FFFA54F337DA86FFC0AFEADFE3C79E18FF7D6F7E795EAD933BF65FFECB0B90107F85779FF155BB8AE417FBC50520AE229A67BEBDFFBF22708D5E4A8BC247AF6E390F1AC1975CECFEC8D9870CC11FC8607C051F30CC249A6D35B27CE96527650A02EB59F63A00BD12549687DE27CE93EEFCB1E10288F2D3D64242F2BBCB99112D8828B9533EF1574DAD05AA5E5EA36C125AE6BE9553BE1A2296B53461758BB9B2DFE433C27F5F9E5E45ABD44B8F819A0053016AA0966A40713F91CCDFF257758FCA8088D350D26D74437F82F777700DF03CE1C5AE86A7C3135FC523F111F0CE012E106B56D6FDE8C8AABC637BFEE5427C197EB0562D423E45DE36BC80F561955C5559F2C9AF27B3745BE0429D6CCA4DC88CD1825D36B77BD0C9B0C9534F097262E9054569CCCFDEB3A0093997218B1630640989F8227227A3E09DC9BA083C3B062BBFFBF5EE1F3D3B939F5A7E88DC949DB9A9C617A46E1B02AFDE77ED70EEBE5A89CE961727198D33E7F2DEC4B638ACFDCFB9B798C7B3857D07CA767759196B9CA0AA15B713EDCD7955DCED9EE09E0969EC2FF2C24BA31D45E2D3F8804B0F5765105785FFD832D0C6F8F274E6AF37FCA1FA76F2ABACDE9C3818C22B68C8859F253CD65001D16F497FD93DE95FD5FA6BE696B74877624B6B7B7317544D93A7D7628DC16E795E9470B7A6A7D0762B9B69C05CD8E707BCF9AF2E06211B603FCD0B93673448C6D9AA4F6F4CEC76C2AE06C8F2C38F9CA70F76F8093C367EF847F88CD08572ADF9587D46D6D2EB81F5C0C5415968A3C550A07A463A787FAF376C96B4BB9C5795FC82594DA8D3C8F9959D5B37C99667C67548C18DBADC05AE4FDD97281DB1CC5C847CC4B7A7FA85912DE39F12CFD8A170EE98B27068CCEE351FC60EE08C6D3DF9A4B43F3E1B28DACF0FC5A62C82A86DCAA6FE72024B7A5E9C6C55714DE5278B3C938C538AEA098EEC02AC6A081750CE172D7C5B2DF85C01F556B8211D0929E947A5D0C4A3C65AAC4645D51C9526810F77E84C7C544B402F455DDCAD562DFC2EF0B7F99DD8E927EA2F8BFBB47D05D53A76F6956E2AA458C09D0877BC49C9FF9CF1F9A4F7807AF3D41370D6386727DE9A60D045B315F97756C10DDE0AE5BB4887857FE8F1890B2C838DE32DEA265683697FCBD0B11C3B4B41D5867B1DBF112D440D78B1C64C7584A37CBD563C8A977D66687A388C17785587637F9CD274AE84847619EAA6D6ACA9E9F2BE5EBCA155E95BC31BBC9624B0D7B2717A2D3FAA037A418978B385CF95933270E998FA2718B008D919209CE8C67612A4AD85EBDEA1D9254DA72C67615901A0A165161FD693BD7E9A54EDFCED17130DA13EB8087D60C7F9B866A128EE173F78400D131F7B9797F5342B681AFBE819F3DF0F8A0546EC19046CAFC1EE5F5656AE10D72128CA7F02B3770249382A0B3E0E47C511C2EF2FA8F5A53C595E92518F1FB4BEE9F68A147A58EDF2E054B1A165E5DBEFF2284F5CA4348F7CF4C4E531D8976598819B631FAC3747808EEF419D053E44780416F892DF3D2E2FC1DC4A7215E9DC0D59F3A747658CE1E7130B717D12CA1FEF6125622328AF2895CC08AD401CC35D9D827F718E1148932E5611C039BC429AC12572FA0C8B5BCE248748CEB38E00A84C525DA167E9CD811D4CD8B79F46152A44EC2F23FB636E94B2A3F665BC1E2AE7C24819C04EDCE73DBE6D2EB824E309F8A771A48A03A7B6D5114AEE15F628CD482861CF239A175F0816C79EA33409C888CFDA62EC74A86158B6EB9E9F214CB8B42ABEB3EC1FE1FC555CC75D03F6A15C1378E505704687E989D80566621C7026820D1EAB76276178F591A2B285D535061A15784C1D1435C9D282567350ED00EEBBF20095DDD469955623D116CCD46B61178EDE19C210D866D7EBE0AE3BBF720EB8C37E47D24A8708EC13486533BE48E7EE72E0A72525742712670863833868B714FDBF41AFB0D1CE86F40AE6FE6D2856273C12483C38B49351536C9F3418256A25DC32B441752F44048C3662209D925491FA1A21222A30B61E551BD431B70F67F1DC5494D32873F301ED7C9CA568E71F9F2ECB272C937443F3C4770ACB8701499A5CA11780BB694E0B1F77F9C3B34D85CC1D9E96279D65A0443C5B35F8C024DDA4B00B0559DAE0686D5B2621D0BD867806ED9F0A25D487B54E3C902FE67E414DBE81D003D6A61496EFBA49750F17EE1B0DC46808670AFDE6703D118DACB5B729EDDEE271049751885BDC3B4450AE47E35ABFA2AA0990D5DFD024F12D2044154142D3CC474F1CA53431B99DF8D69EC82A8A0378BC09773D532F1B34163BF136F1A23075519E645A660C6CAEA759057D7FA64218EAF66C0A1ACD1D8CD3F908C0BA418B9757C0D1A6A485770101C208FEAB32F7D1DB5EEC53D8BEBADDF3C5D79427348E7D6B9A60E1E8520CDC4995385BBD6341B2E07192506E8C3C8B928E1CF0A755C0BFC5287D05D0AF03073075E4D406A2AA168C8A75601C13E7326091499A20BEF0366174A1C169D8D47F5A54943F61BAB09FD9F075953E2E92D126A29997E4D7191937BD0AF0250F3D6E64D7E5D7D733CDA9C625E0B21EAA6F38F12C2CFE9F66154D1C27EE488E04D04B714423F712301250CEEA71F93800CEA5F2ED3E04B804ECF6D1131AB82147E379D4E43D701EC2623C8B5F54B19E0B70DA76263908F8B82FF41BAB3D17026C5750C25F318646CC7D6FB913B92E5C59035602EA161F6BD2C5F841EDA94B9A817C8B34CD9C9EB980660F675C389889935E6818F410B48B7B2D82D560838CF7B84E43F95C1114CD675FE0CB0EC32DC8AD89448CC1C58623BC3E10FC63226ECFE3CC91CEB487C40BB29226956F3701E8E591979E1D419310A40B9A45BFE156A1AAFEADF45CC6290F6C9CE2946EE65002E8C2EE99E96CF3D44E1DFB492D8228EF4494B899A69EA768EDF592AD9F0456A9E0C65A56D1F5DD338630A3EAB17E0CA7F30534445591F9E9EF25888DD8014507D655D0C1CC7E1BC408C202C469B471654546DE764FCE5808AA36AB5DEE2FECB841EB3546F8277C1E951F75EDB8F26E6BA780EDBCCA241C683A362AB21B7D5020FEA81B0F3AE0DF6B0BFAACC268D47601129092CF0957DDF9B52A659594F9821463CCF459976959210DFFF143078CD55570EC73AD607791DEBC5778D3F4A963E84D74A684486AA7958F1101C2D0A28024BA879E349690CCDBDC6DFF83977C37C88C81308683AA830A50A897E4258DBC8B0B6110221A273E7A9F541D0D9C3CF7AC18973281354D1A0A4C29C758FD393542A89B5422BC30DDC3B497C5AFED73A5841677CFB29816A56F81F7CA939AB471D5E8BC5A1E2C22CA0611AFDBB14213F590427BF52E83C85055F62C40ED53926428B6EE1D0610DBA444B175D3D33640962D2E7F49734073DE207021DACAF2C24759B7FE44E36AD2C5412DEEA525DEFD2B818B0A6DBBDA0B4AF45642D5CBB7906D008175AE076185BC8AD083BF0FA77C721E0D3A40269D849635BCCB83DD08F47AC807883437394DFCDB95C551A5C37F696AED9C2CEF43446509F9A4DF8E0D557485DEC46C6E03A8A0186AE72ADF02DE60849D81C85A15D946211CBD24AA20EAFCCD0E2989635A163E7A18B0F517A624D686BB30A83CA1C0222BB51BBCC388A4D69FC26A2A4BCA9757B5794123EF7D5BBE7A3D2D36D0BFE3A417180B498B9C7AA54304C3A234359C12CF325AF82A753C1DA32180452C83BCBA18DDCC811ECE2E402D267771CAD8B7881009CBEACAA65D2D71DD41E397BA63A837E51817D31D74516595EB59F1D7781400020201660144053AABEEBD059805001D28998F9E980510C4232F221F5161089B7AD0687248FCB8BCB67F03AB0D0A2FEA44B1A52CB653383938AC187DE9544DC8E035E57F3A8A9097A757D02CF5D2B3933C5F684F5EBE473EA179EE5B9835042180EEC92055E7A11C42D79568D3DDF42609B97141D2DE04FABA4ACED1A6654A26D8EB48B67BDDD9072E8CA954EBB110B53ED7BAC958F54987B89C69E195770BF6D52CD80670AB6201B3FD56479E26026673D3C380BD7DC1B23BEC7515238304E23BEB7462968084D2469C3DB92F6B8DA214B06426121D6D9E35BC21475584CD51253C042EE65D0B7F074FCC0E7803149A659071F6D0D745EEED70DC1FADEE92E5D597381FF73242A8CB0CEAF93CF4EC3279AEDC5EB039FACCDD74685635B31E266E3333231126CD865651FD0BD3CFEE75DE7B5264299E61AE6EA79A675BDDD9A050AFF5A4A1EE5F77F0ABEFF9425BE5CAA2ABC14489E421D8ED866258076ED79CEB4FAB745232321F98604A452CB7FA807B6C4D8FFE383D20DB9760AED0F90C4D39AA7FC4C576CDD2A8B0781AA03180C75945E5E38699203131C83073258451E4E6C1B39410D3C212F0903DF4E6D81D541861EBF4490A2AEBF989113849E725E9EF4336D4C44545B3B963BFD558EB3CBE336D58A699A9934E6D77D03D5981CAED23A8052C7DEB3693B0C07F6361C28C78C363D0CAB70479E58CA2EA8D6B88BCD2D2DF0D4F4CC3623A25259BE1D8E7A1A7FC7BFF5AA94C33FCFF177DA90F58E18BBA522329FAC96A62C847F93FD16EED0B23CD71654FAF3032177EA24DCCCD4F39F7D94E4A7C4C57ACBE13D3D18E6AD68153A30237E1ABE7793DC9D89C375465E981ABFF7CD23523DC43E4028CB56ED3416FAA6FF4AC318EB1B933CABC874B8E5D2AAD19C5B3B5DC08D5C4A24BFE666A22A84B1A67318DDEEEF508D1AC4D7965DF9994EF7034AF4D8188C9612357ED2C7FA534DAC8F6339C13D58E331BF0B871A3A3041CDE7F07066D5CDAE91FB26372BDFA9767931476895628BE8B44C3976DC43180BF8B88806705D3532FE63311C7B0FEB4782370E57FCCDD0B6E5C3DAB3778B68CBFC7D37AC6E33847CC5E1E9D8CA107C9B3CEF0C9DB244FA124D1473F00BD8A565E7A212A6C122869F4D07315779BD92DD376ECEBADE993123A51E58B0A29AC818C535ACD7D0A55492E4A049FB9E24A2DC5C5ED4DAD3DFE690B39D65EA19FA05392365405575817CD4CD27650DAA6AC97A86D2300976D745D0CFAB2A2D508A796F6A1805D28A98A2A1F77C6038D04C683058EA70060579202D8E5594908B00B73961E7ADD9EAC92917BBE96FDEB8DF13FD18309DF4810F37792F9ECC81E93F702063746C48C9F0A352536C19C9B67516F00BECAB0C05754568EF1B5EF56709BD1F994F131C217E812CBE139D640917929333FF27AA8899AB7630D14D68D136A1E201211DF1BF4A41407FC3D6DDBCD6D876ADC2423AA3A0B51513E1895349ABCAA9A37BFBEA62BBDC2DD2273CD319D94722C0FB622B8E6211E02DC2DAFD03303BF2637EE1ECBE2A725DCA6565238278D1E63398A288584A0E33C03D3C774AC086BFD1555D3B23ED324A04D946B4692D5F36DAAF8F1EA20AF40AA10505DC7E056357C7680755D193C6BBC1798611A41D4D48BF60B913DE5910E0F730AAC863275FCAFE4231ECB07ABCA950BBAF4192CB496B5BB4951FA9BCA98ECA1952856B576A5C416A63386428FDD89D2D23580156128505A1F7000ACD99619A03816CD69F8E017380969ADD391D763C6F78859A9D67B96D59DFD4300BAA5F08366AB35E2F1931E6323C25A33336D2786F605E9AEE611A287AB7D3FC6B2C3CE7C8D92CC35F3554C6E6B246351365FBD2C9E0EBA146A6F96115EABE42EE9519FD9073FEF85AA47DF760CE6D5E784EE39C30B3B2E3B9F0E62AC55D1DCB5C507F292D218275779D8FD062FA90AEC2545099D7BBD189BB5E40363A723573886B5E3F330396F54AE882D6A75D9282727406376BC8920BBE65EBC198577D90D17534E10602E0DCEB774AF22C4189C022A84DCE44EE3697E3BB811D29FBD37118CB886CFDA5E391AF4A6389F32808B5F8C08FF0918F76E8471030B48DAEEAC7A806B35404FE1FD8174A31C3FEE90ABB5B75C2F608158C423D3C8B72834ADC66A0ADFABE78BEA55C461D52209F040E089071DBDEAFB6C5A1665653CD343FA671335A123523653BD4E0C7B371645AD3BA6930B3105C0764A1D43A4CDAD83FDAFF7CC5A293B313CFF3EC8605179FA654E378E7FDA6736D312D1ACDD788B829532009363C33FB057932D1E773D8D5B0FE6C5EFC65BE9A92C040D316C2AA651E2DBB6CB42FD0F302CF68A0D0A656E6473747265616D0D0A656E646F626A0D0A31392030206F626A0D0A3C3C2F547970652F506167652F506172656E742032203020522F5265736F75726365733C3C2F466F6E743C3C2F46312035203020522F4633203131203020522F4634203133203020522F4635203231203020523E3E2F4578744753746174653C3C2F4753372037203020522F4753382038203020523E3E2F50726F635365745B2F5044462F546578742F496D616765422F496D616765432F496D616765495D203E3E2F4D65646961426F785B20302030203539352E3332203834312E39325D202F436F6E74656E7473203230203020522F47726F75703C3C2F547970652F47726F75702F532F5472616E73706172656E63792F43532F4465766963655247423E3E2F546162732F532F537472756374506172656E747320333E3E0D0A656E646F626A0D0A32302030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E67746820353032363E3E0D0A73747265616D0D0A789CC55D596FDB48127E37E0FFC0476911D36CDE040603E49CCC22D9D9197BB15864F681A268591B8BD488941DEFAFDFAE6AF6C1A36467C2CE0E108F0E925DDD5D5DF5D5A9CB9787767B9317ADF3C30F972FDB362F6ECBB5F3E9F2BADEFFFBF2FA715F5EFE3DDF6CABBCDDD6D5E5D571D5C247EFCB7C5D1E7EFCD179F5E6B5F3C7F999E77AF05F9A26CCF19C288BDCC077D290B999EF1CCAF3B37FFEC5A9CECF5E5D9F9F5DBE630E63AE173AD737E76770B5E73027F15DCF0F9D248B5DDFB9DEF1CB7EBA4A9C4DC39FEC6CF05DDABDFBE9FCECD3C259FEDBB9FEEBF9D95BFEC05FCFCF9E4DC0A59AEBAB8F826E787AE2B9510A83FB6E983A6114BA7EE278F01AEEBCF9CBF999F3965FFE2B8E852F2F89357B55B76DBDA397ED5D5DB7732E5BC4324EBA13F86E9AE2B2E17CBA450AFFE4229D18CE8FDC8418CDCA9684A1CB62BE23B11B45B0234996D19BE25C5EEDF30A76E4E3EB9FDF38DEE587BCDA388BB2BA78F98FE59F5BF3C061BE9BC593AC1A47F84D6F199C0B787AC81F785D7C5A5CB5F561CB4978B7BC606CB1BD2B9B6FDD9111312CF2DC842066B42753ABC46658A553073A8CDC281C11767DBB0C17A5B33F2C2FC2C576192DAA62BB8C17FB3BFEA774EA1BFE89035F95D532583447BE8AFCFACD9205E2E316FEDCE64BD6BDC40FD7FA7DEE2CD3057F76B02877F996DF5A35EADEA2C667C2A0FC43266EC0715A3E385EF2C0BF83EFC530F02CF1AA5C76CFC8F1714D8D44E72D3FFACB6471C35FC35D77FC5FD938DBC6E1772540A6F1683EB5F44F1F15B1DAE189D50E989B8ED900A9C7E5C871EE7901E4B772ED7141F23B49226E475B6EF086ED9275EBF038BB346149EC7A3145B42BE9C13F5740C71E36A000FA6E24A105D20D4BFEF8425D2C778BA9F7F153D36FF0C21D5C74C4BD553BB612BB3EF78E0571E6860135F9979C675F73DA7E060ADECC3F38BF23CAA8C12F2C8C97B901A3C62BEA1D3FF8A1E0B55C9CC4B9792D0C633748695E9B7FBC8C1C8F2B322FF2325411CEB771D6E4D011DF5C6AA6BF0CCE071E0B29EF9A7228EBE6A64DCA2996BA6C0C21D642540A013EF7D01C59C6F4D005E7BBD9E51BE34032A6469C7F868C25C873D3E30975082BBCDE4A91393F099CED1392040B538E3822A2865B218773E9C2FFEF49E57F586662298E7BC96CE51AAE7385FA882D50E903480B283241D63B524395778828B63527AE82CDBA4328149B676305EABA516004B1CB06F6B4D22AAF40398A2F3747F8343FE4558B237417D93ADA5EC8CF992508F24229E5631FFBE1FDC8D2DDFDACC308B07403F0B6C2A582E53C70D4F6A840A17C60590D9E0D944E3E2CD63804411F60BE63B52E97213E5A610FE3F278719480C540A37A756AB506F4B096762ECE18C0B1134259339E01CE663FD23E37F628629E61D0F8760D9A98E3367FCCDF9D4193EFF7871A9C01D2BA507B573B8DD4AD601402836E9C1B30100C9B21AFD6CA4EC99BA69670174C0CF9B41DE7ACB2CDD7799B2BB1C66D8CB9B721880337C9A8E9DE97F30F984400888901E7E7B32049C1A9408C57C23EDCE369BCE76BDFED497D0F1F970767196AD9854643E9A25D2765866007B197B1B8A2E626C5B79A7EA7F892A3BE787C60845229E0CC56AD24710D6FEF51D5D4A005C50C06626FAB5918E41470687D04F4E0D4ABFF2C2F38BF6A110E936C5A25B5849CDF2C47CBF2BA63F51AC5F7D73DC9A981DD5120E29F527DDF58C0D07EE432462D2A0EFD450B6D7C2F16717E4AE210703C41898599C7899BA5D47828A7EECB4ED96AF698C1AD718AB7E18E31706A84F18F6A490A51E5B679B4A1997C00B70435886B384BB7C0D18671A59D08150A8F9B6DDBBCB0A2C77D8EFF5940D1B73A9A7E28F44AE9FD1B7A4CD687FC814BB015BAD48ACFE61E2368510CCFD51D1CCB9D006A91F0AB559BA572D4F53C2F305E5E8CD0ED18F14578A7853D941CE5A76E30E988C80F52D54E3A026F348ED587FE01042918169F1B751B62352D1D265779801E39300D2430E5F73D6AE10BAF3450EC3B2B71D5F1D51139D0E4BC49B83A00A0FD67FFDF41289B341F9E02A1FCCFBB1A30959A78639A7D0D9F114B16C78EF39CAAE49B1CC2B2C572DA89324C7AECC99EE0CFDE060814D7B99A67C72B99E7C609B5400A88EC6BB5FF62BD3AB53EBB9E08384C67143927B6066852270200C11BFEEF237C77B5B46897C6DEA441D120AF2BC6B8AD1F9486334CB8FEB1ED7801B86B73D8B6C0053171526617F161E47A1935190B2A254C5D9F51E319A752EDA83E0D28598CF3D2F3D85BF4B6047EE87AC934CD189FF321205580CD66C18A0903D70BBEDF060561ECB2881A6FAF3072DD00D0EF01ED817807CD30BF94F0323721C96B0C0C2FCD5B444A7D10B13F944D59A109ECDB1310518ADED3218D030890570E2E276821213BCA56EB99355AEC47C31C606877CD7E2C3DDFCD128A64E525434C2224AED3807DC7043E5367F1BEECB91C045C69148FA8C35B187ED2E9894A48F2C282DE4BC11423E66AC100E2BCEA07D4786B40D10344574B3BDF8C5F14888B7105A5BB99194E83BAB289A2A22400AC300E7200F58DF667AC1EB5BB49A1DB5C8607F475C3002ADC55D89E8BEFA3D79C98CB4DDF47E02897C0975C44132D28DF04952141D0FC9CEFA7ECC47816163C0DDD805CF007E90002D65803B754F5D254262B8D90F2023D4E7B254910B5234FB9364E6C063AF7BBAD53C87CD0B9C478D7871C0DFDA125316D48307BEE0A290BA2CCCDB2A7F45A7107A41EB5A773059BD979E794E370DA3367C7DE61900A1851E41BF12D83EF764A46A188DA94E8920129E74D40F978910328C2A423814CA51970075BF6581E5E2C256FF79C276ADD6C381E633763D4AC9179606686774199EE5DF86B768A9204520C9FD8075BCC1B62E6DF70D44A38B00F68799972A751895F88D08E4D1FEFE63A0DEC018E9EB18CCE5671B936610C9F387CA823B48FCAAD2FB86D03D7697DD93F5C186FEC92C134ADA7C2BD80B080D2BCCD57E0EB08A723BD168DA8C84BC1FF4BACFF33C27081DD305CC48D3CFE842161FFE89C69FDE04CDEF2750E3A77CD49E70318414DDF832672C21AC51D2B9D05A894DA241E840DFBD24A7ECC07A69726A3C3D23B60365F474106CEC11BC9A9F50E41FD28AC8D16D4A390D03A20D177C440AA41437A376D9D61FE0D1BF3909E762B1D2D5DB65B1758783174A6B070B86F89DEB6E61615189CA7B553D5EA995DBAA7CAF4149B218EA44A7642C7BCC3775EF97CB4E9541F3679B5E59F0BD83B44BD13EB28534F4139E68775D3D73E9A3B90E2073CF096963ECC12371C4314CE9607909C064F76B26BC8768D931F144321D1158604B475BBE680CE0AFAF7F8014FA81974E17669B2287A5118EFCA1147480B0D1141A5A4BE4E1E1577682FEA40C8C3312E6E05C3C432A5579E2A94C8F7658F1F6E55C0678C3B6C6D761A0074983494B41C79C855B62B6640613836178103D8CDF9715CECB98C22EE198A249C278D3FA4562D62E0C79E4ECA02BDF01EFEFEC2A5C16FFCA36BF9F1FB258A2BD01B19FFD4B8E45F8E7CF74EA89090BFE82EFEC05FBC75266EE32F5E02B3FC04DFFA38FADF96200B437C005EF0F683BAEC5A3E10EEFE9BF838C4A77F1B779D5AA7200437CC709DDEC8C1AF1571AFE447576FAF66A7867118CA486A9EC14E915D5C12B2D80DC6CAEE7AFE439FBA49488E379DED7611089956F462892792DD86CAA0E8DC9F06E4D69AB53E480F2D809AADCA68D44AA693B4F1243ECE1D303687E4EA18A808D4EC2AA54DE987989520325C6855F27A3EE44AD159DEEDFCF959E01B8A89A13F2D56F38F07EE506AAA17C65CEFE677BCF11B328F9CAB8554F18CDED64F8BDF171C0C0AD6BE29FB4E5EC3433EC07A86E5993BAFB64B363894FCF30FB9B23B3632608FE9FA2BB8B5E78AF9960947939E3FCF8D1931E11F3CEF15FB717E67630CDEDDEFB6A77E9AB969448DF70AD52703851AE39BDF9716E2923EC4C2080A0C5BFEA2CB1FD47E08E1A7D2C13CE09CE2D68EDF2DF4D0B226C8D40928EB86B27A0B596AA032AAAD49DE80EFAA37A6F2A9CCB08B50A66BEDD00E42E5A19DD54A07AD6428647033EE4C732CD1B2B4147327A666A33A8181DB9F184F19A9322962F6E1331F0E2631BCCD3C01CEE17C4462E0D7E01F449C745F1E9A12224ABAFC405B7863137494C625F090599CBAD54767E851EFEC704BF5A198633D86CDE597B63C74C63D5884F317260158A146B75108159E18AF4BC7372ADD54547B9C65C6264B48A60066F715DAD34DD9CBAE54D2A3FF51750BD19383E1003B25B00642767344EF52AE9D86A5F062B5CAB93195CF66D1D914C40C34FA64CCA29F3907738295B0E06C6001B8AD274941941A8313C24EDD256358FB462CC3CFD29C7A829D06C22146B30A8DAEF28BF6D61DAAAE582A1EF2C5099E866B56E8FE29553482745229D4318A8EA9EB819BF247E54C339CE586ABDB16B37125C9C67EC19C6BE5A5997C63E6B5C07474F1FFA46EEFF6A8F3FE5A0A6912B4F7C249BD1CA8F9114602709FA0A357AAC779810C64B31307DB9ED68E3DC0A504ED3FA317C0F7BC04A8BB04325290F4BFE83961EE8AD0D47985790C1F559A53972A8729B437E248D89883E4E120846D981698E8A0AF010D1C0B11C6E694F6B3551BA5C3EA7E28431B0EFB43BDC224B59D0C670C821557256471C9D0E6BB65DFF7CFD7E71D06653EBCE50F8158CBF56F5C57BD5D8A50D247A9B7749E7B237A34181966E849B7582F18027EF4A9C57C864730B6EB110C980F818C2161EF012740E180C4D517569228588AFD81A669800D85FD0FA8ED87B3FC140B58A1DB4F02D7CF28BA1BC55E77DD3F95270AFE189D12A1D4940AEC28D69F08E6CD6FCA05A9E76611350D0BC231C5D467623C142C13DD6CCC1290188C0107C0C12037D8401F10242D77C224B2261CFD2C032B78AA002D3F6C4A4729CBB5B3DE8E23BCA8E18F4B1DDD54A0E650705188EE62F155D11E7588B3E9C7CBDFCB9862A1C1C454E2E1BD4E647ED4D08893A9FCE19D47A29F6F8B4EF24625578E6816984A9CCD3F401368A7BA992D303FDF462C71439FDA037B7B9E466E3486CEBF2F4485ED060EB7AB36675FF68DB0476D05F5979C73FC7D173D281B0B8E3D9F456ECA28EA551AC354096D97481B4F3B0374121B7E2DD6A13982E76F9CD004D2F8BFC7834E460737260EB9EA18E94A562DD7877C63A3523580565FE432C49ACE9D9ADD7FED2642FB0903E7D294E20B24FCFB09970410D546F0CB6B2C8C161B7505B6B99DF5F2B96ECE028A44CEA71DB8C26C83FBD2599565A5EAD1CC126E58C7BDC0889000C7F94A271789D273ED5E820917508A3EBFDB3886245C6236DFD652EA446509315E7923FD7246F8B1AB7800101D28106D14A8DBE2C168D25411292CDA7134C4F6F99DCCCE78E82C7DE8FC80E92CDD6CE64FB909DC30A2E89D7F0B7D2F818188F174A421AFFA7A5C4B5455763295CDB393359D224B59256712ED0524C318453370B38E4023C2E874CA0B8448F8C9AE37B4993C668B9FC270CAC12421872B7D3116AC092F82624F828067985A895D53CBF7FDA99E67D6922F88F10CC79E2AA3E76AFEF3B05BC245BFADC6FCDBC535312898692AF100000C0967092B531A2E200930334740BF9AE5B58D23BD2FFDF6996621D229D7145563317280E8A83C96EA39D07567D072C7D631E60A8C6CD346A78513218AF9B3F652C8B322883CD127B3F301A3B895EB08DD5157164C45F012846C9A48F4F6B35434E2B5D0DCAF83B9C402D9C85F48DD38A2C67BAA9085EBA37E82C1BBDA6C5266600F06CD729D872E34258C094B27806591BD56715A94F4626EB2478228EF6F959A17B5ABD2B434C4B21210684611565B2C4418F47FC34EC546FB97517DCE85E53E11A18FF5B2C4E2C2ACBBD218E1E6114EA1AD5A620BCD94E476A7FC8E712B682A3E38BF2BD403F394A0C286EB15439193E3F584D366FEB27BE673CD4F4D75FE5C4416C00E53E319FA5A80783B6933A0B192EFB9BFDCF2A4C76B95E5AEE3A5B5EA383A683BDDA593289131F4D18E8A81BE2AC544B6053AD1D144F60562C9C9CE942C19E2D7EF51D7001BEB539DEDBE1A285DE8323A3E9D4AF411B251BCC24DDA49CA6DA721F85CCEF919B56A4607BE89567E941FD228F38505BDC3FE4AA0EA0CEBDB885576498B165A41246E404ECD462AA407B521C4780D864E8D78836E0975A3CC945D0906A05ECACFF68E491442A86FAACE1BA31DC52DC093A6DCE7875CFFEE41BFA799EEEB66D844DF9E91367D446237CE28AA052AC9D7EBAD446946C99DEAA8AAC4E4D44F2C48FB5119E34F0B0C2B8DB28234711939D1E97666317AC97BC14DAD0F1A7BE9B48CDFE18D4163712B574A15D96D8C737E2847D5D032FD776578CB8C1AFAD999296010F024C8974B67238DC663D4A876DA88B3801A6FE03FD635C8524AABBE2E9D7ADF895F5FD1675EFC0440D36FD9FA52851C26E4DD453F9BBAD7040C30FDB80398BD8031F3B9721803B1130D1B3FDB49F2C2FED50435B0EAAA64C4EC97393F3ACDD0FA9826C386AF117BA312E375CEB5B22AF23D94A01F8514363A6DEABEA102E136E87A288ED05F4FFAE3770A6694777672CB382B8501358981E3707E70C3DC34F97E3B16642134F420C67BC64FE6903E183313B0675EA8E88C2D11204C6E222954E6D75BCA6E27065771EF2E4434BFB8814EB6C4E016CE39D7B4A14F8D47946446E3E3FDA8BAE153A98958BCDFEBC952DDD7DD03EE4BB36D84067CBA29D0D7E42ECF6E368427B664FE366150C1FE1D39007E1E91E6001DBCA96AA3B2D8D281CF32374BC7C20BFDBB8DC8F216291D0F2ADFEB895657FD262D13212A9B3F1313621E1131A951C268CF9783996486C01DD89FD89CDAC68F9861B7AA498A7B45C15B0BB99549E8A601B55A36C04102B99C34CB413C7282E762E81A8A59397D846EC7FBDF1D8C9463D0704C6557FDA1595FCBCB41B10402B4533A7F2D6DEE610194E970C024F6725058D9289F83D1893CFEEA5FC2F9AA26EAC3DE9CD5F8971F8D836D2D573DF27C884110BBE3D8132DD08389C37372E0F9C70B9F3F1E668AFC0F6E94BCFE0D0A656E6473747265616D0D0A656E646F626A0D0A32312030206F626A0D0A3C3C2F547970652F466F6E742F537562747970652F54797065302F42617365466F6E742F4243444945452B417269616C4D542F456E636F64696E672F4964656E746974792D482F44657363656E64616E74466F6E7473203232203020522F546F556E69636F646520313032203020523E3E0D0A656E646F626A0D0A32322030206F626A0D0A5B203233203020525D200D0A656E646F626A0D0A32332030206F626A0D0A3C3C2F42617365466F6E742F4243444945452B417269616C4D542F537562747970652F434944466F6E7454797065322F547970652F466F6E742F434944546F4749444D61702F4964656E746974792F445720313030302F43494453797374656D496E666F203234203020522F466F6E7444657363726970746F72203235203020522F5720313034203020523E3E0D0A656E646F626A0D0A32342030206F626A0D0A3C3C2F4F72646572696E67284964656E7469747929202F52656769737472792841646F626529202F537570706C656D656E7420303E3E0D0A656E646F626A0D0A32352030206F626A0D0A3C3C2F547970652F466F6E7444657363726970746F722F466F6E744E616D652F4243444945452B417269616C4D542F466C6167732033322F4974616C6963416E676C6520302F417363656E74203930352F44657363656E74202D3231302F436170486569676874203732382F4176675769647468203434312F4D6178576964746820323636352F466F6E74576569676874203430302F58486569676874203235302F4C656164696E672033332F5374656D562034342F466F6E7442426F785B202D363635202D3231302032303030203732385D202F466F6E7446696C653220313033203020523E3E0D0A656E646F626A0D0A32362030206F626A0D0A3C3C2F547970652F506167652F506172656E742032203020522F5265736F75726365733C3C2F466F6E743C3C2F46312035203020523E3E2F4578744753746174653C3C2F4753372037203020522F4753382038203020523E3E2F50726F635365745B2F5044462F546578742F496D616765422F496D616765432F496D616765495D203E3E2F4D65646961426F785B20302030203539352E3332203834312E39325D202F436F6E74656E7473203237203020522F47726F75703C3C2F547970652F47726F75702F532F5472616E73706172656E63792F43532F4465766963655247423E3E2F546162732F532F537472756374506172656E747320343E3E0D0A656E646F626A0D0A32372030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E677468203436373E3E0D0A73747265616D0D0A789CB5944D6BDB401086EF02FD87394A01CF7E683F2104EC7CB5258604A9F46072506DD9316D24C7D952FAEFA395420FA9360D89ACD3EEB29AE79D7766964CF76EBB2E970E8E8FC9D4B9727957AD60418A66774B8A3FBB8A5C979B6D5DBA6D5393FCD777E78F3E55E5AADA9F9CC0ECEC141EE28822F59F319A01056925661C8C606839ECAB38FA7604751CCD8A3822170C18432AA058C791BF4D8181E648B9006D157228EEDB6B97B986CD631B1936DDCE3CEF2EE36891407A0BC597383A6F03DEC4D19B0590BFB9CEE6BD6E1F5D5394C6C3390A03420AE41AA85FFB3FD7477104E7EDF59B8ED52D49C0B359E35C731FB6EDA269DC98B649665BE9907134A6B3ADCBE7D924F94E935EC171893A403B48498440A6DA8A2894D257445B1B2E0A907C57D6BE22F3D3CF6740C955596F20A9EAC9F46B3A7EAB2A8D5AFDCF8621616C1C6122244C6498BDAC0F4C7C74A1DAF3E522C9B73F7F7CB439FEC15BD14FD1107E91FC4E2759D234ABD1B18C1BA42A847D6F57BEC2CBBCCD215EDEA43659FB5C5D2AFAA4CB7D35BE08A391CB37263DD483FCC0C3C169FB50BCD435EFED58DEA58CB6222722E134CD12AE467FA8584691F3800C48554FFF70730C702D66C3E97713A82CEB06100E801632841EEE88273CD79F460D0A656E6473747265616D0D0A656E646F626A0D0A32382030206F626A0D0A3C3C2F5469746C652846756E64616D656E74616C73206F6620436F6E74726F6C6C656420446F63756D656E74204D616E6167656D656E7429202F417574686F722847656E6572616C29202F43726561746F7228FEFF004D006900630072006F0073006F0066007400AE00200057006F007200640020003200300032003429202F4372656174696F6E4461746528443A32303236303330383137303830382B31302730302729202F4D6F644461746528443A32303236303330383137303830382B31302730302729202F50726F647563657228FEFF004D006900630072006F0073006F0066007400AE00200057006F007200640020003200300032003429203E3E0D0A656E646F626A0D0A33362030206F626A0D0A3C3C2F547970652F4F626A53746D2F4E2037312F4669727374203534392F46696C7465722F466C6174654465636F64652F4C656E67746820313130323E3E0D0A73747265616D0D0A789CAD98DB6EDB381086EF0BF41DE60D249E49A02890ED012DD206411CA017412F9C449B18B5ADC05180E6EDF71F8D12DB584AAEB90B18A628F11BFE9AE1F02063A92613C8293291546DC82452CE91AD49D79EAC25ED02594746D564F1D8E3196EE84436E2A7C97A726CA1265F2B36E49D259B2800708642B0841B5147729A6244CD53020BB3AAAE35A133553BD4D1B1D21A56500618851E6D50D72893276F4819EE4591B22C8DCB80BA85E010D02D290F59DEA3842E0FFBC138F2B01362203455D1B02E94495380DD84F70BB09B601F3A750D5DC19186308204AD203944D2BA76781194101DE119A33C4585D227BC1969AB15458312C622BB4CE3B963D7458AB0E34D4D90A0595784BD60E09184120F13ECB02E48D21195043B099E4EB0939223FC0CEB8244C3BA5240095D2992816076222EE05405F71B53E336C264E04638C3708F86430C654621AC963138AF861984B2F73862A9212BA0341C1D44DAA27142DD42D6BB77D5391BADE9A29A55E7D5E5F34353CDBACDD34DF769D9ACAAD32BAA7F52757E477D9BF7EFDFBED947BEA81CA30A183DC964A599E3119B43EC0BF2ED7A9983DC34F4577BFB9CC37C16532FD8D7AC3ECEDA0BCE4A1459DE4F6B0DD3D098D658A23588D638AA354D6B4DD3D09856951D9207C4627A61B14E8D8945DE4D8A55D941BDA546D56607F621B546D4DA51B5EE80DA6C6E6CA951B5F90439A0D68BDA30AA361E509BCDB02D35AAB624C55C3FC078311A51EBD501B5D91CDB52A36A4B92CC6B516BC6D4BECE77DFAA134CF67D2597AC32A2642618926C18BDC3B018FC3DBCC8F153ABCAA6F3A159FFC0F2A2B3D0F4FA9255A70BD697419B72C78853D3505E5C01630A185BC0B802C697382E64A1100668F6305FFF0BE3F6D2E094EA3F141779DFF73AC2CB821B0A827B0C63A699BC385BD0912B607C01130A9858C0A412C7BDE4793A66B62B60740163A699FCAC6A0B3A72058C2F604201330448FBE3037414A3B38C7ED9917E6C6F9E56CDBACBC64936EE46F6C446965223CBAC95BDA7ACF47CAAED0B5974BD2CC85E382F5C1020081064950EB28207C183E041709925F900DB17C245E1A27051B8285C142E0E9C741B456E123C099E044F8227C193E049F024381F57A51C7610830777BC75B9699A8BB6EDAA8B76D97C9F3FF001967D7B3EDFC0AFFC948FB2FD7C7E35C48A43F2FAF4ACF9DD9D36CFE406D39F616BDD764D75C67F9FD6B7DBCA259A5EB7BFAB5973D3555F9AF96DB3916B665EAEBFAE978B7533BB9FB342BE71B2868579B768D7437DD32DFE9EE3A2AFFD6837BFAEDBF6D77624F09DC7FBA6E95864577D9FDF6CDA9DFA877BFCEFD43F2EE6CBF66EE7C66CB9B81DBAEEDBCA259ADD6DE6ABEAF3E2EE6983575974CB8653FD43BBE25E4FD637F7ED4656447ED7C79E1A5C72F6B47A44C6F027803E18FC0D802F347F04E807257F05E8C7237F06D80DD4D97CD53C5E49F5CF46F4EE6975FF3CB87FE0DA3FD0EC1F18F637E4FB1BDEA964F949ACF2BF658CD808F17FC81E31559842028FE5D1DB37FF00995CEF8B0D0A656E6473747265616D0D0A656E646F626A0D0A34322030206F626A0D0A3C3C2F4F2F4C6973742F4C6973744E756D626572696E672F446563696D616C3E3E0D0A656E646F626A0D0A3130322030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E677468203232343E3E0D0A73747265616D0D0A789C5D90C16AC3300C86EF7E0A1DDB4371D25D43606B19E4B06E2CDB0338B6921916D928CE216F3FD90B1D4C6083FCFF9FF82D7DE9AE1DF904FA8D83ED31C1E8C9312E61658B30E0E449D515386FD3DE95DBCE262A2D70BF2D09E78EC6A09A06F4BB884BE20D0E8F2E0C7854FA951DB2A7090E9F975EFA7E8DF11B67A404956A5B7038CAA017136F6646D0053B754E749FB693307F8E8F2D229C4B5FFF86B1C1E1128D453634A16A2AA9169A67A95621B97FFA4E0DA3FD329CDD4FB5B8CF55FD50DCFB7BE6F2F7EEA1ECCA2C79CA0E4A901CC113DED71443CC543E3F09496F2B0D0A656E6473747265616D0D0A656E646F626A0D0A3130332030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E6774682035313632372F4C656E67746831203130323333363E3E0D0A73747265616D0D0A789CDC7C097855D5D5F63AE3BD094342429802E4864BC21020106446089920019903494049C8C01840A18AD86A14217801ABD2F2232093800A586E82D5807E85DA0A62156D2BB455AB54A50E68F577FAAA48CEF7AE7DF6B9B9390CC1B6FFF33FCF97E4BD6BCF7BEDBDD75E7BEDE18614226A890F9DAA264C494D6B9DBB722A913217A1C5A595254BC6F454EF211A7396483D527AEB32DF9347DFB99FA8F4C744E6A28A25732A07EF69934234762B51B3E09C85B757BC9EDDEE22D1BC4F885EEB32B7BCA4ECBBF82DD1280B7E1A38170131FD3B20BFD215FEAE732B972DEFB3EEC5E6F0BF4834BADDC2C5A52593DE5C358D94A1C8E37FA0B264F992B681167EC48F417A5F65F9B2126D875142CA3A2FF3B7A8A4B2FCD8C8F2DDA4DCB883A84FCE92C54B97593D6923296B3FE4F44B6E295FB2B3F6C38F89A68F236A9E4ADC564FF357761FFC74F2ACA8E15F7BE3B918A25DEF75EBC9F45C7EC7D2EF0E5E9C134DDE49F04688F4FC03EA19513F9E32A3E9BB83DFAD88A6508CFC69F50287B43A4155144DFD482315349D5613196D51AF8A584D5BA33C4006798DCD467F14106F53EDF754A1C6780DB599A9ABFCA39FA53ED6315A3E4370809FA93764FA50962FE965E38FF59394FE9E114A6D3A29966561D0928D67B9A514674A96D4212104D53FD14DFA528A03723D9DE836631A1528D554A4EEA31F33B44E94AE1FA05B90761FFCA3408F705EA4CF07DE018603D3800E32EC06A00498C27EA43DCC7951C6122E47D0A554E44DA0C5C634EB22EADB689CA00A601BDCBBF4F7E871730855C2BF1BF98EEA4483380DF26C34F7D126846F457C29C2B68116C0BF13EE99C8D757BA233CEBA93D53C044780F94B356B6B79BF66B1AA82FB5FE86B614A2CC3C6035EA98089A038C459A58D00CA05A39416B9413D62EC483D24AD45FCDE14096A46350CE2AC48F44BEAEF0AF84BB03F83041A38044A0BB7A8086A8ADE939D054B47FBADD6EE004CDE53687DA04FE254F97C2E6716C3850E77F017E7588750E34228C373756BA90ABF5A72AD005403C30497D852AF571A4A0BF1E36CE91C680E4733FBD0D5CAF97D178F815F039C5788A36B31FB84160A97551DF4A3BB4AF6830E256981BD18E32F4773FE01B4A553FA1DE6612DD05F9CA42F97703DB50E687421ECA682AEAEF03DA5F3F27646835C093F733A79FB86FE0BF1BE33A19757DCF3312F9A700A3312E55C042E607F5A7729FF3B82BD3EA8720EDFB48339381F0B602683BCB24E7E1FC282B49CAE1AE064ABB90663DFAF52CA80EC4310F0E849C4920EE38CA690F984027A00F700ED8052C0086026381EEA89B50AF26E41532C3B229E403B2619C401F823721B3761BB689F1B4E7CC4E5916D793681EA00512895C26CF179659F052E394CD738A65C6A142BE1708B9FF07B793652A4431F7F4F3349A79107310B2E5509E77E099E7C346359FD6087A8056B2CC327F0EE57E6159137D823921E9F0B0B6F61573045483E296B2BED2A14E5F84E85CDA8D328BCDD9D0293B688CBE8CC6680FD26CFD73CAD27A501FA32FC2D01EA40DAAE769B2F718F5C7584E80FF6117DDC4F09C56E61BC7D0CEFDE8CFD3F408FAF466FDB4DA453FAD18C67EEB23839493C67EF54EE1BE84BAA11CB3E39832C2E37E68F8BF02F58CB11F3A73BFF5B171DAB2D09E87784E78CE2B7D019F43115E0B54013DBD29CA26EF02A5CE934FD126D157C0623D9D861AE934483F86F189839EC75C4078BEF1373AAAADC7589FB6FEA25451958A323C7154A26E844E435DEA195AC9E0F2419784C951239973CB92431D797553D6F952A612404DCCBF5312EF4B7C037C0D391A0B996CCF6B03EB67B13E404703ABA5BCCE0FC9E749DA03BAD6914F979CCE77C96773B75CBAA9585BA0DF9D798ABAEE73DACFFA91751CEB48D673AC679CF46E1A963FA0EE831CB31E7E858AE4BCEE2291071EDF95731F7A18E33DDDB2CC1CEB31F329EB712DC67ADC4C83FBCF80613D86BE581E5A530BAC7AB99EF670D6523B9C9A39EB286C8B4AA9CF760B7DF305FD4CACA3D3047F11E641BACBB88071870E14FCEE907310FD09BE17E8C5E8F3CDB40EED68AF55633E221C98C97D22C682A81DAF0BBC266A3F473FF35AB49E566A6FC25EE0BCFDA995582F46D274F07E5284614D65CA61C674DA659EA7343D1FBAF61895F158713B981F1E7BEF8FA885370E7AE234F5D39F409A388A44BA1DA20FD2E93121179C77016C2CF485A7943C90D9F148C3E5ED1479D22946F6C76ED117223F6C119661EE0B9469C6D164614F9CA7ED463E4DC71CDAE9A9A29D663EE65C1C3D8E32F6205F1EF3827C1DC47AFD739A81F9B506BA690D740E09F92FB22E68FBD19EE5D0EB8056853EDA4FED8C2AF4E102D1F62CDDD6B1D53C7FB47D94CC3262FE1C7A98ED899F53404FA16C7301AD47D87A037A12F5AE45D8BD98BF2998BBF7217F82D4DB84BAEF4338E71DC9B60CDB083C5F3CE9146B56093B80040F6CA7A07EED23DAA9E5D11AC8F128EFCFD10FABA8375DD38F75401AC13030AD535A34FD047490DA9FFE801A9AC1CD6BE861FD6E9AA74FA334AD1FE66E2BEAADFF1E73F55BDAA245D12CFD25DAA2D7D13AF6EBB1D45D0BA2FD4FC1B6E4F057692287AB7F807F1315E9C3917F0D2DD267D152AD06B2F73A45EA15186BE433EE879C7445FE2F50AE84F21E1569D330B756C3FD2DD641A413753C65E532F431D45BE40B83E0D5818B67752C5A95873105BFEC6EC42F780DF1E9F07819FE443BB95CE4E334FA161A8E7E7A0B48B269FD24753DED0776A86F50A67603DDAE3C6E1D4127E7B83026DCAF0F507E0CF4D107D033C0DD70F702FD1570D0F6C3761B406F02AB50F631D043BC2F60A819349029C2B6019B80DF3971E1E07A2E171E0E23DE3AD2C8FF4BAC3580F2957584E14E8F7E1E88FA06EAD75B471890C53C867917B5F6DC4AADB56E08EF8C7C2EBF118FF9F44BEAAA91F5DF4DF17435E0A75F583FA687B7D1190FD036D780B7C2A88FA95C1BFE65DEFE55607C5B017D45FFFE83E26C19A258E58CF527D069CA196AA5FD083208C0DF07FE58A73F9D7142F80611EE1A3F35C3AAE73E7787BBFDEE716DCAAF1EA259E170E420240F0FD108863E12E901B7DF7B924630CC1710F7C2A57EFDB12650443DB5CDCC1364B0DBA57E73027563A85DC16B07CE83390784FCAF4247009C56E46F41A3193C7719EA53D8AF01A1F80194CD68E8571AC8FDAA6DB6E39DF171C6C53D3EE0AF9F7E8A468176031D0A3A0534CFA1E173D63D6FDD618E2EB95C1AD7DCE877A532FF370173E725E00470FCFF755D0A41568168C07C0B76C848D891A7619FCCA0954417A14BBE4F05F6420F4D05FD13C2B07AD7F7005AC0DD0A6173401F21BAF035DCB720FCB40D4BD5E36987B42BDB23EC6999D72BCB9B62E7BFF022D1775F0107EDFC17F601F3E1FEBF00D6F30B7F05FD35E826A4FF18F9EE057DDE8EBF380BFE5B81E7E03F0FFF42A000EE0740E3407B01B1400CF26F64B03D72C93EF43F4E2FBFFFB8560A9BA5147C26F09917E88FDD7B886BA6CE783641DD7B0D67FC9BA26167062E6AF703F64CEFC2EE0B86EF7DAEB6C77128C6B33E1C7ABE7511366573B6A3D99665FB59D88F928AFD9BB063512F516B87B2EDCCF62BDBCE6CBF82EE14670686E0279FF7F9822FB96E84EB56E52BDA064403F1922E409A6FD56ED629E89E28C8F7D7D81BED66C00F19A36936AC57B1764561AD3B0ABDFB35E82BF07702FDDA59D31CDD7A898E6D624DFB4FFB7FE81AF92FACA96912B35CB852B883C112B90CF75AFC43D1D4DAFD2FAFE55758A3C3D7E97FD7EFACF30E2246501AC3936E1D61B8EDD24BEC8026FC4DD9B93FD4EFB63B7EB0DF6597387E372E8977CB9E63CF74A00E21B8E6DD0F05EF2DF45F36D8FE0E0FEE791C9A6FD28F3ECA0E07F44077B986EE02BE84CEE804608DB21E82FF4EEFF794E67D92D2E05F03605DB44602651C073A5059CFE7DBD645F8EF813F5A7F45A42D90286B4A9EDD72CBF6B9B00FD167420F3EC0FC532A300C88016A804A67AC790F89BACFAA5875799FAB17595FEBA700970DD8241D4037034FC21F057F1474716BB315F4763A3DC6E7F1A091A091D0EF931ACEF8AC8BE60A91264F9C2D2FA331D0F38BF4D37CF665FD569CE9D55394A7B9B84759893534C139A7833F8ECF863C3E3E2FB1EAE4F95CB1F905D6C1E9580F2378ED40BDD3C49DD0029DCF71BFA09F69CD284B9E21B776CE92F97C8AD72BB30F458B738CF073E4F7601BCFA42C60A46EDF53E5F3F98B764EDCD554F3B9BB369E9E93F75BC1C87DB42DE2046DF396518EF72E71DFB451DB4A2B11B6D5733F6D3553C4FD4ABEB3AEF29A7899B33F3ECBEC103AD3946D76DB0482BF99348ECF63C2EB75F27973B0967E21CEA1EC73CC266C1BACF101A0CCBEAFB0BEB9FC79A7F5B23CF79C2BD7F85B436BBEFB9C7E264DD2EEC4BECF3993DD0B7A866ED25703B28FDDBC3875A15F2E5EC916726C13B8A78BB33EFBBE87CFA062C3EEE172443F7F24C62B97C7CC6881391CC5E36F1DD6EDFBB90C7D39D2ABD45EFF0CB0CF1EC5FD1C9F0D03D3D5BF20FD36CCD145982B90417D83B8C3BB570269ADBD22DF42FBDECC9C028C045F15C8B78FEF8E1CD0AA0658EFEBF9141010E76AD62EB5B57518F416F577E28E314ADE05B6D7D7D15471A6D97027D84EEF2ECEADBBEB53018C3F703BFC5D45DB25157D958E7C51942BDAC867737DF8FA9DBCDA3079462AD37A9EA11C4F3AE4B519E51887A8ABB618F6CB31E8BA8E18BB3C8C6B14ADD4DEA5CEFA602AD55A511943C9B14E29E74161A933D48F11FE17D007E1E7BBDF3FD14DCEBD9A7D3E4D17045E82AD00C8BB5C463943DDA724CA7BC242E9EE64BB1136849E1670CAD8477BC38074D6BBC005F567A83B83CAD43AD4B103BCA01E2D1AF3CF05E4992DD15DD6335A9F8E39D618996E202FD3543710CE34C90D19DEC10D8433CD7003E11997E1E34AE9AEC4C795C293DD4078F27F808F2B95EB7703E1FEABF037D60D848FFD017C5CA99FBBBA81F0AE57E163BC1B081FEFE603FA09FBD8FAE3D89B1E00FDB35CEF3F021D070AE9ABFF2D9F630315D2FF6799EEFF00D8FF5A0F03D82B5B1912D07916EF81AB413F01B0AFB62635A0FE246847FB8CDCA9C7DA00F404A6D97571DEFA67EDBA05649DF587ECFC179F047DD1E56F03FCDDAE4FD4CDBAF708A81FD82CDBB746D61BB479AFDFD090BEBEA3DD46912FD8004B0326237F02E89406D4FFD286F51BD05F007C2E7A42F2C5EECEB23FB8CDCF70590D7A81BED3374367141361AD6EEDD96753FD0E1A2774EEAB8DD6AA25421FBE478F0B7DC7AF5886539AD90276C82394C17603EB70A35CA45F6B94616D22D827B01584BD70960CFD056A6F9CA359FA22CAD29E865D3C1AFA1675887B1994CD7A9B6D0EED3EBA01107795E24E88EF4E965375E453C27E89469AD6FA07E0F7613A8A3DDB1AA38014E4373D7DE07F00EBFA4E5A6EDC412BBC9574D4FC9CEF4CA902EB5582398B8618F7D018676F6B565284D11C7681A4DE4D54EAE985F07DE4D3FF4E1D23AA61D7BD4613D167839CBA4377F71E6A8DF0BDF6F98A903FE0FB14609CE019FCC20ED3B1B76EEDBC1B306E449F94097EC68B3BA72748C71E9D8CCFB076E752774F046CAF545A13D18E7698DFA01D26ECD414712F5F21FBBE2FDF3F79E6503FA39A929DBDBBF93EFA792A453A94EFE39CF300D86E3BF5B9C25E8C11F75AF23C20449D32F8BEAD8AD6F15B09B75DE3D851219B429E1184CE1C9CF680F2FA196ABFA461F6867DA6700CF6691CA5F03D9E38137153C993B8C73B065992F6ACE728E57934D0BD5461AEA629C60DE897589AE2F90DC57846533BB6CF3C1E61D755F21A6D7C0B5B740A25636C3201EC29ACF9F6BD985528E7389FB9FD099889C978930CE3B30A8CB9D50CE1F9322FE2AD1FD9FB0C9186EFCF02D29D295166A7E1BC17FF2AD33F197656F38E0DB10FF185DBA9F22DD5EA4B68C3DD3DCB4F4E93F41ACFD0780EF39BAACBDCF1BBE906D0B98E1F76DE3B98A30F21AF0F301D3BDA4D75FBBEFF4E9B0ADB90E91E491F6559635BCF4DDDEF57AEF49EE52A76AC3DCF1CDAF8DD8B436F923439F42EA7091AFE4EA6815A96F4B7BCD6B33B79E6D6C1A197797F609FC93550F392FD53381563429AB463D97ECF13F7FCFC36E72A08BDE1BA0732D018D318FC9EE07230B192303C0B1B43DAF95784F953E403BC096E585F32C0F3DD36AC2D12E725763134057B697EEAFAA01BD69702977F5F97653E827A016F6F1B9E933684FD7F15A00FC88395D41B23A8C96BE155012B83E1F94C62AD03CB6238FDEEF4A3D32F68DBDFD1EEB9219E9DFA65B9FFEE38FEBBE3F29F6AF7D5780F877CA3E7507EBB675E966F8C8FC09736C45B9A7D142B61A25F9F05F6032F496C6060AE74E0B74A5A39E4A95CBC570CE5B9440ED6636FCA907EF9FEC63461D979DAD9F380DFFED8A0C2CBF58FA7DC963F4F37BB9FC4BB1DDBF63A8776B4906F6C2BA4EEEB1A319176CA77B209AC5BB0EEF23CEFABFF9A2A1ADB7CD6147B3F6DEDC23A69207D2B6319E5A8BFB31E355640277C6EBD68DC055B00405DF74A9C94D861DB7ED641F90ED214EF81F7D113E1C0DEB63383D3D8EBA4B547DADB6CC7DE62A3FE033BBC812F47F76AFF443B2E507BF1BE345DECAF27EAF3B0A79F47EDB5F38887BDC0F74D5A098DE235431B08DB8ADFDC2C97EF65F9ECE16D501B2DD02F13B5C7C3E637BFAFE17735807893C3E3741C6B00A73F2EF23BFBFBEEE27C6901F4F89B9420DEFE204EBCE94119FCD689ED220D3B0A6302E46212D24EB27EAF6D021D23F14F6011F89D46F3D47BA9B75681FDF06BB077E2107E33B018EE76A0514021B015B895FA89F00B9093EF901ED074F85F0635B0B73710F6ADC43A1B1C2FF6DB4F53196CE2329467A73B2DF2D830A94C795ED455A665A03CA453B153D260516871D26D227E15F21DB5F7EF7CAEC0E9459C9326A2218DE7279413594139DA4AD054D811A3AC23CA47345C2FA25618D316C0008CF529B97FE07DD3AB007ACBDA06FF4BAAFB5D80734F2EA9F124CD33AEA7DEC645D8076F410ECED270E31BDA628CA4EEE644AC6307E896F0974BFC9E58BC253E6D9D72CEBE1D98051417F1028DC61812BFDF70A8BA1FE0D74EF9623D126FE915ECB668BF5DA6783F6DCF3561E77AB26825E6710E3046BEFBAEB0EFC7608362EEE9F63BD5EEFA1EEA8492547B0F558FDEB2783E4C816E089DBD32E5376D2C5BD216641BF380FA07DED782970ED611752275967967D8FB528BCFAB7F06F099E5D6B0FBA78D8CFFDFF75BAAEB1EEA4AF7454DBDCD68EAADC625FE1F78A7E27EBBD1D45B8E26FDAE3B97A6EECB20AB6C23E7605D396AEEB34EC3FF0CF020F4EB6E864E9625CE476D7BED3EAD19E6F632EC4173A9AB3C13E573D2CED05F9DF575E24C7FB55D1EC5423765D867F3D6F7F27B0EE23C95CFE6D82ED5DA89EF4174D0EDEF3570F979F2FC567C6F22744E7B1DE5B3AE659D2AD60C7EDB8D7D1AF44D19EB16F524F557BFB77590725A8058178973C90CF09821A870AB3DA54EC9A008B53FDAB2C18616659D143AA9A5ADB334427975ACCFB0FEDAFAAA93D6C1D65FEAEBB60E52DF461A075F011FF35D0DEFA7C59E9AF7664F88B5E93B5B4F0A5DC8E790708BEFA3D8FBA7289E83FC3D98A6EC25695BEE77D1671DDA945D28F3EC97792E4D2FEF6EB096C48A35F904F5E0B7BDA17D17517FF136FAEF62BF3206F16C8334D8F9CE79BB18278C917DB7AFB8F7057C9FC363EBECE9ED73B3FAD7C3E82C1B629DE67EFC00765924D6DD71A20EE83871DFB3D4FA4AF2C9FB93F690D3B5A1BD9FB39773F61A44C3F46DB45B9B035BA82FBF4912EBFD7361FBDBDD0CF186E424ED116F994111F60AD28DB1D70DB186BC00BC06FC1EF80770C63EA7BAF817FEEE10F74B683FB49DDF0FD41F36DE427F1DA708EF386A6F1EB1ED15AD8A6EE1737106787B9821BE3BE5601FBFAB116FA186C97784BCAFCF92143A9772859E5F2AEE37666A31B00F26424E72E87AF8FBC17DBDFE13D8EADDC43DD534FD76F19D987CAD3DFAA1E1FB55691CA6DF8974A9E27DEF14FD0ECA375EA0F9C61FA9D4F827ED8DC8A3BDA05B35958619A3ECEF4FE8B7500EEFD3605754AB91D8AF2DA5F1581F5AC2F659C5BC087E909EE3C4BCBD196BDA7DB449FF0DE23E005D0C78B18EA5C2FF396D523EA64DDA528C13D268CF8977D39BF44F40FB21BE52D237115609FD108D747FA507F5B9E4350BA1731693575F08B4A404137B2AE89999286330F2F413F57C8035F137F480E0E172609E164B9E24948FADAFC0D3FDA04F036F38BCB821F80807F3E12E3B1C1F487E5CF531B82FC2C1FDA27F417D50FF46E0BF80D7C1D308A0DAC86CDC5FE1605E43F8BA31DFA20F1D705FBAC17DEBA0A5ECE7CB80FB3D1CA2DD0B1BC62104F4018F89180B2903DA2F5037BBB9DD9CE6739B479601212345A43AE30F991C27F8FEBBE077939E44F3056FA8C7C8812EC0D8A32F38CDE45099B63CDD2FF2713AC4893164DEB89F0F520FC1C309215B795C2FC7737F9A5F5194F934D2BC813ADA204D29F945DD5CF66A9B3F91771E7418CA32A7223E016BD5398431DAD871827FD9AE10EF3CFECC3BCA345AD8BCC396DC84393ACEEC8EB23A23FD8F6157B28CE403C729C73C28C62A46F3D326E8832EE1DFD702DACA30FE6E582ED013E82FFD4CBB88797CADE0F97EADF8A7D009E1D8DA14581FB890E60ED3DB5807C2FDAC3F80F1EA3CD03DC2ED69AA1CD651AC9F9A02D6B1C71CFDE5AE837519033640CB905E0BC70E9A1ED6FFA2EFF92DB4FE293DC2309BC1A6394DAB8CF768959A0CBD9E8C7293A917D0192805FA02F14027891E322E59FABD40F7E61B29A765735E03AC232DFF2028DBDE985116F631D696A66C60B7ADE7D880EE74B0137FA39CB166817E04BAEA4A6F5DAEE477BFA571BF89698AAF4B6C52F7BBA6A7ACB3065967F58DD687FAFBD6879E99B009DFA0344F4BD0581AD2EC197117D50B7DF23D1C0B80A54CDD7C5EEBBBFF6B6D37BF131436C52BF69E8BF7F1E2CEE080B43F965211F6A5BCDFBF13FE4E9E5F508C1947EDCCF1B4CDF815557B9EA008F38DD01B96D5DE75D4C2134BED225A629D3D25EF38B0CF371E85FDB5589C95C68AEF12B3FDDD858E6AA990CD23D02BCB604B15625DD94291627FC8FBC1B760C33CC0DF11B5F8AC268B6D27BEA367BB557EB799BFC33CCF1C4EFB9A4DB39EF7E65931CD9A531AE42CABD19EF50CA9CAE3E22D7F8E1D461DD449D8873D4E3DC2C2C648DA4352277C91A097BCB7B4BE55FBD07AF1EEF261EC158E8A7D3CDB2251B0A163197A37EBBF19DCE757835E455D19DA398C6198BBC9FDA2EB8D7E936FF09B7873DFE41C7906738FE1CC930594C3800C75B6ED4BA6E23C6A02E8B7A0BFB4EF4BADD12E37D9F7764CC559565760BAC4432EA4DAF743D675403FC7BEE7BD7DF8778FF8BB4372CFDFD3F97E909E051BF17AC04DB3C3DCDC3F48AF75831EEC4BAD9515D40765DCCA671CC6C790BF978123940359CF11EE03B01F5E047D09F2BD8C768BB86CDAA30FA13D9E72DA0399DE0299DD021D3ADCD84B01916F336D312390E7597AD0D8677D623C8CB9C5656DA26A733AD27D88F84EB22EE84B63346C9D4AB817D03CDD8732DBD144E32734D8C49ECF6C0F7EFBD1D3E20DCA0CEB7665B3B5534DA004E50DEB29BD2365984FD03DB02BABF54761473F015A09CCA131DA67A00837A6CB38B8B127AC369F847F3AFC95763CEC951CE15E4EF7C37F8FF2BCF5A85E69FD56DB8BFD11E2D5E3142DEAF0D32C7DA5C8C3F5DD63EE95F5DE4C19E8CB6AE19F63FD535F82F67C89363E25E6FE61751375F1AAB49061BC4639DED3748FC06B366D16877C4BA9A3B7E13B7437B8E78172136D70CE44DC6F072F399BC840BE0D34D45937F84D017F47D238611DD317588F463E4AE4BD1FFA241FBA6715A8DCCF990837F360E3E450AC69DAD0C7624FF9058D3467A09DEE331697BEE7BD19DA5BA91CA022D019A0E39D7D1DCAEE6B1898E70BB06F6224420E1935125EDBB68D18615DF48C03BD1BB490F2BC3D401328CF7308BAF1ECA5549C811175826E8CE1BBF8B03B41DB3F8036AA7788EF37C6407E4C13AB0C7428794CD84303292BF23C957A1E1177783148D3CADC49AD8D2DE8CFE5D0C92B00676F78860A8C0B9099BDD45D1B03DBF931318F86DB7B63EB7D67EFA897D170ED4BE838BB3CD329578F85DECFA26AED019AC8D035F43DE327D8C701EA23286B3EE4FC795AE9A981CCDECCE72DB4CA24AC0B25D08DA7042FFC7DD25CED7A3A2AFED7441DF6828CED624F982BFE2F4505E6E54BA847A631924377B9BBB5FBA9B5E9A7AD18B36AC8C2777C4624DFD9559B73D1EE15D4D91826CE30638D22AC35FD21C7CF8096814A3F78E88CF47C36C0EF36E3E4775C99B21D1B27EF2E07434FB416DFAFE5EF33DC2EDE22E862DFDB8F461AEFC2F6E771DA4CEBBC26CD16F716DD6990B611367827D8217CE6F41EDD843485BC2EF2BB82883BA8ADBEC3FACC731DD6C43F42472CB5BE956F0EC4FFE850BF80FB3874D9E7D63726DAA7DF2FFF3FC76CA49D8D317C8F36F0FF8C00A60A60CC197A3964F14D61A7AFD24D5AA53D813E30A8B3F63B8CE1C37C5720CFAD96527B79675C2DF682FD31A61F5ADFE8C780D37C0E66B5D14F0354FF219FA9B03DCFE758D0AF9D950B286F32CAFD2DAD317DB406F5CF856C7399F9BCCF117DC1EF57AFF12C558BC37C8B6BB00B2FB1979A5A135D678F586B6A3077A17EAC11F63BA07A7E63C0EF97FB03D1362EDE4BF4FD6A80BF83548E34FD409FB1D7BCFA39DADBF437EF326AC180AEAC661D2ADE212FA545621F7B42FC0F985ECEDB03ADBFD01147CCD3E87FFE7E8BBC4BF7F4136F754C71BE2DED9DB07706F6FD7811F294610C326803F6A2D5FA43D03189E2ECAB489C4F9EB3EF4FF86E0476DE08AD0436E733F69B48D855AF89F78DF67DD49350B645FA9DB41FE5BF437EF17D364DA2A3FDB536FA103EB8947F904E2FC3DF8B7C7035A72ED483865011ADA01D28E7101D56FAA983D4BF98E9BE085FAC2FD597E55BE2BBBD4B5CD2CBFC9F7790A71B728EA21291BAF6B2A997D9A9ADF742BFA556298DA081D66EEF9FEB95EF83E74F9DDD76FEF1B3B77DFA0DD1DB7BCF5D4FAEFF2B74851FB9B0B4FC55CBA32DCB5A1E6BF9EB96E5FCEF5B1AFE2D91A2AAF63546F80FDF7EEB06BB226161525474AB98D8D6716DDAB66BDF215EBE5FA3AE49C9DDBAF7E899D2AB779FD4BEFDD2FA5F3760E0A0C143860E1B7EBD1D9F959D337A4C6EDED871378C9F3071D2E42953F3A74D2F282C9A31F3C66B62FCDA7F34F15913F23F7BE5A4A7F9E30DDBFDBF6A44D367AC5AB6F4969B972C5E54B970C1FC7973E75494CFBEB160FAB4FCA913C68F4A1F39E2FAE1C3860E193C68C075FDD3FAF54DEDD3BB574ACF1EDDBB252775F57749F42574EED431BE43FB766DDBC4B58E8D69151DD5B245F36691115E8F69E89AAA50AF6C7F4EB12F985C1CD493FD63C6F466BFBF0401256101C5411F82721AA709FA8A45325FE394E94859E14A996EA74C0FA554A27DC36978EF5EBE6CBF2FF84A96DF57A7144D2A807B7D96BFD017FC54B86F10EE0784BB05DC8989C8E0CB6E3737CB17548A7DD9C19C5BE706B28BB3505C4DB3C84C7F667964EF5E5413D90CCE667005DBFA97D4286D4728C2A1B6CD1E5AA392B705980A76F0676507DBFBB39883A096945D52169C38A9203B2B3E31B1B077AFA09259EA9F1D247F46302A4524A14C514DD0CC0C7A4435BE79DC1A5AEBABE9752CB0AE2E9A6617A7342FF39795CC2C086A25855C47AB14D49B156CBBE2FD760D5E141E9359501D1E1BAF05B2DBCDF3B13710A8F605774C2A088F4DE4CFC2429481BC6A524E71200755AF43278E9DE2436DEAAAC282A0B20A55FAB825DC2ABB7DE5FE6C0E299EEF0B46F833FC7303F38B31341D02419A7C7B626D870EE987ADB3D421DB17985AE04F0C8E8CF717966475AC694D81C9B71F6A9FEE6BDF38A677AF9AE85676C7D6B48C928EE62DC21DE5A138E112C9D9357672A86715E6C89F0B8108FA4A7DE0A4C08F360DE68FF2C114281D8C64F82954902B58861199178CC82C0E440FE570CE1F3492A2FDBEC0D70409F07FFA49E39012196226457F4DEC643909891AE21D77302525D8B3278B882713630A1E4708FF80DEBD6EAD53FDFE25D13E10741F4D44DF96140E4D45F72726F200AFAD4BA7D9F004AB2615D87E1FCD8EAFA5F4D494C2A05ACC31C79C98B87C8EA9726242D98BFD90E4A7844A880B7A93437F51D16D62B3E70E0D2A6DAE125D6EC78F9DE21F3BA9A8C0971D28967D3B766A239F1D3F3814275DC1D8CC022D5E952E355E13B110CA99A1C4EC29681ED493F0670AA12EABF37821952244F1E504A38BC7D89F85918989D798A9CEFA9C7309D2904DB2191C9AD2D83FAC91BF117BCD031A18D693D5B1538B0281C846711035BBC25C4920F134B520D19719A47CCCCC24FCD559C706330AE383E9E8B24C4E00F9B383A4B751C278E92EC40F4B67EF5E39507481408EDF9713280E94D45955B3FDBE687FE0B0FABCFA7C604976B1233875D691B5F1C19C7585E8ABB9CAD0DEBDFC1C130894D59096846AD2E36B14E11894B9B6303821A5D01F9C9DE24FF41794A32D3543A979E2D4E24CB854CAA8F12B6B26D5A42B6BA614151C8EC62AB5666A41ADAAA899C51985355D115770D887A54284AA1CCA81ECF1B187C62AE89A5AD52BD2C71F4E27AA12B1BA0810FED23A854498D70953A8B44EB5C3A2ED8A924545E9B0294AEB743B26DD49AD23CC6B8755D9A9BBCBD45EC44473CC11C28A4322D2FEA981676A417AE4A0F4A1E9C3D247A82355F40807D522E408D20E53E8D00865A4125F8332278BE03AA5AA66587AFC6151D26499B20A2939AC2A1406CE39595841A8CF6E787E430BF28B0A0E8D20942F3E9122837F58D38289F039241413CBF9F49482E66A60EC14482047460E8E8F0C8BF671C6A0E20FCEF22F4FE4D605A7F96F4F44A03FE883B646A21A1ADDB13010F0E1D78F5E299D56607F7294D2AB234A2A0C56CD76D2C677844C34789B23AB90AB431D5987846ABBC3A9ED16D4C68E80535DB0F4B2B581FBA032833FC59F60BF6620F9EDFAB14ADB950666068A208F89C14E5CB1E403DE961D0B4509E06493E044118B53296C820A9E4B3E56725093FEBC1A757C8AA08AA0813C7F76195230B0E80EC06025FACA0A39959F270D0BFE15132961897821118507A287393E45FAECE91B08CE69EC9D1BF2E63060A324F5B1D504DA22A66C62707E7C7061614A284909B73980B93D9427F850917934A318CBCEE86055690958C47A935BEA47401E027C05B3ED1EE4853AC096536909B2712FCB9A828B521A15099DA04045A1206E4EB06AA2AFB8D0570C1DA24C4267C7FB8206A8AF02E693BF84F5C644BB3D13A1FC414A0253909778D8E2831EE8B38A92723F2BD720CBBBDDFBCCA30EEE684A4190E203013F64082C26E520318A4F0E9AC9B94CF0B724C55F52CE965D051B76E5B6C9017645EF7069F1D9FEC442245193445FA2E330D166F3476980EDC61B8B53D013AD023101DF900026FC8DD1FCEF494BA71543AFF9A27D393E31D425F1F0A11372D9578882EC8411499C10F9C55F72B032A5E6464F524388F85B9C6227F68A528511119CE824F1883F386E4E09AA6D0723921BAF4C2E12EB02068A3BCF48CA45F7A643AAE2393766D154B96CD8F973396BBC3360763684143A0B00E4BD26495933315C13CE0CC68C9D3C231E1DDBBB66EAAA51CDB45EFCAB76A14E94A0A5683D693868CF5AB353429DD6FD5072BB84D79ED37AD05940D57AD4A6744A38AC75D33AD50E4B48AFD3FC8762E2D2A246F5D67C50C1A9E2D387CFC5C041E0A8C6DB9A595A678447E3F32EA00A38081C055E03B009C427C7FA80C5C076E02CC7689DB48EB5BE84E851DDB4F6C8DB1E4D88D2DAD267800568E0B32D6A6D4B138059C04F81ED8029D271C862E02EE028F0B98849D7DAD63ED41FBCB7AD5D2BC8A1F90BD384B7C4F6CEBC51780F4D2FB4E90D936C9A956B271B6A27EB779D1DDC27C3A6DD7AD9342629AD8A69648BB463A3DA686DD0C836607C093E15F5B714A52894403BB4380A02AA66CA90742DE650D7E4B4ED47359D144DD5142AA304EB98A6D4B66895362A52B5D4CF288612D47FA89FDA31EAA7875AB64ADB3E2A4F7D970E0247014D7D17BF7F53FF4677A967B9CFF13912D80E1C055E053E034CF52C7EDFC1EFDBEADB14A5FE95528191C02C603B7014F80CF0A87FC567B4FA161B79E293DD2301557D0B9FD1EA9B68D69BF88C52DF80EB0DF50DB0F6C7DA4143D20E0B474AAA7424244947DB78E988699356A7FEA1F6DB1E90A8648C3424EA59AD0BF6A6FDB52EB549FD207EED6A87CF4BA853DF3BE44B49D831AAAFFA3A05013E29781D35BF4E3E6022500C2C014CB8CEC07586AA8007801D40108094E1331AF0A92F012F0367A82F900E4C04BCEA6BB5A8A64E7DB536392361541BF5947A82DAA2C75F515F14F465F5B8A0BF535F10F4246867D097D4E3B59D13685433C413F244F3693D682AE20DF5D787BAC62458A35AA947D17709F84C054602138059C04F01533DAA76A92D4B884121CFD24BD85B27A8B5F491A07B699797D2E727A4276742007DFC913CF47AB8F0B1DDB73D594D4FDEF830BCFC917CFF4370F147F2BDEBE0E28FE41577C3C51FC90B6F858B3F92CBE6C3C51FC945B3E0E28FE40953E1C2479DBAED99AEDD12064D58A0F84645A9B7A1976E432FDD865EBA8D74F536FEA56F75E66D4B6DCF9EE8B1CDE9293D7A2654C1B6794EA99AAC54ED52AACA95AA3B95AABB95AAE14AD54DCAFF90F625F05114D9C3F5AAFA98A367A6673257329339724C800102091002910C08B20A01E4880489808020E002063C902328978882170AEB8137A86848020C872B0AAB7F71595C715D8FBFC2BA88E8B741DC65911532F3BDAA9909C9EAFE7EFBFDBE69BAABBAFA75D5AB57EFAED6D447A1DE0FF501A88F41FD3EE88BA4A887587387DBF29817EA0F43FD76A8AF83FA08D417427D01D487A02C16A7E1C6AB4B453144144D03B9D06179C500D43E361A468A8691E7C3A813DEC4EB513C93E22E8640A1BC1470768097794D5D2A53F7DDFB95CC45F139882F1EC46538488EE329E1021D44363A889D1CC40E6C78ADC473129E07F0FC1ECF249E0A42E721E2EBC5D586D7623C2BF19C84E7323CBFC75311E87C8F272573D328BE2E10E34817A7111F89A7440FE2918747988663B9BA5F8FEABF62EBFD600BC0C8403240CB88DB8D7196C36EB0C7C1B2EB47CB851F2DC438D0481FA0EBB9EAA61BD2E5FAC67FA1EA86C71B23FB82035DF0180948C879504E225088655F5227EE7B13BF8197BD889FBE826549A3BF1A5FB33546BA06F78295BFB52BF82FFFC9E0B7FE38C5EA69FFBEE09F4371091A837FC2965776053FF2DF1B7CAF386EC096FD913860B1372440F7F8FB06B71F16A0CBF1C1E6C6E0525EEC0A2EF10F0DCEF68B07D3530F6EA8C3BB982D383A3221F82BEC6FB0FFC660AC0EFBDC15ACF4DF10AC4841F5E6EFEC0AF64014A2A96A1744B6B35F0C9A1FC096E660EF71E3CAE23033D655DDA88E5747AA7DD412B5AB1A56836AAEEA539D06874137580D9AC1643018148364A0066270C6932762519E68742A3A2FF8D788402451D729BF8A4FAB51AEC140C935A4218B0DA3C3C60C82610D07A6926137861ACE8FC98F8309033F397F10A06525C3C60E6AE81B1D165793A31BCAA2C31AD451D78FDF01F0400DB636D03518BA8C1D1F87246F5AE9E329963D04C0BEF27E1F2F3BADBCBFA68678DDB7557A2B1D03ECE5570DFE85CBE4F4357AF9E7ED50CF1DD4B071D898F18DBD5F7E3977504D4389A82793581FD6F0304FC5EC81BFC3D92183F7C00FBCA819BF870D80BF0F19CDDBD980C13535C3E2502DE048087E4038649D1F049C01AD34872321432005B739055788EF235C012F10CE68248502AED06814701270B81D75054306EF282810309E10A91330759E507B98C3850853582860DCF5E4B08039ECAEE7300D030488DF8F2001BF00811CE217207EC81120D597418AD320F7B681DC2B46627019C69F82B19CC8C0584E204CF4BFFD4D1F148D4253FF9AA913791A6B72FE90E9784E6EB8EFB6995EEE9187764CAD49E7B722936F9C3A9397E893D6E44F1FDC30357F706847FF89BFF078227FDC3F7FF00E3271C8D8F13B26C6A60F6EEC1FEB3F247FCAE09AA6A1A37A957518EBDEB6B17A8DFA85CE46F1CE7AF1B18696FDC2E332FE78281FAB8C8F55C6C71A1A1B2AC62282D5478DDF6120836AAE9C982A9BA8D9846C3B19FDF8416E7DDE00C1C3FDC3DEA5BEBDE8BA6C25E6684D83963FA8C182277FD46D60B781FC118A167F64E5B9CAF423EFD2FE61DF5ED89A7EA463B33D7F10892E5858B7907887DC3C38F5AF0E7FD8B460212778EA1AADFB4F3F7C36A421366570DD02428635741933ACA11283DF1DAA8AAD93F9941AFA65DACCE621F1E4815463776CECC71B196B03E46D15BCCD684C03FE7CFD17A6CB2BB914D4D37D4D100BC0025257C31A02C3C652D40863D349A1BDE858715B51578313AC8328D465FA48A31D8D92D43DE173CE9C0B16A66B695A2C4897A937F195BA0C49DA7E9C58D1368A2D10DD0A7246278E1F68657D58311988BE730F2CBB61D90DCB122C4B5871CC1109325A16341ACA8266D3E0A0AA0C0E667AAD8912792FC9C633477E89644B11FEFD75927F77729A97899B93A7F9735ED2EF506BC6D327215BC976B8996C276F92B7E12CBEF53AD9439A09F7AA069327C862F208598D967202B6DC4B46E32163FB23909D6C26C5E419B495CF9023087B1D594AF612377893DF926564253B866FAD24169287931945E692FB6178722199488E4BF79032329CFC9ACC83FAE4F8E403C98792CF9317C81EF63FC956622639642A1E479267E44F92FF8B0498481E259BC87178C8B893C470947A847C92DC4A36B35A099233923F210661723BE220912A72040ED028F63E9D7C035E58CCAEC45E9E4B36240F21949FD492996433D90BBD61280DCB139355C923C48D63DC81BD6E228D64171E71F206F90C34F96CF2F9E459924DBA92AB713ECDE40F7080255A97272A9162325289EF045D8DF3FA2D79977C00F9F0169D2B6B72891C9317253F224ED2938C436C5FC2374FC18F74291ECBD83BD255C941C48A747990539BFC8EFC0572A018464235ED4CE7D2A7D8ADC48023F6C4631AB919E9FD38F6FE2532E32EAAD1A3EC39E915E9A2929B3891B4E28A44C86FC893E42DB0E04C43500777C3C7F0577A259D447F43BF628F48DBA40FD52938EB1BC82DE47EF20AF9111CD017AE85EB61262C86D5F0206C8223F0019CA603E9583A9B7ECF66B2F9EC0D69101E63A43AE91E79957C9F723A313E7128F1C7C48FC992E42A722DF2C372C4FE51F214CE6C0F394A3EC5E338F90A643083158F1084611CDC85C752B81F9E85ADB00D9A71940FE02BF8160DDB3FE12245B34D15EA435F8A7B54F9F456745A1FA14FD0A3787C40FF46FFC53C2C0F83DDDEAC82D5B0B988D56AB6018F9DEC2F528E74544A229D4BE48DF2D3F256F915F96DF9ACA2A977A3C3F0FB4BCFB57669FD3241126B121B138D89E6E45F880BD7106D10C6701588FD143C66E17A6F448E7B9D1C030D6997035D60000C47CA4C8259301FEE404AAE80CDF082C0FD35D88F54FA337C8F385BA85FE0DC9DF6A683E8483C6EA0D3E97CF4ED1EA2CDF463FA13539999D9988B756143592D9BCE16B03BD946D6C07ECFBE605FB1F3EC121E49C92405A53C292245A5A1D22469A1F494F48DF48D3C517E5FFE5A3129B728AB94B8F203BA4803D451EAB56AADBA5EDDA57E64988CDC7990EC24BBDB6FF4C109B69C0D613BC903B454CAC6A8E80FC8CF93C83456459153E95658439740332D90EF50FAD3FE30829C952248EB77E8D3F43CEDCFAA60188C21B3F85FDFE03FC529BD8C45857490B448FB716E7FC09EEF5034584ABF5734D208A9FF7EED77AC871465EF93CFD87150A567C8E792093CD0425F62A3900BDE9006C8E349983D415E63F36109D949871062BA6858877C3C025E46BD30164AE0024B62403C02B9A88CFD95DC4366D34F480BCAF11AF2184C9366900748292C26DF9017512A3ACBBF56BA282E788FDE2CADA559D04CA8B48D7F870205C064275901B56CB3F23DFD942C24472513F992BD8AD81FA5AFB12AE9AC3C1A66A2042C21ABC8FCE47272A73C5EFA10661006D5A4503A81DA6D312B91C2582E43AD321175DA2E94EEBDA80706B22A6CF122E70C47BE18871A62331E8FA39E9090836E4619BF0EB5D81F48B33296C6C90CD90AA8750891DE4F8C2613922F924DC919E4D7C9874837D407AB938BB1C7ADE46BB29E6C859589BBC83C8C4E3F45D91E2E5F458FCA5725BBD1B5F4533A866EECB8BE48ED42F092EFF0780D6F06C8FBC85AE9CF640CA94CAE4BFE09B9BB136AD84DE446F47E4FE22CCFE008BF620748696204DD91BC8ACDC3F91E27D7265F4A06C1446626E79091643F794195C914358A6BDC001FE27CEF22D3E9E8E402363D7133D2613D5281FFADA185A87FEE95E64BF748FF22EB50E637A2BED98272F3324A0E977D2292F0A80C65BEBDAE9241CD144E2A6A9C6E8A6511593AC98849954E02C93628F249CAF623931951E57427DEA87EBEA2B562847EAEA2AAB58254625DBF84979E3DC2F6B0BD102FE8E4934B2176E0524C261749483AC0BF3E68405AAC471B261323D9D8B0323A7E872232FC94C871FA7ACC6CA8504CC67E5285D20FA0F864EB4952D97AAAD2B7C32F9E46F029258AC9FC3E33F693FB4A15A42FC2B10A4A4300F0BEC9645E1E7EE67174D411ABDA8A2ABD453F895D9CD4CF90CACA2ABDF5143AE94D323A50A057E81535353D7BF87099D498827107F15656E61C2929EED1B3268BD94BED8CF52E757D5376BCD77347610E33C290C4BE4B3F261E397204E770036BA2B78B3998C9C37C0E48C6E485A6BCC25E723C79219617E9DCCBAC98707930089465C57CC668303046896AA830D98CF5466A444F27E6B2D87A19BF042655508859ECBD205B9BFF9297A31EE514D55BA3B51582B01CD9D60ABC80DD515ECECF9E3D201AF5C53490541391150CB35213D00F79CAC5041077562AAE1B4A8E74FBA2E7911EAC093C67CF26BE4D5D79BC35019B8AC42C2AF81C622E223390CF50C2968760035098A5707CF4F3B52DA4B20552E3FA76E29C6262B49C23E597075BD35D0CE1F8E73F1367B0EFC5896BE964F918D1C908D1B7A9C886C19E4335E87A1C4A9BC8D356039631BBFAB4F506C27416628CBD6A7F729D18AEF57C8B7E1EC7ACA84466825A5F13B1A9C0A787A34184DA7B95F5292B55543C5C3AC0F147FF503561FFF23B8BAEC88F423471ED7EB800D6339FB55EFCA066EDC67D6F24828910E980D16D0223AD13EDA453A34907E230729C4C4F33C0B2993CCD6EB0C693679B759D8EC3CA85669B4D544E365B2CA2F2B798CD64A2E36CD6A0955A5F75A4B1E6EEDBCF30079B318379563EB1F72A8AE051EAF6B85D3A6D5D8E8B987745D1A2E5FB27541D4D5C0B27E02FFBF76C5C3BE1C38BAD9F9D49FC9DFFEF9A81BC9CF812EE41BFC844A671BC779A50485F51E2302A16118C0F26A82026CAF086287DD57E23D16ECC452DB805D7758B990B038AC2B9937A0BF20F2E2367A616BD552C275F4D5501BE23C757B3F80862598A8BE954D4A23E7DCA761D19755D49791F76E4C8FCFB2255D953AE476C06429CCEA2B7A0A6B84250317B1E9DC76815542122F984E6C8F310285B9A773FE7E393B5FA29525CD5D2B307998FC4682431A445710E1F26AB77D835907686F8CE9DF8C25EF17FA13B82BD96895EBD944FA9223591D789B40561B648622EE76B053722EA4D6D88A7D1DE7B048593E71192DFD0725C6996A2D81EC2925F363ACB693CF9652CE42C7F8C01654FB3D71965B71170F2CFA200614DEC34A1A79103B6ED44EDDFB408C7AAD0CFB5E8A9D55C2D778FD62ED10FF15545C96B421D9859571794026CDB90189F2DFFED27270AE2B8E437925D3E809C960B09A1E1686A5B332720C9CE80C5E241F13F2DB88A5762D99CAD8C76A2F116E2D634BC6ABC8D14234B1DC1CB119CB198734A5776ECE91CF6A4F09E4E217F8ACA9958B6D9ACF02E75DE42744DE357DED6D6E5E53E63232465355D635E637BCF2A1B55B3970EC91AEEBA26FB4ADFD8AC89AE89D9A37DB3D5D9E6A959735CB3B327FBEEA4B72BB79917D9562B8FAB1BF5F7BC9FD18F958FCD9FDB72DA501AA827CF118D68B83CD5C493FC3BEA4873BA7E0123090BC462F66A4F9D3116CEEFD503A5C3A8A33E1C68C2973280460C7604E0EE6AE386A05DD3B438C49AABED56B3395531582C5869AAB6D711AE4835EC89FF313C4A32A0C490062529D05DD56443E0DDFB38FFE0D46BA32D78E5D5DAF9A29A2605D4CE27B50DF4CA86D8A8F1CD4A285BF7A31A68A421F36F9327881B4F079E363CFBF21FE0595353E3DB6171C65971F31C8B45CAC14AE31C09038BCA686594B3B9EEE8535AE2763B50DC95FCBCA24896EE2E2DE963D723F979AA326EF6B12DB7352E1834EBD8331FDDF9E09E6D8B176FDBB674F135B5F4184870C5AB939A12C9CF1289C4C1ED8FEF8627138F7D7F165DFE59676E5E853C7E1C4DE945E431135839873599DA669EA99832D422998A29458B36A2C4C2D58CDB9DD9D232BA9E6E3248AF4A60248A4C9951068DC26193A0AE89AF1301BEED144F9E105A112BDFC5EC825DFD825DAD825D915AB16CCE8C198E13DC97A3C931B47432EFCBCAFB922184F11595B3CD7BA102569294AA989F5A11F1C39B944F51E929073BB776B5A41695BBF8A1D9A3605462B26C04CDC8695DE92847AD820A0D291ECEB72B8ADA1BD55729BDD83CF0D8D8C7BE2A5E20DD356071F0B5A18727E11C2A50BA55A45C80165DF63E6246BB6EF1666529E32C5CA0EC7651391333EA3AD6024E39C005D5C3010201FE34E0B7E29380C6671888D37D8893C9E30905753BBA224144A5F8238E50F11152CC192C5AC9AF874AB808D3B6013587838A0163469B9D66C63911333BB2E8B88093B7F1BE1BB16BAE30CC663ACEC3AD8FA0F62F8DC6A59A8FC7471383C586F697FB2BFBE437957DEABB86F7FCEAD55A8D36D63A5B9B665DE4589475AF63BFE3EB9CAF7D6773B437CDBBB368C0A41B14E5B03FC7E9F7E718FC39A8290D397E6609E871FA7CD3483BD8E3E0DDC9F1241CB126A09AA983B89BDA89BBA94DDC2DD5A63ACF3154B45CE4611F5D4E424487BE31CDBEB312E3DCB9741995E85E5A4082B07E8710D25A54BCE7A35CFF0AE944EFA7B2A5B5F6A4DDC1F9012FABADDDA35654C7292B9616D998D1A7FBF55C3DA02BBFC5A05F4541356069C43323AF7D6B482DD4DE8A52CB97D6E253550B0DC45969F31CAA392D427A9D69E9B597DB4B91A4C85285AE70A40C19AA4F9FDEBD506E857144A14633891E88A24AEAA532EA297C6EF3F75B37DD75F713B027EBC21F8F9DFFD54B6F3F3B31B07DFBC08AA907961EFAFAA6D90F3FB136EBE8A7DF6D1FFFF2FEE7D74CE9899C589D3C25B99113A370BE9D9530677B637C7DBD7E025C64A21ADE40E77C93C5A6D90226536757C02F053AFBE5CE967C8BE6CD46F725A473210CA911CE251C3C52CC753C1A743C88A31CFD42B46338999677F4771CE5FAA168093F397FF4902D6ECB10CB2A8B34C47E9DFD361F1BED9EA3CF724E732FB4DCE95C6559EBBCD7F782C564D62C5649051C0F3823F04F81F6014F9E58A077B3A6B924EF5EFA3CC9A6336346C44E46F42C8E0E7CE168C7178E7666C0513729343744435E2E47A17AB5C34B6ABB97D4762FA97511613B2240227A84E2ACCFEDE6EF473674F3C6A16F63F631D80B7DD10D381033B759860D5DE3F0509AB9A22D82BDD2CAFF5CB4B6CD06B49EE46284FE11E7B514ABB5B157A31C62289DC846355C1DC17CCE44184A48F99AC56642DED939C766F37796B0B67B4E674BB6D7EB77098EF20B8E2A292EE54C551C2D2D29C7A2945B873237B70682ABD4B2B66A86C13887A9FC4AF2F322D5CDC147672F7BFDD925A5C39D0E735D7CD5AC9BD7399BC3DFBD76C7E1D9374DBB7B43E2F4C76F25E11EEFA6D50D772F7EC6F914BD63C9D4BB57AC08ED7C7746E3B4494F740FBCF1C081C43F4FF1082C0735A08E7EBF8958A89F73DE7EA2257F4A91BDB9DAA2A40D889CB1244AA6626CB32D998A9CB12D4AA6626CB336998A6A48031B321535639D0D863698B46932642A72A6A2642AC64C256DC76265D58EF1DA4C6DB3B64D7B4F9387B3E1964724E64095453485A9B2C9CC54B48616CB6126391993988550CD22A96C1FDD878E23852D3113FFAB729A460E9BA438BD69B72C9B62B9C15EA68C9933A57C2A5139239C2B531CCA6216359697DF4BAD0FF75637D8289751B3C5D98B509D8628A3FC65FE0E564EEEE2EFD09DD638AC13ACF737EE7B702B778EDB840AFD942E8C1C46D0E72BECE5E522C45ADD3D2AA166B3D96C68F644C2DB82EEABA31CEDC44731736939CBEB56CEA4DCDC0A912E4646449898538B99CBB5FA51E55A2C52AEE5F9B1EC569E4A28C32FECA790A86F9726191566A17156B29BBB2E449332A6345A5A5A92B2A5F6706F28B597BAF2EDCC0E7463EB0AFAE4C3EFBCD39CE80D935E60BB2E5DF342E219D4DC8FB6CE4685C0BDDEB0FC22DA5555782459191E71642A595A7AB51D994A96965E520756F670414F29C13D0490AA164E46F05B4D0197CBEFE046D66C93A480DF6205A27AD105112EB4A80885C9CD1F57785C90711AAD8750C9711DD7CB21CCB44D5C87E5DC99BB367763D64B5907B58FB5CF7D066396D7DA258765995C8EACACC3569BD39AE5B4DA2CA8E762597CE898750B4679565BCC05693476DB2438C675201AC3989D23649FA4CFD597E9EB7549FFAF759857E8302F4611BA977A333ACCBB21E4D80FBD890D1E45C8BE8DD69DBFA4CB821D7559076D56CBA33CD45F8206B5A8696A791664B5A17B5446B622ED0D66B3B187DCC3BC17ED24137A8D6BB6F9B57C1322E36811E2B76459D1DF905C290DE772D9FC927077FD169B032D67E31C9B943198C5FC447EB1A7EC667BF5863A2D2BEC0A33D46BC4E554D1178E8C7BC3B569CEDDCDDBD75DB7AED3B607E8A7ADBB47AE78F0001816DC7FEE7F5AA15E5F7BDFA16737378EAC74D31F5E4DDC363171FE8FEF3ED87802A75F859CE642BB994BBAC0B7ED2C67D0064198040C7C9D02310B582CE84EF9E4BC80D3620A0029D4B9A325622D3DE0D139EB7884DDF48858CB930E8C8E7C7444FF5D86856A5BF443B59C85BACDCE86C16ACC35387B706882636C68369BA64E33CC724C0B2D302CF4AF34ACF27F6CF8C86D57437C0D8B522A401997CF9D391FAF85C5038ED6280B45C47C708CFBA2716E31334802B75D64676107FE296CC73F85EDF8A7B04E17FCA303D15155E1DCCEEEE63EB7BEA12BEAA8BE4D818CD005326A38805A739FE82700E5314BA5679267AE679947F2E86900A48650ABD66A8F9B77E571739C3D715AD0146D0B9D52B6B23DBFB5A40CA7309848B036E6DAC31DB0E6A2507E281CCF7017EF80DBCE1ADF4E00D964E92478CA62F139F3044F392D3E59984C9F7C99A74A52DC046AA448444D8ACAADA383BB5FF979C4AE97715B09CE76BCC62E3679BB5E3DBB7AE0B81BE9C0FD339A5B6FFF60C55F12279FBCF7F4F62F5ACB463E30E2D6E79FBD6BD1CBD218EBAC1E553D069CF9DFA993133F7EB8B665290C83C5B0EDADAD6F5FFAA2F6E59AF8538FBFFE3AAED214B4976EF925A4FD7D223B613D640109FF51836444A3C215530F0A9251B3D43146F9B28C145E2DA33936439DF1FF9091C8959328ABC4622E2CC3D82EDB9A16609EA69C5F5175AE65847E9EC73C3CDBC0BD5DF41052AE2DCAA3AFD9A831E4152E6B2064ADB4329D41510853D4FC3E0E47D914B6735DA265581FDB1E76F73FEE957EDABEEED184237131FEF976F80EDE7D82303206A5261BA5C643F2490FFACE65B969D6882FD09D9B318C6FE8B8EEDD1DE18022770A382C016EF04592E2DC2E91A388DA785E8C8B8E2D1390F08A7868F3B24CD28C65A0589BC8B10297C6C15DA247971039D7E55C44C74407B7412D22D9988ACE760B44940C224A0A919322EF61CB98D9F4F8BC0D2B976279BC910FCBDF7409DDEF1233BD3CBFCC60381614A711C89C5CEAAB7ABBA1B3FB6AF7D59153DAB73D64630F584296C062698161BEF9566DA16591E73EB216D649AB0CCBCD2BB45596FB3DBFB7BF93E5D048C04B341C694B776847CC0E721D6827D7818C5CEFAA0ED4BD6904E340079D41A2EDA0A3EDA0A3EDB440B4CE160BA116B001B1E9366A8BC383CD25DE8CE87B33A2EFCD2441BC750D0C589CCE682AC8001564800A324995823A5726540FB9622EEADAD0F3DD8CAD110646244FCEB5D99B36E7D9515E2B48994A14B7A981BCE489467F28079540632854CC8B6E21F4D94FECE81C125A2165776A6F9D4FE6635CD68494EB2ED482CFA7383A09B5E0B02861A11694766A41E49E2112E9DD2B1D8C655C65822D59CE76DAA0BD6A8059F3E69C7AF3C077B36F597D7FE2FCA79F26CE3F78E3AAD93357DE7BD38C35FDAEDE3066F9D6ED772F7B89F93A3F3E6BCB67C7B7DCF458E7AE87D6EC4FA29B7F60FD5B3076E68A7B264D5DBDE252B26AC3C817EBEF7E792B49E7FBB8640548173AE1724E61B73988D6BDD08EB6FDBC604B6EE4855DF0F2444927CE975EBB604CBBC897D8BDF6AE5173A700CF2B8FB432ABD54946018820D0A2DB9571C05D8D3C1E7C736A1F8AD696088D5B22088E3CCB8548E7F6EB8BDFB5E519DA2171D95D8A7511FE925DC8E27F18B5E358FF365471FB816243FBE50C77C7F2AF775F977F139BE3BE256746FEA29C25817539F70536BBB7E5ECCFF9CE7D2A743E947585FB29F77637EBD7799A423B05465A2771BFCACF078163A352D6B0990F1B1C58D48EF783ED783F98E17D5E8772626E07674E9E6F8333B7833343DF98BDA3B3B5A12BB7B53BD1D666A4A030230585192928ACB3B749813D66A7F60DD10E528026302D0169FE6F73B92E9BC07DA4087DABFCE489A670480965F20FF3A1B6461840C96C4D1940A4799B53252C61FB2C449B014CB9530368EF5E45DCF2614990F11D7691598C80606F97E0FB79DBDD8BA78C5932AA0FF4D977CBAE4BA0BEB3BEE5AE453F3CFBEA67F4FD1716DCD1B86DF19267608CBEE8D7C3977D324FF356CF06C327C741DF9CF86BE2EF896F124DAFBDC97AFD66D7A127D6A1F92394FFB52BB906E3459558E95ACEDF0373D13FBFD02EE973A9AD6E6CD72EB7AB4B997ABB305091DAE2414DFB6DFA959F528B88608AD9FCDBF4BBE7328D54CB34C2E546C5948922DD99946726C030678259932913B1662A466B068D4C8B9A6AD95D0D569B2E02B8BF37A72B1784DC526ECE6A842512564516D762BD873EC330D338595FC336E8EFC9EF2807F4B3BAD920D740351DA5CF3437E8FFD0FE61F987D528699245B232B3C9284B9266B11A1455D5B06E50341508E15B8736914E0DA99A131F51C6789B8BB7B190A439F12D6340960D018529713A2F662406EDDB18054AF78219759439E6D04264BACA468F928E4AC725B64102290E10338FD20EA8C735B641038DDFEB36F5A84A97A9F52A551FB67DFC67B149343F1B4FFCE76DD15B72B2F5961664C18A9C96CA93157CF3A8856F8144318458DDDD2BCAD4662406ACFAA143D6438756CBA9127D96610DE631C31A02D74E48C9C184F1CD928D19D4BDC9B37C9B34A5EF6F9D5FFB0B8169DBCFB7C3A0C459CF9836C76020201970A240119FD2CA4A91E84479C88752C8676196156691224565B4F48F74FC17AFB4FEE6994FE1874D57E5F94BE5BD3F5D05FB1383E904D8B8E7F6FBEF432F6823FA72DF222FDB45F4F0656A7F08192CD699EF8E48D255F9D5F937E5D7195718959B7316CAF38C75E67BE47BCC4A91DBC8BC455D02EE5C23DAF1D3EDF8FDF4CFB72D62DE6AA331CB11E8D2A57367E2CF0DE0020503013B3178F1DD44DBBBDE769ACD8BDA4B13EF9AAABD1145E36E94124F9E8A1572A5AD38B8C25614CE088A8163AA08D6539C9C2D95B1851DFAED183364FAD5AB0B239A9FF7AB99786F1A67668DF7A5E574451C7F162F9832E140202492FFA174E6FFBCB023A292CEFAFFD42CB836555152FB002691FBAF8DF69FE86DCBEBD756B4F2B4C708715F95CABDA57E97D3BC78E2FA56E8E803737B66E7DBDD20D270620FC0D7687474415778E71C8703482A754B0C909BF28E693BF7806F0ADAC3EDB268569A0FE192541637921FC667655C99F2FA461AD9FA7EDD4D3356AEBFAEFEAD758987E18AE57DAF1976D5DD4F253E875B6E885C39A1DFD847D725B6CB7B6BF64CBFE1C5D2A2FDF533764CEEC946DBDD37555D3DB7F3C52DAAD677F655A3EFE459DD9B92DFC8B7C9C7482E148BFDDAA974562E8594BB2C68733A3689D742A4C43295CC230B72EBC98ADC0D64B3FC0A7BC1B287355BDEB57C404EE6FE23D76E75E4DA73735917A593BD8B3F141C6AA9765EE7AACE9E29CFCEBDCB719F6333DB64DDECDF0ACFD3ADF63F59B38893E4E84E3D47E21B9D8D9DCA85E310EA54AEDB50807C59018DF90292518FD8AE2111FEB5444ED09359744F66D13DE94537557B222103A05E16B7966A83E014437660EAC4D4170AD15AB180B89658490781764FEAC3845ABE8F8691DEADBE9889FF61059BAE6B922FCE4A9AE76094948595C6391A4BAD9583670C52E950F028527E5E01AE89A3A0B444F2A8116ED2A8CBE9E0464D6A7EFB8AC4C1AF5B127FFECDEB70E5DBFF0B5DFBBF59FAF6C3DBFE3AF19653AB9EFB8AD29EDF5F7C0B7EFDE1D7306EC789F7BB6D79E8D9C4F70FEE4B7CBB763FF7D19E421B3601E5DE86EB92FA22C1110AC295869474DAF5808D183C1DA4A8E3CE65468A829C3046088A14BD518884D1247672BDA2450895B01039C15C3D4356DD94CE73E9298703854AFFAF85EAC78C505DC80855E017842A7D5BDB41927AF6B8F2CE581FE6530D8A4136480649C9F6E678A96236A10E3031C5E576BAB3DC4CF1314F181C56BC780DFE30B84DF63089F2FDB62EF85B0EB5BE1D44FF65514B4B99C7ED7163444E51C60AC325E9AD120CD7C34FC1BF5E99B0B46641DD88450F1E5999D801E50FBED07348D56373466C4FFC5EDEEBCA1D7E63E2E8A19712896D534AB6F7E939E4DB174FFDD825C077F19F45C6E1DFBA9A494BEAEB14450E180CAA4A98C497CC640C988941E53CEED41DBDD4B1EC9A902964A1A61C8B64A46D363E93956E5366C6FF07656634FE07ADA6F5BF3E2D05E925A8CA28B6DAAA73277FA6C9B8372E1B84D6926520C60C29A59F69AD14395DE1F4F9AC5470E92916BDF427B642DEBB3D51F96AC2B29DD306C30E6925D2C6488E09DAE409DAAC57A18D3C489A27423464A634C7FCFF498F9839F545425A7D257E460D53FF89FF911A2753F90CEE1777A0C46E41897F2381E3DF29B0957D71E96BDAD03A8ACFBEDFF6D69B10D35B50BFEE41FD5A082F89B9E7F89C3E179D5C043718B2C0C10A0A48D8E1A1852440850274716C01144FC0CA30143702448A0A0B3A487A413B492F6893744B75418831A461D16491D53F2928239CC2747AFF33C129C229B4F251E8ADF54550949B21766E86D8B96D4A3537123281A94DA99A44D867CA8E4CBDBE8352ADD26BCFA729A90B527297A72D3382E4C4FBD4F65439CF11A18C0F96F27DFE1C7FB69F295A442F7445821143A114C92FF45A72C3C46DCB0A23B0332BA4E25D9E5C1806BF1985DD69C74BC0180E93028617F1613C0A3DFFDCACCD11E3E24F6A7DBB59ACA0206C1569A89D7300AC3C222FD93D47313AB2B2AC1EA1D2ADACC33E975DECCA73BDDEBBD0DE41B3BB3D6A778AAA9D7FC0E57448A8DCCBEC6C38BD657DE2832D9F249E6E6E82519F3F0DF050E4F5F08DBBE6AE7CFBF670DFD5401F5C7A7600AD7C155A4FDC5AB7076EF8E463A86B9E117FA4C7BCFAAA6B578C5CF3F4A1C485FA296560471E791EB57D1ED71D7055CAC3B32027B8B35CBD2416309AB6983E3051934CA9D9805AB1032B18DAB18221C30A3BAB0D215555F81ED0FFA5EC5B00A3A8CEB6E79CB9DF6767EF97647793CDE6B2090949082CC4665041B94950592EB22556F102A804857AADB1AD804A95DA5FABAD56ACD6A2D6124808F9C04F53CA6FB5ADC5AFF552A9177E3F506A45F92DA50AC9E63FE7CCCC66A3EDDF7EC0CEBC3B1936BBE7BCEFF3DEDF25C61862014B260619891F7338CAEB274619204659BE47052A945D3E905D3E906D3ED89D93134E35C59025A137F56F089FE0085F892E08385094504142ED54BBD4352A336D492893EF2E9651147583CD4E99769B9B48415336DF48140440A6362DA15DB5D4D5344D01646E0B2C2402D931666BE3A07E123D2AD1F1F17DF0D4BE7D231CBB67E409B8F4D44CD837320F7D1AFC6D20B7A135A74127C9FF40F7F3D32E0179672168444C571D37EEF3E282532E8D6E65155B61D28828DE7ADADE0F72AB430FE430D6415C5CD237E50C5264D2D7D26A9F1B9AEC734DAD7DAEACB2CF65E5F63914B18B52EA54A335C16E61B7B348DE91BD720FB595EAA59846CAA23AA977A9E3146B26D0C52D14CDDAC93EBC372167CF3E72F7EC6377CF4E5A86EDC4913DFB31F3FA9212657DD6B2C53B7B90A7965FD2BDB67DA4E802E12C20319D8AFE4F1F0247E85498E1D57F7E1FF666D03A4F1EFD80BE187B30204CF0CF58012FE7AE83EBB84DEA260F2712D4EB9731E80D82483F53AE8BE23816174B585C1C6371312D49FF862CF4E584B48C6349F8E3CB6EEA4DB6D502216C3B175FB1481A41CE27BC20E1B5BC9DDE2E2FE305698A5429D83AF643979FDF7294C91C73C05DAE6346BEFB64D13B400EA81D673996412B851069175A455167882E459F91AC55667C62BD6D125A389226484FDBCEAFB964D6CA9A7D4B7EF1CD5FBC0CB686B6DD7CD6B5DFA03F1D0E0FFE7AE53B58A722CF903D1F6306BC90AC6B395D31392B8853ABA5495C9B748EB488DE40BF41F3EBA537E93791E984519F987C35EC66E64EF629E6438195183089799DC1D5BD872CD14CB6D2097C40E6789F9235F1D53EF45C70CE0C3E9791F3509F19C0D7DFB1CE0AA3DF595575862086C3673075A1D099C8EDE345491424966698042BF958163D4388C4F910284912C5420620D142722BD15006143308A75A7A130BB6B2BDEC107B8865D8D902BE2637F120815CFE5E9EE607E186BE7F8A504835C989FFA9CBF7E99871B40D87133263F6E848BEFBD809F4C08AA51DC34F7B3B7E206CC131055CC783CE2192F6E605A35D6807737A4317CCE98D8E4510B093FEC7294BECC82A7E72BC4FF1E0A53D6E0511C1199AA7553034A355C49464209176FABC9664C6040BA7CA3D62055AE3FA7096C18F8A681609F53B03014406B21CDE02D9CC0A15BE2C63F9B2784B765521D29F2D894D2CC1AF0CBAD7E633140E6244D14B721C43A3AD20E8C98C43CF16A4AA5B1C19064980FEF19EFBF7C13F027EE441F8CD516AE4E47104A4B5F08D919F0F3F00DFFFB0C0D8BCC8D491CAECC7ED5A650091E662292181E339F0A7BB78584455DADD3CBA68D3D1FFB68D7BF24BBE05F78F7C8BF7F3B6498BCD378A76CD575BE45CEDE0479FEAF708A3FE4A2CD407288AD3D12730685B1B0875B20DE81011E332FD085A6C252768AA879853084911C1E2FABB1A4C2926FE31AB2BB448012888B246092294648E6090E100D0A901024006858B369C4FFE99FBC987FBC7D5D3E23C53C7D090F1CA2B43B8C427E3B008E5D6D7C67902DE1C39D2E4C890234B8E02E6F64A4C41621523A30B9B7FDA5864502247DE0D1C0A7881E3A44689054A42325B75726091170C34E4C7A0C5243526F8D508415E642FCC512665C09CA53AE637E76E1779590A67AD32271A4F10970F8994FD61F2259AC41682A8752B0575C107A302B35ED9A0BC88965299A5CCD2E95AA64AADD716D31731EBD5EBB58DAA204356C8AA6DDA7C38873E9BB78479EA999AF4007C90BE9FBF5FD846FF94E74CA86B5A130B1110414151D5265640A4A09CAF9F0F2C00A12088928C94A4A619789FBACC1E139A7BE036A43E26EE6413C22098B84B11253768EB44662D3127252CE55619C87BD0C7D6808CEE8583E8A4036ABA5412DCA7882E52B0214525F435063006616E7782ED627B58A4A1E1B63E0FB683C2B8EC3DDF1E1A21BA03C733D1B348C9D3C379CCBFEDA4BBC2FD1B318E9138E7C65B4898139D90AE29863317FF27A520C343187D9D82A3AF9330E69C5E05FDACA614A8D4D1CF766812FEA153BDF3EA4032ABD5274905CFC0E4ACD63C9990BB1AD055A74A27B3646D771EA1094E0D5078BF548CE72C6EA587BA13F8C47F6D6B0079E8C1B6C92089CC3150093C0F8014B8A829109E049603766F21B7BDB098DD73FAD3EF9EDBF9437AF8D44CE637A72731874E63447808E9B838F61B2124524987DCC0BBE0C63477E64CD9354C85901220495CA4AF034E36B7D2E33973A1A0902344F6122F203524409EA605918150E405864666C4E9A21941979811B47B7D17C2288E635DF3892D9AD4AC2DEBC8D2B52244E0F2091924E44EB94B5E23F7C8AC2C94FAB08E579BB06D6915BDE57FCF9765BE6C4E177DD9126B2D93CFB4137EC9779FF8A2FD6CE2446736BB9121CCE2EA257AF4D06EA48E84043A50A490666213F6A91027F40BD6CC2C5AC2A1819959C16AB6C9E62C8FB4110ED80D8411D96C93F86AA5DDAF20576679CD871E5EFCFCC480179165365986483F263FDB51544FA044EA6D4652688102FC17D5921D1D6D01D8A4079E877E45C33DBF1A2E20AEB98DB915714CCFE91E3CC90879DA6FB3AF521A1505B64D3427A2039FE1F34583D128C3188C4F0ECA51E6C9E080F682460783A1284C94599EF9DEF9412BB2985D2C2E32167A967B97069787729145D1BB820F42235C4ED366B92CFAC7D99AFE1226F1BBB6E640CE9F4EF0807FAEA4358047BC88B797770D6E1E27FDF1A6F2D89AC4FBCABB69561E6F3801653ED25306CA745765EA2E0BE945CF5C4F63CE29760D382EBA37477125B81B8E5D3216E970E39FF922B3CCFB622B413EDF1DDD219B24F0298B749878C9345DD21D40259B191C3723DEF164836A69A63CAD305D59415D023681B6DF80994FF717069E3F50D8B3ED4550F6C69F40F4863F7FF7778537E0AFC155E0E17D859FBCF56E61EBAE17C1D2E70A7F2F1C00AD20DA07E4EF158ED8114F6604C9BA4A85C004DBA25DE159E583738C39BE8B8C8B7C8CAC942320A782213B5E648EDB907F58B0DB9733D3C25EB43D769643CB09249320188E523C6199789D84482202D0BF484875575C75575C2D1A29EAFF34F0F4E5305CB8D45619CB2E74DB5BE26C871B8723CE2E0E65ECD0141280D2341C800AFDE3005473B01CA27D49263D882E063361EDBDF356DFBBE4E3C24B854DE0A6677F949F3BF1DB853BD83D9AB962E0AABD8591919FD160F3ADCBBEE55771CC79F1E8DDECC7487EFC540DA4C90EDCB73CFD481A864393FD508E31711CB4F1C57D955C1DDB10CCA4A7B1EDC1A9E9B9ECDCE0AC749E5D58B9387D0D7B137D23BB99DECCDE47FD807E9C7A9A7E8D7A2D70843A123C128AC4D80C55C74E63993C7B6FE8FEF46B69A62A50976E0D64D3B342B36233E2332AE7A473C262CF42FFD2D8D2B25C7C516251C595EC65FE55E99BD277C7EE4EFF29F4563A2C87801FE9A29DD12C85EB4B9BA25926E40BD5B1535906D2811A9AAF4987022CC525696F8485F809C5A6CACB751A0AA9725E8C8C639A4809D3444A125A91B4378477D7EB0AADD77501BD587AF1FE7A5DA1F516D9C83B1B4612753D75B02EE9B251D265A36451709369A420E4A2BCCA21E27D127995C3B563F23A26AEF31CD7C4955692B770A269C12CE569315E325ECA3B890C6A2D56CADD6BA3969FA5285E0FA5D3A9F29A4020A5438BA6F914916D5ED4CB896CEB8E6CB7D8ED288DF840CA21890B501508F2E96AAE241086451F5D6D7364DE83016072BA9AF9DBC6B5D91F3DFCD8FFFE55E1D9EDBD60C64B1807AE1E797FDB554F23F17FB3F01E88BE75C5B28B563C9CCF6CCCDE74D1105876F04D70E99E5F147E727057E1DDEF34E61F02D99D40FA5EE18D02BAB9F0BBEA6961CC8F8F22EDFF0C42841055016F25FC9834650D986DB1A5F1CB84ABE28C481A760472E4C93185830978A3485B0C261497905DC21C1C7DAFCF8CB4A2F3F1BE8AEA560F7E5E56DD6A3867DD39A39FFFB1AF2C6DFF1CDD6F3867FC736B1622AAB4D9B1D9890BE465B1AB626BC5EBB51BF4DBA54DFAF7D527F541FDA8F6816E202C4F78749FC7A37B744534A3301909489C893B69D890280682917079F0B9D1A192BCCD901D990B06A96405C1B910E2444D281FC7B7E38BB18A2191F2B4F610E776EA712E3291705F9804FE38927DCD27526B523D293A5511825FAABC2AC25DE8DF853BEE9FDA2695D8B1FE729CDDD140E1C32127F7830D5907F590EF8D9E641B49DF8CDD36C316BB184BFE60838114924B82A5677563AAC79C8A4D08D04D6C580D59229170D6836C15133D342B9635908B6C54C4D1A3687C2C89EE14C338146CC9ABC3610AE8C8EA001544301C7CB5E3895F48CD0603416F253D012284AD24684B4AB5928FC23BF7FFF6C65FFF615ECDC2B9A327F62DBC7A514372CEFF018FDE7EFF79DF7FACD0C4EE99FFE20D0FBD5E56953A6F5DA11B4CFCF6E629323FB28E6E997CC33957E00EB965A31F307F61FF4035D1D349CD8A87AA2EA90A4A97D0C5BA5AB45F86B38361978820627A9CDCA796E4FA95125A2EA1632574D4A5916F1E721802BA04B009AB2677097D09732D7D1DC354554FA2B3B1B3E859FCDCB219F1B35333AB2FA097F0CBCA16D5DCE1D52A71E201334FCA25AA5C22ED12D52E5149F8CABED926AA5C22ED12D53852391353356A3A05537475559BDE5A7976D58CC6A5895CE5C2AAD5F24A759576996F45E806F946F546FD16635DEADAAA0DF49DF21DEA9DFA778CDB53DFAABA57BD5FBFDF5FEEB8CD0DC9B4194D47C4742D4853546DC4649A27A6A915087AD4861BA2774461B42AA036945757812A36C01653A56C7983585E1EA089E984D306793BBF814F79D283D378CCFE1BB51AAA529A2AB3C958597954E03986861CA84A55A06B1C5B1E6D88585886EE41B6C7B100D5401240C4A130400274822EB0066C011C1804BD96D2509EF07ACF5C887F318B455AC5CFF05B419F60B638AE58737CC8B458AC29A6A95A508BCD4E4D830B6BF1E721225C1B694E2A5FD2586E0D265A239036B1E783FF97E9228059ACFE312FC440119EE82485F2F30E9360A8936D77351949B9E3463F63249F398C0F27F04A2121C7E63DAE985882C3A4DD63320E4A9F10898FEE0651D0100D34B024A4D32007CA893514A0DD8C241257BBF4AC1CB6343B49DD543529BA241D4A4E8EDEEF0B0698209167ACDED2CB76ABCB5FBCE59AA72EE85C36ADB07AC195977FE3D3FFF5D8E71BD83DFA334FF63E9A9D02DE5CDC73E386D30FFFAAF0D707C11BC6D5DF5974E6B567CFB8BC32787166F2632BAEF9C5A557FEF636EDAEBB6FBB687E4BCBAA9A69BBD6AF3B70ED7564664113B26AF7E05A3410241E2CE7422EEF129C9B65E0FF65968173B30CFCBFC83220FC66613962368A7C51823808AFED4BD8A555BBB904808DB8AA16805DC0C9EB1CB56482F38203F29FBAF1B6F75CB41F76D1BD604772F02B0A030F9686DEF0040B63E470FE7D8374EE7738E99AE29F683F257034243B46137C6DEE709A7670EE147A0B65CC9D8528AB3EF3CCA9BFE2B57B14F973382BE603D3EC990C697D31B35878496002834E7EAC959926CC64660BEBF527D8A33AAF50D0831B5039D1374E61FA4A04C237961AF0A5A1EBD1C3A2470F0D274B7AC8F6E8613E1100894067007605D6047A0274E09F7A09033995244CDD78849470BAB26CED29B9B22315B5A7C43811345B7B4A45ED29E5FDD8B31FD39E76647A9E9177920C45E78DB80919EC27701EB4B603AB399182B2ED3A63E700B4781C7F8D641748A2C1C374EDBBB470FAD5DF154EADD977CE33B7BC3EC0EE19DEF17661F8B1BB81FA677AFEF0CEE7777D6D1F99354089C80A9B89BBEFE0598483D97AB785CE550D0C221C95238CCBC79C2AD2D43897B8344FF36951E5B88B09B5A21C88A31F16B59EE0D2FD39C9A7AACF39AFFBBE7B11A49C9A15E81252C48D16E1DB9C6A4E9072B37B882809EC5A26CEEF13CF52A258516001641BDF7ED978FB654F4B0B65472170F170AA910575540D5D25352A4D4A9772877087B84519528E2B7242E954200365013A05D52250641277EEE820C587E87F4BA29810589F20B014123EC8FA206445F4ABFE9C9028415C218015502049BB9A6CA7007A842D027A0E80A542AB26BB1C827BE02310427CC593603B59D8C476B15BD821F638CBB28370539FDCB5CD0E2576E30E75FC0819F64C8848F858C89E0BE1D444E292483B54E81B0B07EEA474C484FF77A768027C127C38BEEDD6BCCFE9AD4177B72D584AE6C7E06F14208103DC20F3E5AE3D02D8032C25086E2007FB1449D06207035B009C3EF2E2EFC12D13E2150D60F30B23FBD83DA7DFE85973FDF54C2DC91B2217805F8FAD7FF877BBE75377790BED1D92408745B4122ED347478A77D0E3EE70F94D1FABC265B8621EA284F16C8676B521ED12E8F7B95695865EC2E549BD843FF51205AC8CBE8A7E8DEA94083BB4D592ABA5D29E5A331DCA526D4857B5856651E7786699E78416538B3C8BCD4521E301E1011D7A42388D6690A363A9B4182012CEF85BD956E56CF66C658EFF42F642E522FFA5ECA5CA2AFF75EC75CA4D7E9DF5E3E8BC898C581D9235EFB0836741629460EE2BA71996851C8FB84F42F023AA9AAE2B3EAF69E2AF4F0A21BFBABD8FA542097C564C0F3E5B4BFD8298A0583CAF08E130A042AC2094FB433EBF3F642AA258EE3711697A145D4F181E9F61784C5111427E56F718088CD15B62E990A1EBA288D800BDA790697A3C9410090623C674112CA01268C516507EF4B028162C1848E04ABF707810DCB5C3761EF291F0BC9148686424121E099D3763C5D9EF173D0637088E9D0567CE905BE23BAF34243EFE84D872A366ECDF8F0EEDFB5DAAF480D85C476CEE29110A53C24D11B60854A19FD595C6CF89243841776DEC077D8AC55A78E20620E99AB579AA18EE2CD18996AA98080BD09601E8179C8A611C3AB765C56BCB8AD744276F0BA804B87218801F156EFAD5BBA9C81409043FFCFDFCCA58C3FBBF2C5CBDB7F09B6A3EE82BBC84B0BCE3FBF7FD2545BF3312297CF4D7BBFAE99F9F9AC9E43727569C73FA3107D16721C9F2D28B89A721534649BA4277E9FE9CA758BDAE8DC98D59BC288C15BFB35C5174DC9FAA63DE8437E45E14BFE462587539646086414086B566AD770A984C4F11A68853D4A9DA2473B25732BD38276DE283E624A255E75C9AA0B656E30C75C2CD617F1D7C5D8669A696AF91EBB4B4D9C64C15A6CAF815CF152E64F2C23279A976A1793958C1AC1456C9576A2BCC75CC8D02761BBE6E7EDDBB81B993BF53BA8F1914769B2F302F096F307F14DED45E373F608E0A47B5F7CD7A8E8C13513CC84E0FE0A32CE02302CCCFFA30E1C8ACAC507E9F11923C1CF6C18F5A1AA60C8E822A52311092A83CE657C416B678E691648A22C0DF6C45237BCCAB6BAA0A0C43F5985EAF8CB60DAA32AD7825197006F48A92D79BA044A4A2451AAA6A42A17D8A4223F542D3107A55555128A1D10FFC48D2128AA5408463CB7727A42DD290444B836070D77247930C5A12D76F199DC6018336D04D9694A0C23EFFBE24D62499F34E60F9CB878E848FE58FE5114144303F4E0637B2E3C40DB7ECA23FBA8E25AC5DD85F7AB2256CFF12A21EECF866512688E72EE31C42380BB0D71E8A664D5C1A1CCD7AED13837BF7A259A1229AC503C976C6705E6AC88AC7B25EE4E1D3E8A16A8160BBD70C04CF104444D10CA2649C979860A2D734B3B252963C035065C97659C214C494E20DA26BDE20BA862988A8F1525A2AB64B40F7171D93E86E55C09943E8E42B70B8008CE939576A4538B9A07C00A40B2A279E05AAFF30320233C70BF7C49313FD852D70183E57D8B4AEA37311B87D64DEF0E7506E98D4595E0078FAB4637F29B08BD85F32EB98370A224A9C00B5C409704CA2623789C215B52118679515A72830C8109DEE75ECB3E112FBEC5489273966ABE96E0186EBBC28FFC279D99D13C4A934330DEDDB077D6610CBEC07968608268C0E343E8838DE1622E2FC476B1A22981A743091140B7552A3C65C01AEE0AE90DFE1182C1F9CC08B1C2772B42829B8A63921C93E4992399A13691C2808E0AB7402026460014E9139805C0E200FC2B0254A12121964E769833064898A78BE25F5481009C52E4B95652541D1E7CF87F710E1D865E1B9593E370866C9C441521CA7E83DC74D82A1015573048618E7D8173A668CD8A7F7B12FD48E6892EE469A6AE3844C4640D6174B3A5330B511F7A318E830A73788B448ACA41345504485D983E0971E3D61776461371990E097484A43D00309C63B3BC238AEB5E41F32ADA36C760299C3E12E69B58C1C84318E253314882B36C6B51E386DE4371F8164E78C33BF0A62EF8DEC8657D1F30A336FBEF9DA2D60FB70DFC8F7B06F508BBCDB5ECC9BE002DB462BB1E7BF38586367CED4B0B4EAAAA7F55C708E70AE484B822C3AB6B2A52994A602B95C41C6493987D071A4BD6364BF838C99A719B47F0030A2C40892942E4BB6D648E073E46A250083CC1246AA9163AD001F30F7F4A13383B9C88BAFA2FFC296F31C94A5728489D25E8027B831686BA314DF2458C8C09EAD74C8408E688062B9055458C57E2D323DE69D40E086AB82DBE79DE86E370E1BC3C542E9764F96AC2F19B3D68D514F331CEB61ED12D2054D6A77445891CC825012C3D53BBBC2595841362943F00F6D072591F2546423732CF18B39C72FCE34931971A06D32768E019FF4D7C24F3ACF1DFE1D13197E6909BDAD9F7EFAD2D9CF3C33CC5FFE0C8E94CF1E3DCAC498AF50F8DB6A2B88AF5C2FAA625D588DD4D5AA757559B5CD3F393AB56E565D5ECDD7AD54AFACEB6ABA53DD50FB83C00F234FAAFE1AB708AE9A4C77C3D413E1A76A06C27B6BF6870FD4FCDEFF768D70760094E3809107BBA9A639D64D36092BDFF9988A07E3A14C7D5D6B96C9D6CF62CEADCF094B3297095766D62B1B959794CFD5CF339EC9AD1A608CC6546BB039E90B2DAFBDA616D6C61AB50EED1EED116D54631FD1B66B9F68B4B6D7859DDD394D71A6197EE8CE373C61F9F0942B8D74A26A1CEE54D5D20E266A218278BB729A16A38383F0A9BE90EDAEE28876BD249DB930749F2F16E3A9E267A166544BCD315AAEBDD8B8989A6E8CABDBF8AC0429879D24A29CA33822FE55C9140E1E3821CE8FECE0418AC18890C2D5D7B87B3C85730E783D53B86250C66F3B45DE70CA8DA8A406E14596566DE1C9408974537A7B9ACDE21C068EB5A507475FB789BDAECFD1974B4FCC92DA81F2CAD6A6EC50166ECD826C104FE3C02F1E14DCDA946055A8A2D11D40D3E8BA318DB6285A9E5C63EA79EE0007E35C0707399FEBD1FB8A336CECD79990E334924C2088C785481681F4C57324CBC96924A340CAC2B98953C60A79F148343BEA97C9184840C814BB63C55806C97C668E1CC1F18BC3998E63E8E9617B1E58F13F77DB315577A61145E2FF64DA07D51DDD4DD1998CA268B58374034E8CC6AA25BA99D0B41C0A06633E7B8E115FACEFEE202D5624B585135BA4C412C7042793BF935AABED911F5F81244818F0FB7D8160659AE6780DDA2DAAE826BAFDD2FF58B9FDD973AE3D77D2AA83978396199B6EBDA1AC3774F52B776C7AAAD3108315CFC6825FDB7FCDB2E6ABAEBCE2C7E9B26F2D9CF9F4EDE7DD769E4F5323A92AE9EA8633967487BAEF9A635D3C7BC2F5C74FDF7EC614F0764DCCA899D7786ED745F3CFF83A96E30D488E71BD8B41954193C8F14D8055F4143B899DC1B21DF1DE388CC72B622DB133636BE25BE2DC546F7BA03D323730379217F2EA623D1FF86A64A5B05ABD42BF3A70756428FEA672307830FC9EF7A3E047E1FF2E3B141F8D87136CA3DEE86B623B748B9DAB77B297B107CBFEC69C3214C3AF31087EA23164AA48FE9826E3E6BFB1A443A8C4BD2D36025A15B950EA151918B22577C93D3263F719C94466E59053E976D2CDBF1D774B6DED1190329E3B42129F24148D5949BE0E291E87093D36130EE43C2D94E9163A30AA5BE8C0D89531241AD95274D46967D652384757413804C016B015F482E38089830E301FD0008730B1D0023C74A10C8B1720DC0D48DC0F9898BB01E16E6CD0F763B122B706F05B0621D29E41DA1841B8FC9CC9E342749871D7DA3D10E4DA61C4FC23E305C24EE0769036415B9177AF450CDD0F2443F3DBCDD532C345497335C7DB4372335937545A8938B8ADA5B91CFA0DAAB2A29AF6054B260534FCB47FED8EAF6DEFB60A9FFEE7B3AB60EBC2EFAEFFD94FD6ADFF19BB67E46FF7CCBFE7D7D7163E29BCFE30B8FFF98577BDFC9B575E781969C1CED1A3F431A43722F0625B7F07478FBB16A1E4B63D8B2EA1BB84E112788B4A6368ADDAAD3AD0317C76526B289A62CC98CC87628C0C343F2FE0B5E6C95AF3A4939F37F05AF344EA5F7EF505924E31F6E79BF183F4E98B0A88C7CEF29E15BCC07B41B0CBDB15FC21FC21FD03F571E3F18822A8616925BC925EC9AE53D6A83DEA13CA2E7140DAA528016583F2DF90D62A96EBD7E8B7EAB40E901AB0D24DA43ABE0BBDAD2DD456EA10751CB9C1BA2E5363EF3186DE3A19EB39164E72D95CCFE9294D20FAA6224A91FABE1325BAE1E3E26D544ACEC491C50800B0B48C9D38B31C7E0696B36AA0CD46E104BA44F8CC224C762E61AD0861AD5931BF0BDE7E97B5FD0E782773FED4011EC4F90E1EF21AA92092F00BF0442BF3EE882A5E71C4879F186DDD5F0CD4DB6C58D272B1D6F99A4832C36ACA12F4D3B52770ADC15AB7810741A7913F8CFE91FC0C62D825C5C196B85BD2441AC26442846391136112E895F9628F5849B724997FD34A268C1613319881E9F61D659FFCFC60E1EF6BFF7CC7336FC5B7876F5DBAE9A9C7BFBDF26E707B70F7015006A49F0178DBF647A3AB56FFF20FAFEFFB2642CA998873DFB5FBA2A19720E5CD1264D42AB5553D5B6527F926C516C10BA5F37D17C42E8797B22BC44B7C5DB1A1F8ABEC6BDEB7C347BC477C9F04FF123E421031108F67221846E74430A6F213604A9D10980A27A973E00C75A66F566C9194532F578F701F044E81139A01FCB4261B3A424A99F750082A91CE992E8D83CAE2EC80500BA0F68ED9C45495471F87AAFA3F64B7544EAF328C573CC0F0589E2E4F8F07E12A16151B5D3D26862F0FB16030CE7A382C581E82B61E92C6C03CE1D1304F78DCDA5C8F5B83EBD9EBBE3B04ACD7994271A0993BFDCCE6B2819C99E2DD9C32AEADC09C372DF73C7F807F971FE519CC7DF3799A2F27224C0C03BEDC166DC291C438E3238423C3E5AD9D253889BD6792BD284223B968374C20BC6C3FEC2436F0630C2871BD6974078D411239303482148D92641B29655EB791B2A3C5CC92AC47721256F148C7DBDC868BD94B47AC4C59B1FFD6D7D6AD7CF55B5DF737F68D247EB66EFD4FB6DD74FDA31B7EB4F9F4638F00FACE05D3A1766A26347FFBEB5FBC70F0B7FBB16E9E83747339C24A3FE2B800E1B8609C8AF991979967F3E2427905BD8ABD465C210B7E7BF23659F3C3D6F9982A8B91395BE69BEC29DFC90833D19C1A9E189B6ECE8B4C8F2D309785CF8F5D6C5E15B938763D77BDFF243C1932A800D0D560B03380534E7420A66F31B61AD03098684CE2A93DF0292CABAE161BB2C8561B0873EEF3221CC36DC1C7FFFF038DFB72414B452629C946A9EEB040D5ED6F215115B1BAAEB557056A248EFB3DAAD2ADF8BC1B9B9D71100FEC750DE2815CA0A5A80FC61A8805574F1B29DE4AD5B5BAFCE2B29903535626874BD78B2C14232C64835A8C300F691BC32C345ED5E633A498E430BA86D8E92409C8B82931DCA6E4CC36691FE9B687D09B6E433EE984885A651451513D481BB04D0E3144BD82A32D8C11C03CA6AE3628A3C9805EDA9018AF036F5294C09BC4BBCDE0CBBF9A6FCC785A1AF3DD251067D745FAF82449B681241904C6D15FDD53FFF17FFCB9F009F0BDF51AD0C0F05169E7ED976C1E39081728537277DCFC24C8051FEB077164A328A0A6F04EE17323B17DCF15E0BE0D675DF104F6B6BD880D7BD83F5041F055BB3ED227023DDC186E0A5BE135E11F2A0FA94FAA4244AD517BC34361264C426391786B99A0D28A1E93801F667C5E86E628E9111FF08D7AEDCDDA9DF35ACC5843BD0B0841A7F35B46AE0443D1F05E408A96FB264E6925C5CB9958BC750B05C21686A0B0A5220872E22435244652814189AA7722259F3AC5423EA758E843625791D607327F7970F4141907473D160A3F0BF65049EA249028379C52DC731C58413E39018A639963793BB28287ED663D7663A9CFF07022CF09C8AB3144334A79383D0A32205377DB6D208320646D74172505BC380DDDD0BF9AE6249DD4FB48C029846BB62BD62B27B54C6A9D8C6B0690A2C27ACA8F874AEE7CE4116FE45BEBE72E8B4E693EFFEC0307E81F6CEE5ED53A7391F9B034B3EB6B9B872FC33871666101FD21C2093C5DA996EC53972CB3BE7AB9CA37579EE1E3C4B27059BD9CF6D55766E536DF6C79A62FC72F96AF904F497FF36B132AEBABBF52F995EAB9D55BEAB7D6F36DC9B6DA8EFA99F2CCE48CDA0B9317D65EC95F92BCA4B6ABBEA7FE60F5D1E4C7959F547B8201CE3F0877F4D7C4BC3CB1748C04D544EC9C1EC2D0C8D585B758061B8BE9D28C8A982205FC2D552D780A72E9E4E34F4B86E3B8E3BA5239A92A147A25088CA015EC0AF604997AB48B70613DD14241A28582452D14245A08CFE023573FB4B510BE0BCFE473B450D0EE6C41045298A74A30EA94F33B955CF03A1D545115719721E32E43C61D860CE6E2A9E7F503FABBFAA8CEC4F50E7D3EB2F15C58D11D4D3521A71358D12398EDF40A32F02D86DF913D5553279A490F67EAAF4B62E594396F0C59BA9D7A15A3543F11054510E7249E5779D8999F74D84EBF7723C3085943484803344579632CB1E4D18A2B1564BA2E5A75CEEFAD21D8E1B5BD52DBAC4718851004B15C104F24207E66B53D2B09EBADE024B71DB0743ED865DBE5E6B3AEBB65534803EB7BFF74FCEAFFFACEB3373EB1E24F5B9FFBF0C1276EB979DB33375EBF6D71644155F3A54B27F7DE05DADF7E0080CD0FF40CAFFCECC0F54FD375FF35F4FC6F7FF9C22F319E6CA428FA28A9AF78C9EE3A0E20F9F6077197DA218B78F655CC247A06BD4765C8257F30DC1A143C8AC747B380D2632CEF9325659C3DA3947095E2DA3656754EA912AD96B6D651110C8920408C9980458651D490A30F338F88C3281E32968238776204DF2792B82BF97E0012F711718D047116F1200BF2FCE400E9643A8F9485045BDB5A7B03C703704D606BA037301A6002D0E73291CF65149FCB5FBE2ABB19C3406FEF38FE328604129A4314430AB89DB8EF292B48D08C717B9B4B5A324ED98E2105097C41E28E9EE73FA733546A637767DCC6E6EECC89F15CE58E92B19D421C1E2638A6711A5FA5714A14A80242300A87736FA33278A87C744096288966117235F5AF66F12426DB49745B6FED59CC9E4A0F6117CEEFD9D8FF8DA1F53F9FD3BF6E55E777DA913BF8E9BDF9C71F1A590E1FDD78D30577DF32B217A1D626C410EDB81B9AE2A164F7434B5FCC8F8FCDAD42C4F4B013EC1F2E09988DD16C09CDB8747F0ECAAE9FEE129C4BF08828BEE84889773546B325345392EB679CDDA55D8273091E1125EF742C473246B32534530CF34DCE896D789FE78B5BC4AD62AF3824BE2B1E17794A8C8B6BC41EF111E7D221715494E22272F87806D22247EF1D1D725EA12E477F03501CCB3112C757B114F308B395E9658698430C37C41C6720C5249857D03386B1E30C702153643586B01A23E1B7C010A5C9B84A93716BB0181C959030DB31E7095F64B8B5E49B78305B654ABF8427BFB6347535FE4F743723B11CFECE13F22525F677C0E0AFCA412CB5A9BFBF9FF9CB8103A7FD4CFAF4410A8EFEB8B0004C25FC62820D36BF14FB3A5D42299647B984565A4F31BEC2427109B5788F2BB4B44B282EA13AE665558E61ABD8694C0BBB81658302CBF20C0319D64BFD3FC6BE053E8AEAECFB9C99D9B9EECE6DEFB764B3C966936CCC86EC86B0109241915B8480603491082AA2842862B805504140142D225E506B2B5E5E2F7DDB22245C44ADBC2D5EAA46F1ADDA9F56D4FE8A56AB69F9BE8FDAD76A36DF396766379B607F6F739939BB3BB33373CE739EF35CFF0F744814EDB2339A4DE20AC6A4948C89C472214DD9856420AF17AD038E9828EE9260B1D42CB54A34CECC341AF01858999AC42C2411A3A75444EC57763C0C124F2C57643591FC4ED72F4AA68F5D47B025A8718E8A1DA62B41F36C6CF84910088CFC8868A9D4769537616F645E55CA79550C4241E682C09CF163C29E83FB350ECD7A43E8D614A970A812D6584113951D077A61CCE25BFBB3D744C717378CEF4F4DD93393F9F29D77BEDDF0A03C7337B3F0BBBDC7672F41EC0ECD7BFA7F701639AD9B197672DE0F28FC509C169924797D362FCEE721D72D107623D4C69A2A20DBC67608B4E2F87FB66F585AC8E1849991F862AE21E41A3877CF2091FC17D16B454A67234EE2103CDDA7C7B183F0743FDAEB36F2060900386D6C45EFB00C6363D806613A2207F61CF112712DBD5AFC90FE13CB3DC9C252B69C8BF1197682D0EC6875B433EDEC255CBB7023D36B7B507885FD6FE67DF614FB25F70FF65BDEAD8BA28DA6190AA7B00B3C7A21F07CCC4C5CA719266626B38B689A3338AA8BB1E1501A49022273042A866063885B24CAE357EE08B1CFA8663AD72EA4488D64ADE7C858B25B007E520CE4A74F9EECA93CF612158310C9DACDA015716A0C54308E2C47843E8109DE4038053693A2E587D88100315701BFDDF1C792E94B0B299310A62542E310DD95DFE010DD3389C1BC531FA9DDDE0C766D31B954779CF3CE214AE51B69B2B59C768E1601160B5B694AF039700261E7CA761304DE1085EA7046E0C3E1469CA37E208C53D5DF3D1021BBFD2516D43BC9205D092CD73F3B7CEC400949333CE0C1BB8F0FA824C11DEDC82B3BD9ED977219A8D80A852FA59F6420EFF2A0ABB95C8D6483731F0EF8F0C95FEF0F9A87C3CE76D3853012564CD20D1511716D06303C5A5219D65C4ACDA0A95C0E3C71E0738803C29F7D99ED822F7D9C7DF466DBD1EF5F80CF66D70C2DA18AD767719DA92D68FD6C2068229BCF5E3DF38EF11F582BC7AC89F9437F60051CB3D2157CEB59EBDAE1361B59BE086E48C304133F245D6FEE6BC7997BB3FCDB312386643EC5566C7BC4F6898D69459BD336BAD876BD6D936DD8C6A02E1129DA1492F0371161C98DB4A347003C064EE33A6E2312D3FF8C484CE10289C9244E53F7E32DC52F17473C3C9C8B2CB61633308719BD98E1D50CBB8C2CCC11F2EAACB5AB0F88E6E059C3B6A59FC08F98522E5B8EF4B1527A058976DA0D9C05CC4C1D953738D2D60ADAE1821E0E15B48305ED40413B5C802F1A2A68070BDA8182B6BD2068D651D0960BDA4A41DB59A0AEA9056DBDA0AD15B49D05027AA1B0AE17B4B582B6C34A6DE373396E3832C3982D39D231E614734AF8A3F7B388ED3DDB3711CACB474A055F3022D07469518875630D8B836C69C0AF8A276270576C6F8C8AA145568EEDD2A0C610BB25C9ACD388C794D82D5D04D497942BC264A251C47A49D6588DF84AB55C2AE5880DF308ECECF3E58C4E23C94B9673C8D1E68BED0AC220B952307FA520B95210C33468F84A4122C20789ED3C88B92A512A82767CCD60CE3F1B44973A04A85469EE22A539F65C6AB167575B690C9E0010BB15A8628099344D9874F82C264D8408E0B13487EF73369033868BA81026F9CB26DF2E8B1D81EBFAC60A15A68389E8A1056EA7CE42684AFC7A884469ADBCC1842E6926852571D6600102976C7739CB5D762D0875873BA760E42C64FF52443444550C20560959C98D049143DD1227D06C116A1EE8664DC5B60EE74DE5E6A19BA45D7809E23551488831A5503579B4EEC9AE357B8A6F7AFDA73FEB2B5DD874FDBDFD972CB960F344A6FCBE398BAEB8E4E8BE434371EA27DD8B26DEF7C4D01EEAC0BA75731FBA7BE8839CF6FA399AD71EF839B1B2386D34EBA49E568FA87FA2FFEC3C4D7FE364192C1F4411DDF6AAF001F584EF53DFB08F89F02ED9E5D191F60A598F4374C87679940A2B17CC7C39AFC286DAE4321FD1587D447B9588DE2A11BD55CAEBAD12E17752941C419C9A4460247A2B7AFDADE5E4142DEFE73766E2A844546309A23F698E0FF3D700D6617DA77DD4F5BEBDBE677DC77C8C8FA6526E4F8EF63C396AF4E4E42E0FE1D0DFF46B9A0598F283AAAB384675D50A5457C6E2C7C70C7DAC2A3CC74BC0A3F33FA6327B86A8B3A33E48E4B08F08E640F3E0883EEB613541E4454EA459B55C63E5205444DD223B0CD9B6120B0F414370881E445CB44D272465CBD94AF2E464F9E70B6869FB63AB4F2E7E74AE2AF6572D9FD1F31453BE67DFF9D7CFAEBB71A887BAF5BA6BA7EC7E73E805B4484D1DFE8289236A71003F1CC6F472C8EDB3D277BF203C05D70530AEC22D3FF940E744BF7D3A3B836F63DBF9ABD9653C9F5627EA133DF5BEF3D516BDC573BE6FA16DA170A1DAA9777A2EF45D6BBB5658A25EAB5FEB59E25B0BDD026B735C4A2FB02D102FB577D357D9AE12BBEDA237C4701AE290AE51B637578107C895B7BDA96DAEB220B1B30509B971F902761CF1F358AED39C4B9D342C0801B3A4800533401AC70CB92C96AEE520E0542EC2D15C3E9C043B073F419C92641C60D33E6ACB3922CB2B6BB2E5789C82E600B0CBD8BA4BF07D01F1E28210212A62B3B7981761DE80A06901035D1A73450AE41C9323450FED96AB098C0B60F3BE55EBB09092D495894E249E768EA6AF1C660176099130ABF9B6F9C215B62B04068B798451ED9734D33324315EB3C821570063D060967521D6FA42D3DAD4276E7FF90FD0B3E1AB3B3EC90E3E7760FBAD07FAB66D3F4039617CE79AEC1F8706BEBA051641C79B6FBCF9CECB6FBC8E1E697B76195382A84A0745F03DC28556D9D573D4C96A8BCA34479E8D50C5914A7B69B8CE5D173E377C7D6457849FE89D189CE59D156CE72FB52FF42E0C76F1CBEDCBD46BBDCB83C722BF739DF49D0CFCAEE894EB54D1A791E188A79449A809773D33519DC6CC523BD4CFA4AFC25955D264DA13C2611AAC27244B40F68F22287F0141F9F304156AF3979D10A12A1AE2627193C8440859450C2B1DE97333B251F4E5D29372FA591EE2C70CD910F12C5148AAD22AE84C51A91107628E25599E44C3DFA6C700F8E1088C5CE0855A1078A18E0ABCF8666CE0050936436B1509BC289EDEE083A3222FF281178933A7CE8EB930B3E633A3432E80ACC91E629E9525C472D8D011FA9CFC2A460C6A9856726B98C7ED22B8F5718D2E2098ED4F4CDC7DCD6D27BA567FB2A1E3AE1AEDC935EBFEF3A9553DFBB3CB6C2FEE9837EFCEE1071ECF7E77C7051387BEA39F1838FEC67B6FBCFE7B443533B2CBE84F11D5A820047F45A8A65BA21254956F12D542F5DAD96677B3BFC5BFAB686F912DED4C079B8BA63AA706E73BE707AF745E195C5CB4A9E85DF63DFD73F64BFB5F7C6A2515B527DC19AADE3E939A66EFA096511FD8FFE0FB93E74BFFE7C1EF2905320E5720247132EB0A318854BC720A8CA216302A9061C4F40FB0035A81AA62288B954D0A53444CFF45845E1462FA57F2A67F8598FE1562FA578820458CEE1E3C828A899CC09A8793D436659596239AB1A5520D6F9B5676968F794C448351D1C69511F6478CFB1C31EE731E53D136BD85E1A2B1667DCBAA5F60D2CF19F4CF349E4D1F267940C645C8839164D62105087948A3C9036A5650C378CB5C3FCACB5C5DB5E7A217B37F5BF1BB9B5E5EF9D850C9CFD7F53CB96FCDEAC7B3CB287ED21C5803B9BDD92D4FEEFCE779F42F06067EF3EABBEFBF8AE59A6D0050AF20EAD020A94B664C4A3AA1CAC05226CD9CC7CC679632AB1856D07881171C4E4D70009A8712610640142A76F1908F469CD04945C7569F2DECED7F6DF3CE6B70FF63680582034B78FC2899D5347BB305B68639FAF4E33F64F63EA5769EB90103EBE23ECEE4EAC601F5B7DB658257D57903EC0C1EC642259225A523F4F80259B2508E345D711C5AF3B73DD6B4ACF9D2CB9ACE3D77D265AE22A6FCD19533263E159FDEBCF886A177711F360F7F41EF477D58CB14116D3CEFDECCEB0A7E6CE76A20645F5130050A0B79948F2A6B35D22E2B689716B4A305ED928276242F446E6C63A2AEE844619630B5AC2D7A5574A3B053D85AF6A4F33FAB7F4D3B046FC0E7AD6DA97EDF6B0B521751945A0745DF427EA1B0505C282DB42F7474F15D4297D82575D9BB1CFDE5FD7105A73697558E2FEB10DBA525E54B2A5695AE2ADB54768FF8B07D77C59EEAFB6A9F109FB13F1E7FA2A2AFFCE5724F454E998BE61AA5B94659AE51619AE1AC6370A334D728CB35C2389B422FCA74F0F1985D640291723723D58403D8F518F5579330157FB3BFD5BFC8BFCFFFB69F55FCC5FE15FE4FFC4CB1FF2E3FE57F1191911B51388960305CF87015A3B0A9F004A4005421C103ED7379D224B20183234258B330DC1DA6C22137C79801B5C454FE79CE1CFEB9E1C4B4C8846AA4E2000C94F90DA72F5D874FAF23CE699FB9C56CC24FAA55FB23F84C7F049FE527163A3F0933C09F4E11CC9593BA742451B50F319C2AF47D0743991355B00A5F1A7F4D550E6BA32AC7E4AA4C8051D4783E37E87D6D5501722F25F1AAF4E2BA63755473DDA63AAA0E876B94019FA91D92E913318701ADCAB881EF10370EE39B8C58ECD1D3162953C842A99007512216CFFD275621718577C26A4D17A799FC61686D4AF4939CF1D03FCE8AA340FCB0B096019233128337CCC985EA26122B713445814A3988C3C112B852EF4A12A78BAD30388B1FEFF2E8CE5E53D637E2E71495DA5CD5E59AAAAB4E9566A38E481008155C10DACE419B22177A5922970641B4D461E72BC520AC880B229B6082A0580D63ADC0C474261BA28C5625366FDE0C0A7837F664748EBC014DE514401896CACBC3356651D31AC91F08B8C344FE738F0403E34AB9632B9AC6CBE335547D7A7CC3593801E817432B11376CF301E5F60D1BD7D5C7EE79E5C1D62913AAEE9E7FE38B1DDAB3F69E651BBB3C9E6470EB4B7BDA96BD72E3DB1FC0C9A1E5375C357572A92F563773F39CE9BD15C589191BAEF65DB8F0C286D250D82996A5A66C5CD8F1C8C53F47DCAA6CF8FF5255B60781175E472C549151162169544AF5489B2B68B3056D1123079763DBF831A30C3536F9218076870869E05185842222A9919614350AA2D0F103E29B056F1845E29B1D0E73FCF9C2F98BB9EBB94DDC2E8E01487DD8CB3DCB1DE34E702C8134B3B0CDCE9079C061E40012E5695A6AAC868576F64F42D35831C1C226760D58FA89A9807147A92EE083E3F72F1D63FC4302DDA0E53E3D8517EB419C8081176B2D95527F5B000D13DC4F7B08BE112D61DCEF3A43E88648E2D06451206BB7C89262747575494B118879CD20311CEEA13590BAA1243F9E520317345ED15DBD756BDFC183CE4445D1A38FA84D573D465D7927E4BAB33FBA73E89ED9D501BCCE6C41EBCCA74C39BAEDC3A6073D8003A7DCDE3415717A3050D069C3AFBBD209272CE39D1E3B747A24B44C6BA8FF41CA33CAEAE02990C93C0556074FCCE7C5E68100B13D7889D5C1AB93508B7CD28197ACD1DEBCBDC1EBB2822E2C3FB99798B4BCD8DEE0C05D3EEC85C7BCD03B27405014B0A921703A405D1FD81B7836301C600279375BDE816739E7FAB01F3F2F3808100811E184F0A9C00839C141C80B0E960B5F248E7B9291459CF5C4D6201037B930C73FCAD06BF9C2CF362A984204899C6ECC587506119B0930AAEC501C389F19578BA05995B1078183D74CE75955D56633B910897288F83562AEA2250F4BC8A03917526DC609C6CB89CFCC3B02C34C376F7CEFB2C75B55A95FD2AE9B376FE7A4FE87FB675CDB5ADF43ED1EEAFBD1B8E9F3E6DF751B95F9EE434405011C4781A840A4AE3C2B0BAA00CC00FC309801E5C99BF20B85717E24121B23521446597B6D3C107916B279A08232024A994C14E21510B882C3F53608A25A46C4ABB643CB081E3D94E6F186424B551FDA436B2F621BAF50549206156843F43C211A4B030FDAA0571F1A3755D4A441046D147B25A810CAC50CA8176780E9621B6CA3DAF94B84A57029B58C5F26AC036BE15AAA975F27AC15B7C3EDD4ADF4EDDC6DFC0EE127E001E16EF1E7E031F1457098DB2FFE16BC2C7E08DE13BF067F12BF0367C46AF438A20F78C40A502E3688ADC010059BA17BD23644C6E95CDD7B8CD2C062611793BB42A0320059EF705F102C3662BA46BD42DEA56C36BB84534B4E2650DFA0FF81C4400224F3700E0D22C7F3314174098208688A8A9969EE365104A299B3CE72A24003684BDAA13DCA1B86216C1228E1080C1E346C9B6C940DB50C214219302AFDE5BF31390F06FC439D439D01DFE0A94E33F43093F7AC6999D168AD3899CF4A6B19F9298453C0080A64AC0B11144856B83305E12FB3DDBF3A152BF625BE7E2E7B1D533EB4F5EA150BD650B711AAC479A3871155EAB6AF5F409495A7486CCDF95541808EC3F2355A055F721E265B3E9682CAD3273DCAD594A760359766CA8EA4990A05E15DF2489AA93272845E70043F72045E1572B7376A1699B797CB336799029090EF47196CAD73147BFE08BD007D841F39821B39422C007560726DA428450B8EF8A2C0039ECF62D72239E52A8A9E4CB60EFDB8204C25DFCE0148EB586F268BA39948C65A369777FBED0E22D87E8114681CCB1DB19B1F1CEB97CDE090634612B73483BC16351A023BD28720AB206A75D849B92DBB0629466434D172AB98EBB0864B840EA8EF0FA8EF122C69CBC749A86F447EF2282E58C5548AD42CED526DA7466B11B386B8551E98C93534BCB009C52569351436DDF2C6E1E2B234C3DA05271B14FCBA8D010C2B0992CCEB2A70D22E2EC407A5B05C06625C159F90D3A09E9BC84F92A7D2D359839BCDB748E729D3B559FAA5CA85FA726E097FB5DECBAEE756F1CFB1479543FADFD9EF840A49AB00158EB85CA1C4F5A46B0268D0D7F2B7F20FD07BEC4FC1A7A9A7A527ED07C121F6A8FC1AF33EFB81F005F385F267FD0CFB4F212411D03B3BD9AAAC9932688AC7C4CA6BB195A0282B8C0E349EE3639C1293B1E94AE66807B4C71C4786DF371AF032E640DCA18AD8A71CD0E56445492B1713DA02E64271A1D6AD6DD47668A226328857E0E13007662C064732712669025FA9A7F0AF293AA3BFA0E1A20936076713449197EC7651D5342441B4F4D9808E148199C652519123BFD1383EC269BA9EB0712E9B8D93D138C71CB2CBE190794D511222EF42A763C00E8B93010A723AC32B9A5D7690DBD3910C80EB1261D6A62B185155747DA33A202EC8B1C941236A7ECA1023AD225C21DE8CB3A2A98B0CA155832BB49B350CAE749121A936B898B88769C4FC9E3A08BF717EB3942815FED9673A3B7D4829407F980976FA7E18ACC3E28A1AD9FE1B581D9CAC36E2FFED56926DCBB3C5F3F309D28E883D42BD30FC2952283F45F3FF443FA855227AAE8433C9986E79363D7F04AF831F3EB19FAB85E4FD92F92DCFA60AC13CF8E14FF77311F3437D7451400C2B78E21052B9D005D14A73E200578B2F73004CA08E9A97CF5F317FBAB7F0746DF8D33E31C24400FEDC0A94C05FFAEE213D03AA758268BADF3992C56D7ABAF10C2540DBA3B59D7FF5839707B23A38BD0431848ED3B025FBFCD1679A99D433CF3D523FF9D0BE6CFFF3CF54FE1E2D173F3EA5BD4E5D37F4C01B03D4D2EF3EA4361EFCFE6D2CD52A489EF93F68E550A98429CF384638B12A8F40798C826E2A1450DC0A94588612588A75A0A9A010055C4926C86C2045D78287151D2A51BF59C160AE3FD3A1DCCFDCCF3F283FA41CB31D638F716F288262783201DA29B81D01B51E4E9436C39D129FD42F66DAB976E912790F7C407C403A4C1DB1BF26BD2EBFA97E48BF27BCE3F883FA99A8EB23081CBAA6F81C6A0E8103B71482C0218A147B3602C75296A54D0C0E5620281C8AA262100E4571A879040E5564154A11D557C02B02A5C6F2181CAF38A0235608C3C1AA0486436CD5A13ED371933D2A2A97B3C24D86884486C3063B97DD44CA629E67C811FA262ADA8ABA7EA6B69198D03ACF9852041222D4CFD4338367216ED4243AAD69D279A36A426E28CA7682B271DCDCA21D4790371A2D52EB977DE10C01C390C2197BD49BA1D13F7E7DA024A312C8327706464B328211CA578F68278E39123E43A411C34EBA0F0B47687047C3734398F262C1A40147CCD071A8C0ADD907FFF8784DA83AD6F7FBECDDF08E931F4ECC7E4955C0ECB7D36BCF4D7D97B50FBD0567B5673B31CD9564E7D17F453417A05E26163B346AB988DD7C1E5CCEF9996B284C0E064C1F59B2E5DCA78E5CC39E3F3EEFD03A2BD6102B38B9AFCA93B57D0C59874597424B74C8AFE8ACC43A0D5D8948863D6291B73F99089C0CF806027E15EF88B9932CB1C13E250415DCEF3DA14C85AB4DD927D286C3403414A9A84DAB78C3D905DDE3F0E971296E8F3BC6DBC73BEAE50735A942AF70CEF0B4EBEDCE76F7327D997399BB975DE3E8D5D6BBD6BBB739766877EA773A6F773D203E2DBDA03EAF1D75FD45FCB3EBEF8E21F55BD770A84877FA64390F20E5714AA120A34C55B62AB4E2CF3F846994D5F308510D8A6257D1EA826461BFCBE98CE9A20BBD50EC68F98849A24B9244274EFE9758FC0520A486A864E8A510153A42351F54508F18AE23D402436AD60D9D5AA4BFA453FA1178EE210546C1F941117F44FACC88D86BEDAD767AAE7D9800D39CDB9754500F51CDFDC1C846B494A02E1CC2855D11F5E3C2073EF5CC29BF7AAA73E560C0A70E9216A2BCC191A9C01786A9E1B96041CEB43C2B231EEC1BE1C1CF9B38A8C35F60064F0AAD1016EC1AFEF85043468C366464C4260EBA339A0512DB8EF5505C34C5A2FF02193D11DCEFC795450CB1DBAF28A2487A93C8E8A68F316E46F33710F8264B5E472201D2366F764DAA6E9CE1D5CA6D52F6DA5F9F4C448B137FEACF764F29ABDDD896CE5EFD8C5A51165CAE84998AA107576FDEB8865AFEDD6BFBCE6D9F8F674905E2CCEFA25922C3BF925902CFAE8760C86DFA11EAB73CA5C33A1367E52D43400DD8544422297F6DCC428D4AAA4248AA19981167C269D4347EA6D0AA2E840BA8057C873057ED86575257F25DC206B88ADF20DC01B7F1B70BDFC23354D0CF97C34A3E2164F8FFE07F0F39CC350EABEE3485162F01C37197EA19484D14448A17C518A490FC41415C3698BADC9640CF2E5E8E2629D6D104224E2564913A02957E248DD8D8E7A94B01001C762C108F76D4B157864036E4C5F226F9B46C23C00F65F8237915106F82701F80AD60051806342018DAC0AFA8AB4A30FBC45E1F33C8511DC28D53099235A40E611366A3FA5973E3D06724AFD0D2C554F9B85550C5322922A2385809CB796C8B367B8FC77D895EFDFA30EE45DC9566F1B995ED048905CB0D1F1F5008CC87B9FBE2703023F09EE0642C1D1FF066886144F4642817FA0F7846182C8E42EC1391207F84AE3DD88D753D9B593ADE34566127880905C2969A5020E35325EE0AEA899E4BB2ADF492A1FF5AD1DB05BFDA4DF3ECEEB543976D107E8CE301E1EBCC0AD49D343887789014580FA8808DA0B4327DEBB1A876AA53FD1C24670F92023910F888319446DFCF303DF0F5BBEF06309B197E952EB5FD0E7D4B8B55D30780669A72A1850DD047E08D864841FCB5D0CFBCF51CFC39F025FCE87BD1D7FA9A1B670F662CA041CCFEF271CAE81A3698425FCDCCFEC9777D19D6FEED194CD5AFA0CD7A44D534D8402AD05258BDB7E1E44995D8351E27F1872042825F4FE51C545FF73B4CB0D2D323A59D725E2A8318F54198D0C5E38CA9975B56A6C6A1C6CF09CC3EB935D1D4ACADA8C157FA49783BBAA7CF989FC1E3B61DF93E942948834648378237980FFE4ED47C90C458D5E85B0E804DB80BC9F3E120ECCF3E617EF6E9A7F85B965327E147B63781007ACCDA6718838A46FF1C2E124D0BE0082CEEE3E92F9823D4E386C2713CE4857A882E41AF162F7E0E2601BE50E33724F6B151C529498D561D45A2B9059F4317293604CE40B20A841C4E62438F914C05D441D339C9D58F1FDF90D260CBD2F54D0F24BBA99354D5BCC80657D7E4210DDF9F1FBD711BBABF10788CDC5F9066EC3E6AB50FE3F57F4F33A20D06FC3E9A73F8FC7AE028753908C1E2439A23DE2C43F928750488D4E5864B83C1D044AED2F5127054CA71E00F3F738D859E836E77101B6C87CE749E528786340BCCC35C910EFAB410AD0580A9FEB45BD11CC1830E47400CE07E39206AE4794ED569563D79C44CCB1A2CDF2A1727867AB78B434C952B71FBD9CA661809C6A64D3D778A7B4FF8AE5BF7FC68D2397BE797C25BA893994CDB3B459589DAA6E479EA8A656B2E5AD032A16772592F963AA837A85BD1F327C03EF2FC5A29AF3A4BD5D98AE2B1C1782D3AE205F49836F4E495A89FED617F7C516045806A0EC0007E7E0F7A7E7F182A7B9D9591385F59FE09F05706E2B012F8AB739D3068F6C2D019D20D37E07E40BD819FE87B1C1BA511239403425BA9AA4892AADA6C95E8D90F87037EBFC713CE0FA87AAA8E141E4EE1F83D13E1D83382FDC0B1A50D9EB11D631691C6D6CD92DDAE4862D2F4B61917DBDD32EF99D7D2386942B3F7AECA1BD7EDDA32FDBCF6053FDD7DE7BDF4A34AA3A7684E435D2305AF838D8958BA7AA2B76BC1F2B90D6D4ECF55533B77AC40F4327C14C6E0D310F304DF8B80A2FE0620F515D2304FEFB7C1A48A2DB468181197824F6775F85718FBA5758E2DF8BF9F630BFEF311DBE523E740F0AFCEF96CE43A207B144E1B3987FF37CEE1C13F8EF205E7A8FFC6392AF8DB51D53C47054B41077329330770484FF28262100749D0009AC174D00A2E068BC0D568515A0B6E06AF19575ED33D77C1828597ACDB38A1F1FA5515D58B97945D30C3CE4F3518C0A3DF50A4ACB1BAACACBA91BE2494AE75A9AA2F3467D69A1B6EB862E9B4736F5A3FBEEEBA2EDD73611BC54E6C6A43BFD1CB3A8A021DEBBB3A3ABAD6D34BA3A25C5553531E5D0A921F0F649203270608EC7832A99E185007D04C43AD01DC2CFC27C7C1A4B957DF328F1F73F059C7A31E709546EBD3A9BAB8B5775A7BAFB5CF7DCE8D793D763FF6F3B1AF6363BE3F773DFADDDA74BAF65EBCF9476A5C6A5C196E651BEAD0CF2F52E3C6A5A80BF1762880DFA0B6E48F1DFA656DBAAE8E1C0C5FC39F6517E2ED3FF0C1F7E2167D7F1D5E5BC7A5B2BF4FA5C67D825EC03DA8D186BF6C03DAC017EB92F5433350EBBEDADA3415B10ECA72A8F1053EED83746DBA06353025917C28B486296099E909A290BE59C3DBD3322B841805B0D041B38E183080919E900686DB975610F150AD4880A18A710C86A662AE40747E88E4DCD943C7175DD6899D1E66CD534620E97E8C22B3B932763692E313C7293F0DD8670127A6CEBD7FE6D4E8F8E2D91EB17FE26FE62C713E28CF29ED6216625E5FF0330ED178760074C114BD1C293B41507C0854DAD94A97FA02627522F0A12D0392831F0DC2E4E0C77812E02B45B474C3F854842660491CF18DE20BC3D4CCD61F6707D006A61E76452FBF3CEA32B7F0ABFD4BBAE126B4C96E5AD5B068D18455648BAFFD32D8081BD1B545A4B54D318A3856A8DCE6804B1D6B1C94832A67C633140325BB8DBD9886B47484BABC0F0A36009203278F0FD5751E472B60F278AA7320D3D939741C1168437D493DC44122A56E5AA3A76637C3FBD65F73CDAECF373EB4017E98F5763F0459C865BF4532CD09F4CCE3E8765004DA8DE272F77837A5AADE4A4EB3EB9548CD474C9E03D06187E89746DACAE5FDBACB456BB84F6440A36D90F409761D0F9259A3E19254C98F07EBD01B75752ADA8FABED84D67810C61C7796B84BB8DC4A8506AB3C7B6257A0775A327571D3B4693F6A85EF6777445BDBAF7FE48A8E9B57CC5E0027EBCB6295539BE6197ED8DBFBD3FA5D2B365E302D3501F5D83BE8CE93A8C73C8868E6188A57ABB485D0FD42A932046011BA5743E66CDC2E6E2F47213980A3FDCFA3FB55F05DEF772A20F9118EFFC6B7DCA9A5500BDDF5602A39A87E349842838BC36A7064ADD7BCC988A6E202E9D0459697D2280C3FA25FF970CDCDEB5A2EBC78FECDD93760D38A96A6ECEADB9AE6DD751BB58F9BFDFEB4A6A9EB56CF980AAF85F736A5B2D76E9F36650BEAEBBFA23176A2BEE6019250286003950C5204D09DEE6700BE2134886F0EBE8917C0B8EEC4A22D45EFF10D663751B133D18D700A2CED9D9B3D95BD0BD0D9F7D1B327D0B3BB4129E2B5330C379292A94A8FC7555956C5578642F6CA2A44B3984C6A6A22E5F8C15510C1D751730F9E1C44B287F9C81FE3AD869321E9F2FA7489F9D0F9D1A94F37B8CCD133899C2E7875E72D905F3973E19D4F2D9AB7BEF7C2C5FB7BC795565494A692D1F2D07DCD95C9DA2A633725267B5E8AD75DD3734EE55D3DCDE3D3936FB8F7BF967A83C971219F2F98DD7173B8A4B1295A8467C047E8992AD033F990583BCB90F1503A2AC37E6725A2C062329C02273C22EC13282820E20F6222D48824E2B68870F4607E841F0B8DA52916D4E71E06CD57349AA80DD140BAD1C3643F7A840D97A5F6D4F4AE99D6326FCE4DF09CECAB2BE618F08E4D5B36DF02CBB980278CC6F3BCDE35D3A766EFC97637A5E1EEEDDBB7605C035C9FC4CB4C064E4481338CEAE53AECD0E1723BECB0C3253CBC08FD51575194AD6797177ABD25E19E0852E95D45A22350048ED066C82E4C7612540E74A39DE60FC458562E992A8DE2E88B26CA998B9D73BB3C54665DDFBA49CDBD7D3D6BFBD63636F71EE8B967F7AE3D77EFBE9B99DCB2F3ADAD5BDEDED9D2B2F3ED2D5BDFDAD9F27DD389575F3BF1F66F5F3D41A2BFD0ED2E641A1077891D165F176C9042DA04AE0AC08A47E8AAFDD08EA47F420430F9560ADD4B49A9C65A9232B5F0C0D4FE9E87DF6B584DCF18DF59BEAF66EB74FC8D3390DEFD257AF60AF01FC6D29931B8DEB3C343ED70C35E37BC4A836D1ABC5D86EB643893873318188D5754847B76B07012BB81A52A59C47D24A9EA8D387C28FEB3F8D138BD32BE394ECD8D2F8E53E7C661457C429C8A43BDC7E96C85103AD9685CD7E36A91EF28EAB338F5FC7EA4D5E3AE4334AC673268A83B31110F98BDA7E337D11E311E3C8F3AF33F2525A82F1B9AE8FA34AE5BCEC59BE894D5D19C4C7325F497DF2F2A6E7B68FD8A5BCE7705331D4D7F771FE1CE5FBDF7CAAB1EEE6AA8B8684B47DBEA59E51C75607CEF86F50D75339A9AE265536AC3679C1D772CAAAD59B06EE68CAEB65995E58D75554EDC3793B34BE82CEA9B4624F16CD836096E6B805BC7C3DBEBE0EDE3E095D53DD5545B359C5E0D9755F656529794C12E37ECD1E1121D5EA4C3693ABCDD016FB7C3A5345C025621228B647ACA4B22919AF2725B8FCFA734D5F420D9A4E72605B62A18CE8B5692CD35B0A626011A4B8A226145AD5561580DABCE44511A11599FB34894ADEE32A787961AC47E06D46BA8E73AC9D4479D86F6589AC69CA1B3B0DB723FB088CE11659C04083551664FB25C43413BDFAD2C477D6D2C9D1E6BD97670D9E58FF55E201D0CEC5A6774CF3DA7AA6599113062AE296B3BC697352F18D7B3C3D9AFCF5D7DFFC5973EB862F29225F07E8771D9BA69573DB5FEBC89DD0F5CE6BF6767D5DCEBA74F5E764142147EEACF749E3FFEA249C5B7DD52B268E7A2DAFAC5DB2FECB9EF1C3C13C7653730939814A26F194C37820E4E6220105E5F2D6F93A9A5483563992E3B9C8116311E91FB01891510F1F743C64EA1BE69462BE8F1E6147AC6E4401D5A3F078EABC7EBEAC81C28D5CC65B4442B85CCA457FA87AEA79EBDF795ECADB66C2CBB016E7B92FED1F73DD47543BBC9982F65782686F4C6DB8C9675FEDBFC54853A41A51A6478BB08AF11D789D44C11CE123A842E819EC6C1F369D801613068EBD175A9C8EFF349A1FFCFDE774047759D09DFEFBE37BD6B66341A69347A23CDA830426D1092681A8140051058A0421120A4514348A00206EC601B830CD806DB898D31BBC659C76DBDC471B08DE53871D189E3755BC7EB254EE2923F899D4D96B4E577FCC768D8EFDEF7663414E764F39FDDB3392B2E926E7BF77EED7EE5DE5788CB651C3610EA4D71198C4E97D1E8720A16CF387D8EA40A33BE69F16A153E722795F3B104D51C1A5A1E0E7126726B3BC533F9967E9295E9CF89DDD415B7C0101C3BFA3458A3FFF6D1D3D1F3CEE793EF1E38F4D8A9438F6F78EC283D3B79067EBB3E1A7DEFBDE89B6FBD663E7CF0AD7B8E3F799B83FEFE14527A33EABC3CD58BE8E7679163E1EE5959D559376709D9593096093B32614C823A37F89DA0723A9DB4D70E6356D86185110BDC6A8239A67A135DAC83D59A4E0DED14609500E500362401EAC834A446C0475CC3EC6370B624AF17A38F1487D7AC4AF16A4DB1051F3AF76609539925255C6972057FA5B072CCD987D9E4370FF9F8BBD5B232A90D127429A4ECF9F8F4853FBEFD4EF42C7A37E4C18F534E17BF72F0155872FDBDF7EEDBF9F863F4FC4BD14FDF7A3BFA2384F1088CC1ADCF9EB6FE6BF4D7D1F726C75EBDEDB6E7BE7EE40E7E325419DD2B9C47BEEB496538FD360DF46BAED3D0A59A751A9A8B4E07DA75A3302C6AB522D1304EEA51D90A4CE618EF42855659893190D150A98990954498E117CE9F8DBE94FAAC1AD23E9C0C094F09C77F3D591B3D0C41FA1A508CB804D28C5C48432E24934C52401E090F75164013FE9F119941B7E4C2DA5CD8E287B57EE8C8848817B678A02F05F63B61C40907ECB0D30E7BAC87AD74B7E99089EED21FD4D331801DE83811B3633835950E5BB38F66D3EC6C6D91346C36E70F6768416B4C3610D1E5CDCBCB4AF7DA54595E559C25E75C155018D7236D715FE22A6C6903D1E6109129ECAEC252F6B651D90BCC49604BA2B913B4608FFEEE9DB3D1F3C7F6FEF817DFFACEAFCEBE15397838D23576B873EF634F5CBFEFC14704776BF427CF4781BC78F82D97B8E8E3077EF8D1FD3F58BEE8C6F6CEB1FDEBB7EE9D4C7B70DFBE471EDFB3F77194DCD5D14E6EAD53889F1C0DB7CD969648B4DE0B155E38980EC164484D065D328C38A0CB016B6CB08E91E826332C31C32C33D4EBA14F0BEBF0BFB845A41EE330399A022929EA6C3B4A6FE6B03AC9EEF61241C8707A2DE60CAF2E66DEE3221BA74F88F99757A18C5A7EC70D7F4D167B9365360F62926CAA447A6C2A3DB3F57414E86B6F405EF43717BEF641CAE379AF7DED1BD1D7F79D38B9E7BA7F78040A9BFB40FFEE7B901C7D39BA2B3A1CBDF6A933E64FA010B459CF1DB9E3E5B7EEBAF50972F1226942E9B1A95EA06AF6FE2C2CCF4515DAA27A01E377C7C5F5BC661E21A286F770F272F3C58FC5645E4EE6E5126CCF558D63D995121BD1A77A889D7FF176A62566E0886AE276B2F252EC4F540F6339F597ACBC0ADBDD7CBC3412BBDECDFB7B08D3E77D17DF576D55BD83F3D4903DE1E58717C3EEC5D05B0D91303487A16B0EB4E441772E34E5428D17AAD3A1DE0D795620F952B208520DD4D498EBA46C9F6F7EB6D92785BCC9C90BD3BCD9C242AFA8D3A1F38DAE8E22BA9772263471AEE432DEF8B2B2B373CC42CC172B4387885B3AF41A62A6CEE6707805401FC28C16927D630BADA16AEB0796146DEEFA6BEF8DEC7AFEA6EA8A9B7F70FFB3676778AFB96D70E3AD9BE75A5E70ACB9EBED5BFFF6DD1B67AB7449691789BF77EF91BA8E2FD57AB2AFF952EBBABFDF7F4D665B79764365CEDCADF7B5AF3D3AB8C29D56686DBBABA72C6BE96863CAE063437396DC7EF6CEE83FF6DC3DB862E17CFA63A3DBED36582A96AD2DAAD8501D9815B97383F2E5DF41A4A097E490FBC35B0F6443670034015780F66542B31B346E684E819A14C8B6EDB01DB009874CB0C708BD5AE8D340A9003902CCA670C40B5F42F5E185F55EA8F302BAE9CE6C2259252A497919C9ECC34E167D869EEA89574222A765792D429A57A58BAB06AEAC515B73C58096AA4DD67457083FA37076367FC513BFD738C9E9F47905765A043E76D7B199AA06A5ED275E1E7A60F2EB6D1B4F7D76EF1D1F9F6CFAFC794DFD9E477B4E7E907BE14661D4FE2FCF753EB0B30EDEDEF9CC75E1BE5721EBD907C1FC625FEF4BD15F3D5E73C377C7967CFB19A8FFD5A773AF7D8A69ED870851AD47EA784879D8B743774047F76B618E0869123B12205E8B4132D9D4DE64C14C891125660235360B2A4AA67C759F4D9104F6E465C8198A898378BC70E3D1F69B1EEDC879E1696DC6A6DD471BAEFDDE1D2B85FAB167874B5AEEF84EF7850F55E367432D5581F097FFEFE90B8F29D0684F2134B3485FB87A7F31EC2C86DCFCF27CDA94054BB2A0261596B89BDD7431AA701DECD441AE582ED2B49044B2A55CC22025055E8FCFA7C09B6B64223EC12146BF00238C1F9F2BB1B2A0EF52E1BE3AFCAE381E5953ED627DB0F9A696D1636BB31025CF9AEDFB6B971F1C5A93AECD89EC3ABC7CE0CCCDF52F607BEBE8B1355957413363F1E0CA45FDCB726574133BB0AF99A39436AAC6910FB3C3198775B05B07A522584C1273020C5E22A531AC7466AD11453ACE05D9CE706CC0165B73EC3BD8A559CA5AB5C186828D471817725F7C5A276DDA7D04B97074A56AFCC233B78C0FB1F97B04E98F4BDE2D6909231FFEFDB4D0CAF8C0F4E02BECCD2F241876193418260992A43BAAA33A51E7D568F582977D42687282BD85BFB06DF2FD09EBFB13C545E84D3102FA4A1180B9F4D69FFD6C72E4E38F55E3A73EFFEAA953E20636EE83286D9BD8F7C2C8FEF0CACFB5F0B11E9ED19FC575A3275A8D5662B75AEAB5DA4F75A0D1E5E876EAC674CFE8543A5D12644209087A82C11A0589E81D3800316AA824EAD454A301351508C8BC468A545811A8C909F405C78256F2E218FB48286C0FA5E0020CB162704C7BFD04F0E5E7F301E3B90D7CA0DA143D3F99F4D24BF4432093367A7ED2A81A9F5C464F4F2E43826FBAB849ED42B94C2185E46CF8B67D85D05C00CE023830136A66B6CCA43579D09C0BCE5C50E7C21A3FA4FA41E787DA2CD895017D1950910187BDD0E7859E34684D81C5C9E072D6386997057AD1988A70808037D995EE4ACF4E23291E8F27E84BC976B9ECD9C467F5493EC1E72B0EB26F875B34191AAAC9F61A85748F37CD8D229A924C28EA9850E88309EB6449C907133C8C56E2E812599B5F3F36310129E7ACEC2FBB1FFE0BFF05F8D70EB9EAF1A3E08BE8356A200B4ACA84906B4ADB33CD2E6EFFCAF30F4427CF74F48C03BDAFEB99FBAE6F2D1CE906D72F277FBB3BF2D92FEFADAAA5CB0E3CD5D7FFECD8B2BA9BCF94AD1CFA1E984F3C05D2F7B614B71D78F4D5A1D3D1F73BA32FC0CC62487F62E90F0F1F79FF5843FDB14FFE66EFF7EF5EC5DFDEFB89F0217A274E9247FAC3F565B935B9B42CB32693967B6BBDB43CA536856250DD6AEE31D3566D8F96A6A53903E070C8CF074130E0975FD6B4D1201A9C6AC99364D5247B04B581F9A5CCDCE1FFD85603733B435381820F570D733E640B172A71854A43100FE964D4850F1F118BEFEC897C6D6755D5E8D722CF778AA7A30BE7742FCFCFAEDBBAA4A6AF26AB7065EFD8CA95D7DCF5FA9EBD6F1E6DB863D785E6A2F6BB3A36FECDE0FC79FD77AFEDBA37126256FD60B407E6CB6F542359618748036A767C20F107ED04B346C56E40FAE00D06E9C4245B5928A3EC418483A74F9F8EF6A89EFFE322F581D795F71C7CC6D7536BB8585E44FC7E65BD4E43895E1F609F38013D0DB0D7895191BD795A4341AB53A3834D402F2BC717D98BF40BDB7019F3C5C1168B356502D70E5B262CF85396480884CFDE8F4AA74FC3F367A315346DF2E7A84446E1D3A891ADEC83177F4FF5ECBB516446D8ADD3DA03611B109B64FBC8F65B9B68B313ADCAA3331A5056CF9530ACB64FBE59C2B68EF9A738CB5C0AD96D21A48A232F2B2937392577916763A450731A66E69467D954C249ADB6B879678DC8F79B1AA2ABC5D328237E524E3AC29565653565B4ACB8A69896CFAC9D49D7187A0DB48B421385348F23E09F3123C9EF9F33CB9FA1ADD4522DAE1C4F86C5AE2EF45A4D9A8017040E15FB5FC903492E1B13281B93AFC7ED44202B412E929960C8DA360E79E072390989BD8F6E7EF4BADA05A30FF7747F25A4FA3B86973F3F8656F4D3CADEA533820DFDE1AA9EFADC82157D83B7ACB8EBED1BD1405E73CDCA839FF7649765D9D427B5EA2244F9A7A1C8DD1DEBEE1BAC2CDB72A2ABF3EE4809A3B719C950A99A891A3A336C35E8B50195480D34A85669D55CD227DE60AAF98D090CE2E500BE949D61879C5970E3932FBEF8E4B7BF2D1C3F0CDAE86787D953A5D146E1E718B905C9B2F0CC0399D067D96DA16B2C9094440279799E9906BF5E9F8101BDE4A19E195EB541EFF7385C7A93476561FE0D73EB2B2712229FD89A0AC4F6EE5CF22E497C75D94209B64AF879C9D6537B9ABF3C58F984FD9DAADEFA5C71C1BD7DBDB7AECE3C6D9AD9B274D996EA8CD3EECD0FEF5A1C68BCA92DED11DFD23D6BBEB26EDDA2E1136BE9E8E43BAD37AECE2B6E1B6BA2EED82E643ACAA017BDE5E1F0B2A662E032B12607D6FAA0D7099D36E836C2A861BF81761A60A77A4C4DD505BBBD87BC740DBA74C38498878FFAC1EF9F55302C614C93E755A3979CE1B563C0472A951026BE4D89EA956DB2253A71C036D066CF0E5DB66F5956265C2E1DDB0F75DDDA56612FB8B773D389817955BBFF61EBE8335F5A387BE81BD7ADAF5BD0BB3C3FBFA177FEA28115C182955B55E347FA8EEF6C2F2958B870E7C39D5DDFB8B17EE96DAFDD1079E9F5F76FD8F4C7170B9B772F5D31B23C90B76CDB92DAEBD7CD6254C008231D6D95845ED4F670DDDA105484EA42CC85EA72419F1D7ACCB0C774D844FB4D700BC6B32475F8681114155967774BD02441B6041292227B58B28235E865AF30F3799D2A2E5453240831ECDBE438F71222F8CA16A8CA12B5A8B2B5A8B12BB8C736CC2063ACBAA7A1624686A9E89ECEF61383F316ED7962EBE853D7850BFB1EBF6E7DE982DE65C1DCBAC8824543AB0A0B560EDE5633B271C5922A5FD1A245D73E1C893C7153FDD2832F5D1BF9C77FFEF9DE0DAACAC226990AB9CB066B6BAF432AFCD77930FF8D7A0EA341E5CD9B680D96F16810FF89DBC5ED68359CE4547883C56CD73B9C826817CBD5C75098311350A91D2A759D0ACA55A051814A65EFB2438EBDC54EED54ABD36B400F01A271E00864B79EDDE2A5A7397AD0E9DDE88451C1A375DAF57ABB13C338B50643F7D32A51B11313A851E40D373448E02E64BC46976A4CB9474A854E06063536EE65B5F15A68B3A2CB619EB02501DB05F165093E210B4276A140C841EF542388DBDFB83E6A1D79195E7EB3619BD96135AA4595C164370FC092E8B8B87D72048D79697046AA2738B3343BFA23B6DB730CF10F22FE0EE22305645DB8881458FD692A7FAE940624D79A4BD372D3720D45CE82003148066A20CEE0B6997074E6C99974E6CC4C5FD0784698F1CDCCA0411F0BCCDAB6B3B3A636F41693F8AE701B7F19127B1BA6B2CDEB63DF7667B9407CA7370BAB94AC4F289BBF7EBE37BCE3E19E68097CEFD5575D854B26FFEDDCACF58B737216AE099D87A4E55DF3DD690BB75E7391D04DD6F2FAE68296EB57668BDBC78E66D52EAC2830FB1714155578B517DE4A2B0C67E75415F02707D75FFCB5783D0A809F5C1BAE599A09651950E6867A13D46A618D06EA35D024400BDA76BFD349FC47FD27FD4FF885623F10BFD52FF905BF3FDBE3CFD0038A06F13B31F95C1E0BDB01F7795486A91D70F98052D6666D97EF20C254A8CF83214D76567CFDCE2E13AF4F6DFDD2D722636F1EAE69BAFBAD3D9DF70D35A43C5DF3D1DA83EB31B2DDB762DFDF4930D87A7B6476D3891F8F1D3A7BD7F2A2D63D4B7DEFCED9FA371D230FF7CF3ABC17259971F22072528B923C279C596E846A352CA220FAAD16C9422D16973340B412DA6B7D50AB77060972EE2AE744769FC437367D6553EC3906A73060F0453F89FE221A1E3FDFF7E50DC192CEAF749C13B7477F19FD59F4A7D10FFE36D4737FFFC0B10D798CDA0C922C84C440968773B45A8328860D506C0062B0A20C09060398D4BA000109DD4B4D50A70355903231D207212E46E76232C4481942D2A205C438947DBA9AFF8859174685010C27C62677D1B7C5ED27A3AF9D8C3EA8CC2EBC8CB3EB30EE4323C63EC42D1AA82AC09EA6A51A1A14453504D95EFD37D4310DAC4C16620E2CBB07854F814229BC3C7984A64FFE745C080A6F475F3919D5E2B8B2349D4169F2A134D51D7043C00D6329906D3F60A7B758216282552628D7D7EA699D0873451805C8C8484E37FB2D165F80A44BE9E1F493E9627A720023108DD9E20DFA7C69360F2EA4E093691E4A0A133738CE4D39019744D801B52F264C925D93ED8B8B123B9DF789677E11FDE5D887275B1BEFFBC951B8BBF991AAE81F22F77685CA7BEEDE387E3CFA10351E7F7CD5BD676FBEE9BD132DD16FF9DF5CB0FD6F37F63C305011198F51506CE5FC2B0A2719023A4A5526AD10506983948A7A0D3BE60091E9B0CA89244E3C995113F2E19E8F3BB73E5B486C3D33F9E4F8386D3843F5939FA2AC54C02BF2E8D088A30B2435AC13500CFE09C540E047858C1FC005917D7B071AC7C739BDF32EFE9AFE14734924376C2C574352C06A75E8FCDA24BCE829ADCEC017219A854A397E67720CDC5BC82E2D4B569C22FAD3A2F5FB563DFAF5C78447E75467E9C6A1AFE78EB579DFF9BAFDFF04C24D45F48F31BCF773BC7787E7680C60D00B081A2A3E0721A8FAF402EA7342F45A9D2EA0171C7A017D19BDC4426D461DA29254542500A7CF37634ABE72C25631255C3C1C606FF944DF3FA530A9024348F3843831A64AB12AB10160CC049A587820EE3F17ED3A75E60C9DF9FB68324DBB3BBA0795F8EB7456D4ABC8395BEF2A9217B6C9B3AB34A2B2AC040E84B29E1849D9FC7C05216B84839396715A266EBF50288FA32AC4719CE481F0FA630ED8E5805607D439C091941410058728248963867B0C748701BA0DD06C80C5481A9349B68B26D52115EC42E368A9B5D051241F15AD1695A8119C014A5D6A4D803DB54C758283BD6A64065A3FD02AD62F34211FB770FF963DB285FFACF180A92D5E4C899765B71B23687E7A06C91836CC66377CAB0A4FA9A38F1F8E9E124F014A87234D4B0D5E17B8CF098751499CB8D089544B9EB559CAE89E473F50F8BC9AF379205CD6848B50C30ECCEA00B4ECAE4EE4B856E3D062E067085875A0D399688CBBB752D842F7504A35EC683B6CDCA7854EED086A54793994B4B5F15F31B470E98E5965C31D039F831E62E77EE2EA6F4F3E2D3EF12D5A2F3E29ACBDF01072E321612DF7B97F2DBE8BDAC54E72C8A670E5816C3820C1210F1C4C863949F54974A911E61861A116666BA14C03D5144A29A8FCC46D754B6EC1EDC6A02883DD0CE0D11BBC9E3F7133806C95AEB82300BDEB04BF9A1EDFFBFD7B56ADBAFB9DBD37BFFB9595AB8FBD737DEBADEDA5B4ACE3D0EAA6DBBA2A4A3B6E13F735DDF7839BF7FDE0F8EA35F7FDD3CEDB3F3ADE78419C377832D2F5D5C1B9B3071F1D597F6C70BE629D7C487333719385E19C6B9DB738E96EDB211B55FB89DD8ABE94DD9C66B40488593253B325683098F4EEB889BAC41C700CECBE18E0A86EECFCF8513654133B1F1F9855B2E5A191E82FC6C72F1C3A9453DB53F599B87D26C6354B6FEE9C136DA6F56D5B2AEA83364EE907C5CF90D269E8D7FF3C7CFC4008F697C0C10238980BA5A98B536999BBC64DE73A973AE952075438A05A803201967082FB8824B1BDEAEC22A3C110B1400B925C44E75FE5EFC680A7956D68F36F0C0AD9D9B38BFC192E701DF0C34E6CF2F882B5DE562FF54A1E4F92216834DE62815ECB2E0B6DB3C0520BCCB1401E0E35430B062DCAB116BBC49988EEA0BCCDCDEF4A98FCA0A28D1DA9B7C5375F309D2B6943012C91CF6CDB42EC753F57B29BDDABCA5EB991331555D84BCAD8A9107B72E20AEEB7AC28899494D61D985779FB3531295855BBB421A7764F6E44B842146E796F855468DBE7AA2E927C5322915E60D99F549E39F0D655E4E255940B174657ADE1998E64F68625BF95DFA2E7678FBC481EC1E3D167A66803B2B2753A1C29418D4627050DDC10E9B821E2165376BF626252C2B45E4592E2291708595C6B28047026BBC0271F7FF9C4577FF66E607E657DF157C7A9A7F3E4B679FFF0E89E2D931B60EEC1A37B0E469F80B2D935415BD42A6E97EA76B6DEF440B2587C1C1A9A3B57F06744EA71B5BA5186E692E7C2233B2A60B41C76171E2AA4BB661C9C41AF0DC0413FEC932022C16A090E64C0AE54B8D60D5D5668B2C2610A266D923F67AE9F90FE7C58970FF924C79A733447C8C9299E9FEEF778B47E522C15D3E2B9FCE645424C826976A687A45BD3697A7A7E66BE4BF0CC666E68A6C715734365BECBB779CBF761C40FA12A64B93967BBF20415B2E3DEA82BF16E0C7650223B81390542DC75152A75076F28DFB824C7B364F7C60D2747318E7EA8F38617F7558B4F8AE56B772C0CF7D4E7A6AD3832DC75E7FAE0BC6DF777743E7CED1251C8E8E877E6CD0DF84A72FD764751C3686BFD756B4ACA23B7371B2BDB1678538B16E5E5CC29CA7339E7ADE8985F3D8C316AEB0D8DCA576F854F7884961ED669208036560CAA99BF4099BFC0A2CD3727DFE06E1BBBA7C2277C12DD7326BA57F8B6F0F68542E1ED936C8C3B904B0D384606591B9EBD26B53795B638BB9DF4B01E306493CF06C65430AA82FD22EC102123A0D0D867553492D7CA0C6A8A47C3E91CBAAA36459F4344B289F26E8CA8381E6283CEB7A0EFC4E09E87B694BB856755F640E5FA85DDBB16D89E830F4B87073B96E69734F60EF605E99D93DB82AB975615A616AFBD7E193D8A506B716D6C42A82DE867CE6D0168C608C460528B02555331C01E0EA182404D16022640D5090E022BD9C2817D0043009D00402D2211F83AA1B2C38651E57C7E58C603CBA9ED7CEE9124162BF81E047B1B77082337D9D28A9BA2C5DF8DCE7F154AB546BD5645B50E0B548BDB3F3F82C6EBBBCE4C9FCF91559D2DCC6114F712A29E8BB0076076F8748E15AC6693D16A34074C4687C97897094C26E34123F41821C70846C3B80B725D90EA02830BBEA2037652415D6E9DC165D005DC2E87DBA573DFC75D8F5A03CC30400A3A20EE7A37B853B310ED2C0870E409881E382E42AE089E54917A9046A91E47AA474C3DC1A9D2CDE8F132853314BE4CA19BC21A0A65147229D0EED49DA963A9C2ECD4E6549A1A48359B889B792B060AC658AC3E21932EAE829180320D659F257E2CC2827574E712E8CA7A267833893DE561AE6006B05B36D887CCB373B2D46A766610B2336F6781C09E3456B86157CF8DBEF258F433AB594017CD1CBDF074F49F9E7DC4E15223D016B3EAA7EFBD664CB6E94154DBADA7198F849ED20A9BA5AEF0C2497487428D3767DBE656CEB1D2F3939B72D7342E4C2ADA5145F953344CEA3AB93F784FB8D1E9D012A34D6727C624ABCEAEB3B09C5E673780C6A176680DA062BFEC5A8736A0B33B743ABB0BDD4687C94C8C840AA2C10806749F8D0E2C1297C1A073D88DDC0BD402D14DD195DDADC28F96E48D8F89092BFB4037709270F7893D16CC7EB16A8B85ABF36CFE8DF72C9009C33FA12D767EF8FECC0A8B6E46F447EFC0BBD1CD3FF895C36BD0CE00FD2BD156289CB7DA61AD8C5E4757D3F4E8194F4192A9125A277F9E88AF99CC0B7BD50195A817C11C90C813A87141D9E747320A82992B1D81EF0527F13B5326DF6F63AAD5FA3EBB17946DEA2BE02073C4CE68CE78B4EC47E7D38B6CA660F61F91E6DBA219F0137A347A477059567A4D396C65B367A076FB09CE6E23D784FD568D288AF0CF229870CE80C1E44037C866E3E795762D3AB52246CB2CE631516B906D1F9E2B29613F0A0151BBC7DCCDEDB610BBCBCC570AE8CEF107D9CC54E3137E7261016D4DCD0E264D6E137A27EF71E406ECF4770FD107BD790549274F4E3624CFCC755CBCC8CE40A04BF51ECD36DD813935F9E157579064F6F5495143852A00F159211FD5721082A5D83BF3E26FE92DF477A0319543D3C50344F74DEC886AB2B494EDB76DC1117E4C7F2368C86F0899CC229A2709839CB7B12DE65B78DB6F636D9E589B0F473D407F876DBFC3B6006BCB33286D2EBCEE76FA1B9C711E345EBC99CFC807E5AD99182DEEA3EF63EB7CDE8A57A6C5AE2CC0B65BF9950BA04DB9D21287B50EC71DE05756C23AF9CA38AC33F0CABDFCCA30ACC636C3690AC4CA2FE5EDA1787B15B428233BE32317D0D7E9ADAA37E479E966DE6A1762AD216CDDCB5BF15AA5D5166FCDC4D65B782BD25769D5C75B5DD87ABBEA39991674A54C7D9A78ED3EDE8AB4C06B1123335530AAA31FD001DE86D8CA6D62AC6D461C22C416DB38B6A210C7F643A4D4E7AA17AC6AE2501E7298ADA463E4F358823CB4426FB2449D344CBBE9C3C27BE20ED573EA3F6833752DFA23FADF1BEF375B2E4D9651EB43B6ED18E6FCC0DEECE871663AFF25F926D7F752F2DCE7D30C69BFF4FC7DFABF67F4F99A7CFF9EF974D6EF03F7E7ECC89DC8BB253105FBF31F2C80C239457B8A1B4AFE2EF4E8AC174BBF5656579E3C87CE75CFAB9EBF71C140A5B5AA7B61F5A29AEA3B6BBE5EFBAFF5D72D3DF257929EBC4AFAE43F9F9615C7D3EA3F3B3DB8DCBFFC5BD3693A4DA7FFA5E95FFE4BD26FA7D374FA9F971AF40DFE8605D3693A4DA7E9349DA6D3749A4ED3693A4DA7E9349DFE9CB4A22E211D9F4EFFA3D257A7D374FAAB4E1FC969A567E5AE95DF5FF9876BDAAF19FFFF4B8D96C6F2C6EFAEDABBEA85D5B3567F6BF51F9AEE684E6EF636E734173697355736D734AF686E69DED8DCDDA26DB9A7E583D675AD5F6D7D73CD8C351FAD6D5CBB63ED736B7FBF6E78DDBDEB26D7DFD026B415B675B50DB4FD7A43FB867736A66C6CD978CBC6CF36E56C0A6F1AD9F4DAA6DFB4F7B43FB33973737F4741C7ED9D959DED9DDF8AA446FED035D875AAEBB3FFFED46DF95F9CBCDDF9DD73BA6BBB5BBA23DD23DD3775DFD9FD40F713DDDFE97EF3AF2CBDDFFDABEEFFD7A39B4ED3693A4DA7E9F4BF38D9582284CCA1DF26ECF93EF690632ABF4387E581E87949E0CF3E9AE909252F906AFA25252F26F4519114FA92925763FF1F2A790DE98CF7D19222FAA992D791432AB592379945D5D1D89B50C164FFB29207A2723CA0E429D1387EA2E40592E9F8BE921713FAA888D1715EC9AB89C6197BBBAA8614C7FB68498AFD3E25AF238B9D1A256FD250E732F664BE28B04FA27B1A785E8579AB6703CFAB79FD00CF6B78FD6E9ED7F2FC219ED721A05EFA0B252FD350CECB3494F3320DE5BC98D047A6A19C976928E73564B3E7B892976928E7651ACA7993D9E1B9C0F3FA04F80D0CB6A095E78D09F566960F4A3C6F65B0058B78DE8EF9A4E0029E7724F477721CE57C7242BD9B5FBB92E7D3F85CF298E9097D3212F27EDE5FA6E70C9EEFE7F9993CCFE9A94D805F9B309731A1DE18C3E55122911252843FA5985B4D7A4804FF2E278364007F46C82EB28DD72CC2D210E6D9EF76ACEFE53D0AB0A58AF463924823D675E3F52364989722F83782BD77E0EF4EDED384A9164B9BB136427662CD0A3EFA00CE1B9B67198EBE0BC71EC571241C7710C7EC251D98EFC0FC366C1B8ACF23C5A12F2221CC65C74B65249FC3D08E236CC3BE12CEDB8EF3B0313AC816A56F3D967AB096B58E228CC3719C181D7A391EFD5F084F17A7854416627933B6B0DA764E894B7194C719543095F82CA3D8DAC1F165A52E1C7B275E3BC46B46B15727A79C84F5317ED4214C8C3ABDFCBA014EDBB9FCFA08EF11215B714E46E94EFE5B52208AF59578FD30D630FA6D8B73700A0FD63E8250F4E295C348852ADE53C62886453B87894940279F91C1BC8563D7F51749CFE53DE75C322B93A16EA4473F9F4722B9D8BF97633018A75B1E69E6B41A8EE35386E316A1344F8DB41C21FBEF95733DFF9996F5BF1659BF520EA6B854CD256127F61D407A303E7661EA55709AC9693F88F0F4F2191A784B0FD6306A0E73DEACE49234C45B7AF91A5A85BFA77067342B2615A41C397AA58433BC4711966D1C4B19DF2E0EEF08E7DF1A4E6389AFC65D9CA6320D46E27C8DF56675835CBA18F5194C110E5F27EFB74DE17F3E5FE7037C9E6D1C6AF9DA0E659488526EE7636FE3186CC55E23BC8D5DB599C311E3E7E5BC1951AE902565E88A9AAE380EF9F1F2946C5C499D6DBCDC89D77460395F9113B61EE579F3E3F35C8E81CCB19D9C4E1D7CE55C8D663B154C7BF99AEAE7AB27B6D22FA73DBBA69FE772B17FDE25B27AF5D16518FE52DA26AE84987C0E71D98FC95B4CF6AF86416CF62BE19A9B20030C131997113E5F4C370EF1D5B38BCB0FFB2EC400D718ED5F88A92C7BED974895BCF20795DF3256729EE9A06D8A2662D0C6B8191B87F564FAEE4FC9A8ACB50714CE4C8D1E5B21BD0A9587B86EECE56B7844E12DF3556256A28BAFE67E8E658CCA974A753EE74C3BCF772A7270A546BB7C25E472CDCEF09C430A3145B84666736CE17A2BC2B9DA8E758C42DDD823D656A88CB9F1322D99A7ACDE296D311CA7580C9AFF8C1DFA33F5BEE4B96C8C65B131A4F4B834F7619DCCA798D444B8CDEC57ECC59474FF295B1693CA2FB6678C732BE32B6738C13390F92D4B414499AB9BCBF280C2F77C8EF390626764DDC334433BA7BFCCE7981CCB72B54DD1E0F20CCC0EC87665202E29ED64CA9E5FAECFFE0B7811A7503BC77D50B13931FDD1C96B469136F21A99F271246ED5FA1599C98DC1F8C5BC25CC8E5D62D191DB790934EAE456A6FF123D73258E7F623CAE7D7BF975B1DE57D76EF99769B718ED2FBF9A514DD6A78978C7E09AF2B6A656CD94258AF1309FEBFB413E4B57BC1C499010A6B7640E0DE368531656867A338725A258AAD1382F137589CCC34285E3C37C95F4C76188ADEB4B65E9CFA76AA28597B14CB43497CAF4142576723A6EFD0BF918B306CC1B1C5028134980A093FF66734ED1A50F7B7424D88E913FA18F65CDDFC9318859BC399768F1761C71906B9CABFBD7B2FF17B33253F48959B2291A25EA944BAF1AE6BA42E6D56605EFABDBDCF62FE0E8501CFB612EA5037C747915C99637D1A2FFA51210B36FB564316F5D419660A905AD6523AFA9C33AE6B736624B3396AAB1B61A6B72B0C72AA53D8773AA85DBA15AECD7C46D9C3C4623FE6EC0F21AAEE396108997596929F66FC0B1D8B58B492B9F63318EB68AF76CE4632FC7DA65F877B1D28F5DB1086B9AB0CCF2355C0BCAF335E05572B450A7D84419D2D5582FC531BC14AA3A3E630CB2E5586AC4F16B95D62A1CBB8E8FC7E067F32FE1F986389C4B1448AB388DD8C86CCC4508D1325E62B54DF87725F65BC5E7AFE238CBD036701C9660BB8CCB620E019BB940C155EEC7E8D3ACB4301E31F896619AC2AA8AD3A096433345BF45F8772542CEC6AFC1D6D5DC42ACC02BAB39A6AB38F5162B3463D82EE3A529AC644E2DE2D830AA321A54637E39FED4C469D7C87FCBB034268C7629ED5A78FB542F19BF2AE5F7224EB915BC247363112FADE6BC62ADF90A2F1B391E97CFDAC2257131EF55C5315E159790255C7A65E863D229CFB1220112793EC6DB445862522DFD8935228F126B6F52387D255D18D5AB384D185CABE2337FD1C8058F4A254525A5D2EA9E88B47C70607064D7B688B4687068DBE050FB48EFE0408154D5DF2F35F676F78C0C4B8D91E1C8D08E4867816432D546360F45764A2BB64506FEA35DABFB8DE3AAE27767D6EB31E3F5EE16A96D7840B77D686C75B0D3A655DA045AC6F6D81EB2DEB566D7760C886A7667D63BC9786635339BED2685404B535AA0E223096A9A829028F08044790009248448DB14894FD1BF80C7B669A189435BBEC2EFDE9975BC60225E10206D14CFFCE6CCBDE7E377CEB9EB7BD75536A76876FD76445D7FDDA9D3BADFEA066C0E65EAF7ECA5B7B1DB3E851AA6DB6AD205D3ABFBF523907EC86F7A74A16D85CC52B5E984D4DDAEA7E10774DAA9B94EDD74696211637C18A5A1DF0EEA366E8DA86306366D7B961DD088C5A15769D1A9DB5E681FA0A16D537BA3665B966D51379652CB0EEB81D36201721B961D998E1B4EAA810343B060D228302D7BC30C8E50BFF1AFD9E909F7C7330D7BBDED9A011D5F74EA81CF5C9B58B1839099D937B9E76E3E68B1BAA58913371B981DC75BA7E54603DED1F751C3AF391E2D39F5A6EF9AA14297CC2870EA8E492B268F31A477DC7BCF9D5B1668D86EB55C07D1357C2F9AA46B7E9B6E985DDA469C1163948969E4D37A609B91AD50CB095B6059A1A667D156E0E06D1D436CDCCD90B6EC60C38922A8AB75399B3DCE22BC00F5410F34980585DD39E75BEEB402DF6AD72385B25AC15C85CDE91940609D2622DBE65907461DAFEEB62D56583DEF7DCFEDD2716722CEDDB6E1D0703D6FE354333E033B64BCB1345D33C0A66FE93AC01918776025B237584E0307562DBFE3B9BE69F5B367C654A1C4108E0F53B8B6A3164AD5B259986C4CD3765BFD8CA27DBC6E329C25040AC14FD3A939F079329B6585D5F05DD7E7259050ADD09A19C257DFDB2AE75E12C69B51D4DA3F35657B931DE788D3B22DC79CF483F529F63485910F24853F81F4F2B20899634CCDCE9DBA5387FD36195164235E66341FF61113A3C63E6ABBE83E4E777F2F332AFBBA399B5D62C90979F5236E506063D67A6082194BA18D009D89EAA937CD601D31338EC115328AE9D4AFA1233D468AC957935E9DFDFB513087CC30F4D139AC3E2CBFDEDE4046CCB8E91D17CC8C338D7DD1D24AB29CBC3CC13DB26CB61EC479D8711CED38519389B7959B92941BF3BEF7DA7550A7B16DA62B88175458E04DC42254E8866F390D76B73921AD36020A9BBC61A1BAD666CD1B3261522588700A81873656686860B94E58DAD1D5B8E161326E9A8469EE44A7E96F5C2746D606EDC08333365760F95876B92F87ED7AD42BB06B758CE2B71CDE78FBE312376BFE517BDBA702D63FD632DC1FD664AD6B9592BC0A9B26A2AAD97D9D6B6E0B3460E6C308C5C4165E346FDCE8D72380F5DB82462BE5B9EAAA6A6854AFD025A3BCA2CF6AB374B75AC1F36E85AEEAD585F272956284A196AA6BB43C47D5D21A3DA8976615AA1D5A32B44A85960DAA2F2E15750D32BD34535C9ED54BF3741AF34A657CF8E8E84428AD96293398A8D2B50A53B6A819330B7854A7F5A25E5D53E89C5E2D319D7350AAD225D5A8EA33CB45D5A04BCBC652B9A2C1FC2CD496F4D29C012BDAA256AA4EC22A64545BC103AD2CA8C52237A52EC37B83FB37535E5A33F4F9852A5D2817673508A73578A64E17B5D814829A29AAFAA24267D545755EE3B3CAD062F0618977AB0B1A17C19E8AFF3355BD5C6261CC944B55038F0AA234AA5B5357F58AA650D5D02B8C9039A30CF58C4ECC2873259857D2622D8C6ADA97110C61CFCB15ED9A2FB39A5A84AE0A9BBC7DF0247EAFF1F91E89ED573CBE17A9916E2A8B1DC7613CBFC2774BBDF795647F63F13D89259E15BF27FE58FC097E7E28FE48FC4EDF3741FFA96F9F0667ED83B3F6C159FB7FFFAC3DFEBE7470DEFEFF79DE1E676F70E63E38731F9CB90FCEDCFF71351F9CBBF79FBBF7D8199CBD0FCEDE0767EFFF6367EFDB76B026FF8CE83DFF8EEF68EDBE1DAEDDB787E5BBD8F47BD377A40FA6E7D31FC0F55E8C36B1F2B1DFD3E3F5AA997A2EF57591F0F593ED6F03FE57604C47F2F7E3845CDD4DCE909DFFA592FB38FB6B6ECBF5D6137C6318E3FBF073AB1A6C780A9DE906AE42E703FB88428B66E4A9815953E83FBF632773F108AE7D148A4F0A4F12019113E17324257C5E788A88C259E12CF0D3C2D3C0E78473C0CF085F05FE9AF007E03785B781DF110B2425DE20DE4044F1DDE21CF0BC7810B8287E02F884788208E227C54DE02BE25F80FF2AFE0DF8AA78958869920E492A1DA523E076BA0B7C2C7D0CF878FA8BC05F4A7F19F854FA14F0E9F469E033437792D4D0DEA1BB883874F7D03EE07B860E00BF3F334B52192D03BB99626611B894A9005733CBC02B9955E0439943C06B998F007F341301B7336DE0A3990EF083994789903999790CF83399C7819F18FE06490D3F3BFC2C1187BF39FC7DE01F482A11A469E921224A1F97109D74423A07FC8CF406F0EFA54DE02B23B032B236D221E2C883F20849C9EF92B34494C7E471E009792FF05DF2B780BF2D7F17F839F9A7C0E7E517805F947F0EFC0BF99744907F25BF02FCAAFC3AE46FC8978137E53F02BF25BF05FCB60CE6E577E43F01FF19C9134753A3CF93D4E80BA32F01FF6CF412F0E5D14D228C5EC9E6492A5BC8EE2262F63DD915E0D5ECC7801F1883DDB1F363E78930F67CEE6692CAEDCADD4284DCADB9DB8898DB9DBB0F92FB73F7037F30F76BE0DFE45E057E2D7711635ECFBD09C9A5DC654836F32249E5D3F93411F343F92122E433F963901CCF1F87E4A13C72973F9D47EEF2670A8F9254E16401392D9C2A405E385D384384C2570A175083E9A4CE05720BAF87B812E21A48B20FE60DF05C95904DE990049EA50F4B884532A53AAE0DA985EB51A98BEB31E48865E753B83E2C3D0CC923D223C09F964E023F263D0EFC84F459E02F20832C7797924C09C8D1EDC08A3C0586F7C87B78165E03BE285FE40CBF88EB85D10BE0F925B0CDB8BD11D79BB23781D59BB36032BB8BB1FD7702E13FCD0D0A656E6473747265616D0D0A656E646F626A0D0A3130342030206F626A0D0A5B20305B203735305D2020335B203237385D202031305B2031393120333333203333335D202031355B20323738203333332032373820323738203535362035353620353536203535362035353620353536203535362035353620353536203535365D202033365B2036363720363637203732322037323220363637203631312037373820373232203237385D202034375B203535362038333320373232203737385D202035335B203732322036363720363131203732325D202035385B203934345D202036315B203631315D202036385B20353536203535362035303020353536203535362032373820353536203535362032323220323232203530302032323220383333203535362035353620353536203535362033333320353030203237382035353620353030203732322035303020353030203530305D20203137375B203535365D205D200D0A656E646F626A0D0A3130352030206F626A0D0A5B20323738203020302030203020302030203139312033333320333333203020302032373820333333203237382032373820353536203535362035353620353536203535362035353620353536203535362035353620353536203020302030203020302030203020363637203636372037323220373232203636372036313120373738203732322032373820302030203535362038333320373232203737382030203020373232203636372036313120373232203020393434203020302036313120302030203020302030203020353536203535362035303020353536203535362032373820353536203535362032323220323232203530302032323220383333203535362035353620353536203535362033333320353030203237382035353620353030203732322035303020353030203530305D200D0A656E646F626A0D0A3130362030206F626A0D0A5B2032323620302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203630362030203532392036333020343838203435392036333720302030203020302034323320383734203635392036373620302030203536332034373320343935203635335D200D0A656E646F626A0D0A3130372030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E6774682036373936372F4C656E67746831203237383438303E3E0D0A73747265616D0D0A789CEC9D097C5355F6F8CF7D2F499BAD49BAB769D2B469D296B4E9464B5B9686D2969652A0B4C194B58502454510A82CC2881B600571476014C45D54D280500415119719451D4567DC97D171A3238EE228D8E47FEE3B69290CFA9B3FFAFBF99BFF3F879E7CEF3D7779E79E7BDF7DF7D57C2C3000D0E3870CC6559657348EFC936D31B0DC030061BACAF2D123EE7FEFD6EB80657B00C4B6B10D39F95BBE9AF935005B83AD9A67CC6D997F91FF3A2DC085E300E430E3924596B2C73C47016E680450AC99357FF6DC3BBF287F08E0622C5746CDBE70E9AC679A5654016C780720FB92B6992DAD0ACFB22EEC4F83FD15B5A141BB2FE935CC57603EAD6DEEA225DDE3E30763FE3380F3DB2E9C37A3654273ED268067B0FF4191735B96CCCF8C887B1BCBDBB0BE65EECC452D9BAED87A09B041AF60FEAA8B5AE6CE2C50ADBD11E0472CCF7D65FEBC858B02465885E329E6F5E72F9839BF3869DD218065AD00B1DDC063A1A84C567CDFD6384D37E438248403977D5F2E7F91F393CA8B469D7CABA75095183E0EEB2A4100126CA7003FB043AAAD27DF3AB14A9528F5D44F121EE216E31A58097A1882ED04640E34036805E9BA0C44D928613F06315CBE515E805D9A89E22BF09800E120E8C20451261305D9C7E00C1C84B44BB15B25EFBBAEC162010B80ED45F221EC0EC16E0116E065E20179041F2944CB224E79C35EC6E97E13E2E01C443604C69ECD2E57C3BAFE79F1D3D3F33F25E243B04E9E0035E7E2CBBFD5FFF4B3FBA1F0E3752BCF5E269F03E3CEF57AB2CBCF88C3F3507656BFBE03CD69D72C81B5E77ACDFF5B918D04D5B9B4135F808967EDEF06BCA7FAD75B7F7AFE27FBF3C02AD9EFC1732EBEFC3B22FC78763F14D578DDE7CE5E267B0BDCE77A3D99ED8C38CC831167AB275E0AC6D3DA3D04579DEB35FFB789AC166A7F6B1F42F2CB45F80BFCEEB7F6E13F4184E3507A4EEDE0EC7B69484212929084E4B7116133FCED27CBE6C0CBFF93BEFCA78878052CFDAD7D084948421292909CBBC89E8259BFB40F310AE225C642A378012C11F6A0DE084BC4E5FFFA7B1561362C916DC2325E7EE7A972518B6DD640A9E005B3B8042EFAA53E852424210949484212929084242421094948FE33A5F71DB32F1F7CCF94D2FFC57BA654E7CC77CDD07B66484212929084242421094948421292908424242109C96F2E6CE36FED414842129290842424210949484212929084242421094948421292908424242109494842129290842424210949484212929084242421094948421292908424242109494848028FFDD61E84242421396791A18AA869C1BF827514734CFA8B2222FFBB43E256ACF13CDAED60C19402535A4885E13012C6821B5A61016C356599F24C05A652D310D3708BD2F66240FA6B5658CF82F546C06818DF572F17EB1563BDB2603D16388E7BC8D3415F76B3C4C08C2F579FFAD79DFEFED0A05FA9928F5990FF932311C551E20688847848426FD36118544025D4C244988AD76F03053B2AD5FBFACCBFF7857921F8D7C104F87961FDAEF44B8447FD94A7BDD2EB31975EAF7FCE99C49F29FB1FFBFB54BF9288BF6A6FFFAFAC59E9AF8EB1E660EDA47E2D99E42D295FB596A0F238A6908AA3823EA04AEB757850F9EA1B11D448D48AA0F2FF4F576550F9B5AA50474A71048C08E930D43AD431C1366383CA57EDF8A0F2BF95D310D4A9A88D416D457507B52D986F0DAEE305A4D2BADD1A541C8B298B347C273217350FD37B9005A4E178FE3015A39662FA49E410D2709C1F53192A8E37FC590C8D92549BCBFFF61EA95CE9AA9A3675CAE449139B3CEEC686F1F5E3C68EA91B5D3BAAA67A645565C588F2E1AEB26143870C2E2D291E545498E3CCCECAB0DBD2ACA9C9F1D106BD4EAB5629C3C31472992830C8AAB456355BBCF666AFCC6EADAECEE6796B0B1A5AFA199ABD1634559D5EC76B6996AA594EAFE9C29AB3CEA8E9A29AAEBE9A4C6F190243B2B32C95568BF77085D5D2C526D67B30BDAEC2DA64F1764BE93A292DB34B192D665252B085A532BEADC2E265CD964A6FD5256D1D95CD15D85FA75A35C23A62A62A3B0B3A556A4CAA31E5CDB0CEEF6419C3989410322A4B3B0508D7F2CB7A455B654BAB775CBDA7B2C29892D224D96084D4975731C21B26F56599C37D866B2D9D59073AD676E9617AB343D36A6D6D99ECF18A2DD8A843ACECE858ED3538BC99D60A6FE6B28FE371C833BD59D68A4AAFC38A9DD58EEFBB00F3CA6D7AABA5E338A0F3D6EEA3A75B5A8216854D7F1C78920FB12F4C58DE9B06F40D3DC4F1A5A4705FAEED72C174CC7857D67B286F81E9461FB8721C4D5EA199971CE82D8971F39295BD257DCD9BAD297CAA2A9B833F97B4C57B574EB7646761F4A51F1BFE60B9C52BDA9BA7CF68E36C99D961ADA8A0B8357ABCAE0A4CB85A8263ADECCCCDC1FA2DCD3888393C0CF51E6F8E75BE37DA5A4E15D060E17330A7C123350936F3468FF042F38C602B6F4E6505F7CB52D9D15C410EF2BEACF59EBD5010F8A073A0C5B8B300064213F7C31B3B0227C55ED9E1699DE54D6E36B6E2FA9C65F11853BCAE260C5F93D533B389CF9255EFCDFC002F97225D516A85633BA3766F653EF2305BB8C52318C5263E5B68B054E187B57C0816E871BAA42C9FD1F221160F33426F35BC4AB0064F9DD60F6644DB886A5E24F2A623AA8D294D29243FE39231E893DCE60DEFD7971E0D7D3ED1757ED235AACD1DCAB454CEACE8E7E0699DCA830E067B3BBB9F028F45F0C2D8229C4F67756F9168C33B176D02762399F82CC65BBC30CEE2B1CEB43659710DB9C679F8D878ACA5F9AD6DB0D6D64FF448B31D5C258DA7E5A8BC98725E48C1E2DE8C3002D76095C3D83BAD527EA494EFCB569F515CD35B6CE908B7D63674F0CEADC10EC18277100E5A61AF69B9B6387220DE9A55B8BB59AB5AAC16BDA5AAA3A52BB0727A47A7CBD531BFB2B9AD94F761AD69EDB036788618255FC77B561897F14B45422DAB6D2CCFCEC2BDA7BCD3CAD6D477BAD89A86899EBD7ADCD7D7347A7C02134634973775A66199672F3E095D9255E0566EE4190BCFF09EC663265CAA6FDCEB02582995CA2483949FD1C540B285F7DA18CCE812C8A6EFB509689391CD25D9B8E024C5B7618871BBADB4B4F2E959DED4D6D1DCC46F2E88C5A9C41FE665D661E015ACC33A99A0D07855D699E55EB5B59CDBCBB8BD8CEC0A6E0FC385C162190687EF491DCD56DCA7704179C0C868298ABC4B4B5720D0E849396CEC6E4AC1A5361975A2C7AB74E0DE2FB78DC27A23B936A379A477E58C16EE07B83DBC6D98AD6646132EDBDE0EB14A8D57893D28833D608D2AA90D5F8ED86806CE0D4EA0D47E2566BC2B9BBC4D0E7E51CF9C266939EBBD506D2DC569A73EE5767EA19CA68E486BBE746FE2ADA0B2ADE650A26FD0E0218B11B378B1260A5298063D9F61C5A219CD168CB60C6634E052A7BD546524CB4CDC1265F69992AA8CC142E0C3126D6AADCAAB746287F8C3D36A27BF25E5B6B0A626725ECAAD0E56C06BEBBD6AF4C8DE2F94C106181D2CAAE1BEE0CF6A7495577D8A7753DF05E3AD4B7067E14E4B3D8561B1576BAB69C1CD9FDAABD1622DEE6D1CCEF70875B08F43640DE323D760DC455B6357E03EEBD2947E929D65E50F07BE30C1B817173634759C69F04E726467859F69D54AE68E8E70EDD91B50BCC2B57D4423F894E297C34DE2085CF283C5E1F879AD980B9B5105908939D08ABA08F508AA4CCC16074031248B59413AC401BEE2E4B427317B37EA2E543170008DD6F4AABD5222C952357C8638048AC5C1E0164B9125C862E4206411B21039105980B422539129480B9E1B1D22BF152FE09FE2502AC3DC60B4A58979D0882A48A981C1DCB7A8328816D3A102F5635411BD4EC73A6459847A15EACDA84750BF450D47D753B1C7817845866D2D58DB82B52DD8A3055B58B0850514C20F3EB329B94BF8DE677620FEE9336721BE231C277C4B65DF50EE1F84AF09C7085F11FE4E35BB0947C9F825E10BC2E784CF089F12FE46F884F0B1CFAC44FC95721F113EF49922111FF84C0988F77DA61CC47B847709EF10DEA62A6F51EE4DC25F087F26BC41789D7084F01AE155C29F08AF105E26BC444E1C26BC487881F047BAEC1FA8E6F384E708CF129E211C223C4D3848788A7080F024F5F904E17132EE27EC233C46D84BE822EC21EC263C4AD845D849F0113A7D49F9082F61872FA900F108E161C24384ED84077D4979880708F753BBFB08F712EE21DC4DB88BB08D9ADF49D84AD842B883703BE1F7D4F566C2266ABE91701B6103E156C22DD4EE66C24D841B093710AE27AC275C475DAFA3E66B09D7123A08D710D65083D5845584AB095711AE245CE1330E445C4E5849B88CF03BC20AC272C2A5846584A5842584C5844B08ED844584858405848B09F309F37C8985888B08730917122E209C4F98436823CC26CC22CC24B4126610A6135A08CD846984A9842984C98449848984265FC2208487701E6102C14D68243410C613EA09E308630963087584D1845AC228420DA19A30925045A82454104610CA09C3092E42196118612861086130A19450E28B2F41141306118A088584818402423E218F902B4164BE7827E672C8E8246413B2080EC20042262183904EB0136CBEB8C1883482D517C71774AA2FAE149142460B219960269808490423219190408827C411620931748568BA421419230906829EA0234410B4040D414D501194D46738218C8C0A829C2023880481C008208105087E420FE147C249C209C20F84EF09FF942ECBBE9346C48E93F15BC237847F10BE261C237C45F83BA19B7094F025E10BC2E784CF089FD2F5FEE68BB5223E217CEC8BC505C6FE4AF8C8175B8CF890F0812F7604E27D5F6C05E23DC2BB84777CB19588B77DB15588B7086F12FE425DFF99F00675F63A757684F01AE155EAEC4FD4EE15C2CB84970887092F125EA0767FA4AEFF40789E9C7F8EF02C5DEF195F6C39E21035789A2E7490BC7E8A3A3B407892F004E171C27EC23EC263D4F55EEABA8BBADE435DEF263C4AD84517DA49F0113AE9B25EC20EC223D4F5C3848708DB090F121EF0C5E0BECBEEF7C50C47DC47B8D7175387B8C717330671B72F662CE22E5FCC78C4365F8C0B712755D94A55B650953BA8CAED54F67BAAB999729BA8E646C26DD46003E1565FCC38C42DD4FC66C24D841BC9A51BA8E6F554733DE13A5F4C3D621DD55C4BB896D0E18BF620AEF1453721D6F8A2272356FBA2A72056F9A24721AEF6454F425C45655752CD2BA8CAE5AE1DC863BACAE4AF22AA933FD08C493E88FA14EA01D427D513927DA89DA85ED41DA88FA03E8CFA10EA76D407511F40BD1FF53ED47B51EF41BD1BF52ED46DA877A26E45DD827A87AA2D7913EA46D4DB5037A0DE8A7A0BEACDA837A1DE887A03EAF5CAB6E4F5A8D7A1AE435D8B3A5C29FC289C8009902C9C44B64132BBCC17C56FC7DFF922F9D25A4458E833F0A5B5807031613E611EE122C25CC285840B08E713861006FBF41CA5841242316110A188504818482820E4FB747C9DE6117209910403414FD01122085A1F4E4A17D310D404154149082784F9B47CAA15AE49C8BFA376A31E45FD12F50BD4CF713ADF477D0FF55DD47750DF467D0BF54D9C96BFA0FE19F509D4C751F7A3EE437D0CF5769C8ADFA376B19514E9653E035FF24B29384B088B099710DA092308E51487E10417A18C308C3094861C4388264471EC154551F0B992EF7E4214F0E54E8043A8A208E4CBA584069AF5F1E4593D611C612C610CA18E309A504B1845A82154134612AA0895840A422A21859CB71092096682899044301212090984781A661C21D6B519D983FA23EA49D413A83FE0047F8FFA4FD4EF508FA37E8BFA0DCEEA3F50BF46FD14F56FA89FA07E8CFA57D48F503FC4D93D8CFA22EA0BA87F44FD03EAF3A8CFA13E8BFA0CEA21D4A751BB50F7E08CEF467D147517EA4ED4CD7CF6851E8AF10AC272C21C9F018F42AC8D309BC2328B3093D04A9841984E68213413A611A612A6102613261126129A081EC27984090437A19190437052A8B3095904076100219390414827D809369A9B3482952027C80822412030BA23C1B50D1940F5A37E86817D03F575D423A8AFA1BE8AFA27D457505F467D0903BD17F56AD1967C95E84CBE923993AFA85EE9BE7CFB4AF765D52BDCBFDBBEC2AD5E317845ED0A51BDC288B874C5F6156FAF502CAF5EE6BE74FB32B76C59F43241B5B47AB17BC9F6C56EF562A6B9A4BADDDDD8FE71FBB7ED62747B637B6BFBA2F69BDB8FA021ECEEF65DED87DAC5AEC00157647BF1E0AA95EDD7B70BD1582E403BD371734ABB3AA26A51F502F7C2ED0BDCB20503170883BF5DC03E58C084DC056CDC82E60502D6DAB9202DA38AD72E5C109B58A55F90BBC0B540BCB87A9E7BFEF679EEB1F3E6CDBB6CDE96794FCE935F366FFD3C6107A604D73CA5B6EAA2EAB9EEF7E732D82F04408F7A4008F844D5BC7D821F187C25F85D01760106E07C0CC41CE76C77DBF6D9EE59CE56F7CCEDADEEE4D6B256618673BABBC5D9EC9EE69CE29EBA7D8A7BB273A27BD2F689EEE48965138526A7C77D1EB69CE06C74BBB737BA1B9CF5EEF1DBEBDD639D63DC63D05EE7AC758FDE5EEB1EE5AC76D76CAF768FAB66239D55EE4AB128199F2560C69FF9E695E6636699BAD934DF24CC377D603A6612E7271D4B122E33325DE26589EB13451D7E08F491909CB03E614BC28E04B94E4A889AF9912B2385F986950621D7E032BC62F8C02003C35683A05BAFDBA2DBA113C7EAA6E9BED20574B21D3AB623E2C9889723C4B111D322E64588BA089E175DF57A578433AF4AA74DD6E668C52139DA32ED58ADB85ECB5C5A677E954B9B965E55A619AB99A611B768984B63CFACFA4A1550092E15167CA50C2885809281C82C8C01D323C4709CA55D2C26B94A7C9CF1FF8C2B07C6AE8746476D5758607CAD377CDC242F5BE3B535F04F57FD44AF628D17DC1327793A19BBAEA99309231ABDD1FCB7EC52FEEA75EBC0545EEB3535787CE2D6ADA6F2A65AEF4A9E76B9A47480A701AB3439A62E6C5FB8709163A1033F50A72E44CBA276FC91C0F013D9BE88972C5A0858C5D14F169E0EACB390A35D322D6C9FD68EBD60019A174A669E9B2A5571FC6F9085FF7595FF3E61BFE5C5FFFF16C0A5CCD7F5C2FE0B912F065CA70BE3A74D95BE4A11760780FFA67EDFADB81CFFFD1EB6C3A3F0183C057F84D7E01BA68266B81A9E84BFC217F00F3889776E188B61492CF36C5FEB3837F15F299F0B5AF10028200E207022F0B9FF81C0E7B84144F4B3DC84B93899FD94251019E83ED3E6BFC9DFE57F49A106BDD4562FBC80D663AC3B704228E3F94011CF0BAB795A6A712CEC0EFF0EFF96D3DC990F0BA01D96C052580697C20AF81D5C0657C22A580D6BE01A8CC56598BE16D6C23AB80ED6C3F57003DC0837C1CD700BDC0A1BE036D8089B6033C6F176B803B604CB78FE0EFC77AB54CA4BB6C1BDF0003C84BC0BEE867BE03EB81FF30F62F41F8247D04616CA3F8C96AD70275AEF452BAFC56D3BF09F173AC1073B6117CE19E57B735D700076C31EE45E9CCD7DB01F1E8727701E0FE0CC1E946CDCD29BFFE99AF4F9341C8267E059780E9E873FE0CA78015E84C3F012BC7C4E25CFF45978EE15F813BC8A6BED08BC0E6FC09FE14D781BDE83F7E103F80857DDD17F29FF0BD6780BEBBC1BACF521D6FA043EC79ADD5893EA519D77A4D2CFA41E8E60DB0FE063160EC79900272180293E7BB74A33B4519A473E7B7C76EE96E2CCE76307E6F90CDDD737370F638C1FC6F9E4399EDE149C8D47B06E2746B0377E678FDA4BC1D9A178EFC73A3C16BCE4703016CF056782F7F3445FDB17A4329FD4EE605FAFA7224A237CBD5F74DEE917C34FE06F5264287A547A2A7ABCC6C758874799F7717A6C3FC2B6147DDE96DBFBB7E1656F61FE73DC1D8E62A439BF9466E24BF8B42FFD69B0BC1BFE0E5FC171E9F3187C8DFBC937F02DE6BF43CB31CCFDABF54CCB3FF1DFF7F0039CC019FC117AFAE57ACE28E9013FCE311E3198C044F09F4A9DB24A2A6372A6C03D2D9C29998A69989645301D1E58C2CE2851F79518FEA544739632A5648964512C1AF7CB3816CF129911F74D1333B36496C252FB9525F49558B0C4CAD2982D58162BB54CE86B9B8C35E2FAD5CD64B96C317E3A9893E5603A8F0D64856C102B414B36E6F3315F8A65B912CB611C4C870BE184FC33E145EC3F1A7795CE73DDB5E50F420C6C0D7C1F28F76FEBD92FEE668DEC458C48040470A62E622ED82A9F0A17C8E707BE63A981AFE523034765270247595EE05B50895BC559781F7C281B0DCBF11C08FE85E2DBB8638B100625500763A0713F68D9EDB8AD97B2177655548467873D8159012CEC0508C7E9BBDD152513B4466399B550B156AC37D49485AD151AA1ACE7BD779FC58FC39125398759CEBBDD6F74EB7B9E3594E4741FE9CECD63861483A4D11142589842614D750A85E9F6A28282FC6142E140BB353542906C038B060D130BF2CD8218DD6B1926F03C13DFFE71AC58D993262C4D19DC9027670E5B5C725478B8986CD6DA0A2CBADA3A6B5146A25C16AE10E5E161E945E556F7E251A92FA9E2D3934CE9F12AA42909D973501E71E21FF28893E7C92A4EEE173E2BF10C4B532CD5AA05B932FCF60C734C5A5ED2D05AAD4E2B8F30C6252685851B225403AA5B7A3626DAE254AA385B62928DF765EB198C11890B9C903D2D8F8654B0C3BBFC94ECF6EC85B4C067BBD43A36DADA15F8CC65E2299B466B8DD7422C8B88B5AB55D65415C8ACCC60B5DBF00DD46576A941C322458D26DD9466B59A55DA58B0A6C687459AC647BAE56E882F2B2B8B8C2B2936141830B0D3A64E2948ECCE67093953A7C41FCE2F58B1FAD021167F68EA144AE6E6E119DA78BA0F8FF2C42FB8566E9EC3D1648B8DA5394B1753C222446BAADD5E3488D144C58559C51459A746115B9C575062D6C8CEF3278E97694D850EE7C0688586AD57E8ADC30A0657A51B1407D91E366F7ADA8018B9A8D46B99AC27224A2D53C40DB0CA961B62D4A2A88E8D7AB6E72D7C41191BF852A6915B71455E4371F52581E309E139888078D60229600F8ED0CE7F8710D520EB6213F714E6C673532EFF25834B39018793D8E338D25DC63F182E430C8F71FF39B6CFCD6BB24547D0B21D185954840357C40457285FBB31D166812F651E10994654A862CB26B5575CFDC6ADE33C77BC7B7551ABBBC2A8528832558452E7AC995955B7D49D9573DEA57555B36A72B42A4DB8EC50823521322E2D2576FC5DDF6EBB87C12313234D766364923DC93C2051637558CBDAEF6D5B70DF8585291996F07807FFFEED3A00D901BC73232119E651949E84286133EE0F89C28DA084F8E018E3BB98D3A58CA8374AC333F2DF90B8E48D7C78DD8EB26E07A33B1497CDBFD90063C16F636B4AAABDD030B0A82005C72C1F8871B01A78086407A63CF2C343FE1752B2B353D8E887BFBE6782FF9863DA2D4BAFBEE6C29B67E4099B7C3D5B6BD3B3646D59E9F55BBEB86BF21D8B86FF787DF1C5F7E3ACE388C4B538A22C7884C6D39998DE25DCE8D229A32C51161C5162BC161D4A7C0C4FC03881BBB5ACCE6E57247405DD4E90DCD6D6A74B6EA7F3DFFDB814A7DCC625EDE0A3CD892C29C9C9D1F3956DDCFD2BF4484BE3F470484B23C570461207A7D2297B2EE191115629235472392E087F3E5BADD4F1B44EE95FCA5EE5E9D9B865A92948AA8474336E5C6AFF21751C6E65F63895FF26757C3AFF36F6BAC0097106C62B1DF604E31516D525DCEC8AD59AC06C0ACBD0B1BAB0788D968D0ED3AB31F9183B0FA202C776633A2A2A41D115F86027D65048838D60A3155D6CD22E576A7D82B411E00883E373F0981D3294480173197EBD6EFBD651FF38F5EEFABD91C401AA31464D6C9D32422D97D20B35C9F9E9F602B316A3D8C2ADB26DE6CC788DFF6E557C86D99C91A8F69BD57AB542811FB25BB2D2D50903305635812F649BE56950066F52AC762625E9E2F91710205DB74FD80803F9F2E79EC7A3E73BB5128FEDD470B2F45DA9A92539C3F6B11C7C62AA828B43850373294B1AA2A5C511CD7F8BE9CA99105C1C7CCFE09B28850FF79E6ECCF4DE64FF2D57E98DE6691B52D12003EED5D223548A318657D6EFA12AC39028B54A6D69F3D59EA9B75D583AF8FC5B26664DB01D8F8CE60B933DAA4F8852C50C6F9E3DA770F3F10727367B7FD8D8D831BBC2A891559A0624A8D206A40D5F7CDFCC790F2C288D8E6659D94549F638B53A3639BAA7C79C9D9814AD6A7AE09B4D5B7A3AA7C6A5D8930A82F777233E2F13A1A6F7691983CB550D4ADDF818697C31FCB7BFA76E31967398EF4CAE9F2A3FFDD6A3DD37866EB546BC9D543D3B52B2B5E6027B7ABE59CB36A0417E9139D3A8C11B6B834AAF5228F0E3E457EA844CBA971417E3BD3404FE4CBEB9D4DADCDCB89C1C95333E3EB14B68DD9596A7D1A830B107D28AEA1334EAF87D2C1B5CE00C1CDBA5B70AA3F370225D169E8AD3F34F2D7DC6E1AC3B15C919F5C9EEBE672C7FC8F25F0AE0D3353F1F0779A43BDF50A0E71F8692A139050586021CF4A3BFEA457A2325DD5A56C61FE1F83067D6D3EE37E969CE0AF8735D8AA4E262B529D796969BA411FCD7C8229373535373932345FFAD82DA9C837693BA28FB216779AE45C3E2652C559B9C596CEB34A62768D37AA32B339DFC586B5089727E2F269DFC6B9FFDF282229DB564C08F3D221B509AA68BC056C11D4DD6258F84A1B093666177BA4EE5D4E9A2F9F732CCCE7CC42E30178FCFE47188D4D985D19919CE548D9EA7346A85AE8BADD8833B26DF6D9CFC3F55F42E158C464949B7A1A4C481B74B8983628E11CF3150B07DBFBCCBDE085360EDF6746B6C6CCCBF8637CA2CC615D8FB2D575997DE688B9A6F2D706424F89F482A8D136432B5D199667526AA0665ACB30FCC4C8BFA31D691618F64A2A84972A6A53A135493E3D2E2D511B6B27C614AD18AC1D5EB47F74C52D196A7925D9B93A33517A6FBD31D0D0DE332AA6EAB14A6A9F41AB95CA357E1A9615CE0737982DC0651F8D4E83B35440B07F1D460C64F15249C7AF64DC61BAFC11A4F27497EE3C9279CE5D4F06F36E8B73FF51EE9A54343BFC3933C61DC1D9F6FDCF0E1ADB5C84D377DB8A1CE7FD452B7B2B9E58A712996D12B5B38855BEFF4774E19BBEDC4F6DB4F7AA78ED9F6CFDDB3EE5B3CBC66D95D93CE7F604959F5F27BF8C90857511DDECB4550019B698CBBF44E43A66A9FF02C8E7390B0D997596690BE83E6D4F73EEBF55DCCB6D3E58A1BDA6B18DAC53277BB52EAE37AEFA844E989DFED28C1B1E71FE996B6DE120C41E73975D2EF8E4C179DA2D57AC6A32F36CE2CF26762182E98B8D85836D09E6EB7F71EB1EAC2CDA5F903F24D1AD9A2988C3CD780F15AB3F448D4E0916B6C41B971CC8AF39C29AEA9434C05D9195173752AFFC3A5E5D105D997AC2A6E2C4E4A55EB54B8C60C1A969237BA20D11FD577576EC84A9789EAA2F316D70DBFA07158544446498D3360B78AAD2E4FA45CE1BFC19857C1EFD2B2C0E77894B1410DECEDDDC7870B1B1E4DCB4FCBD718F9370341E3E4FBD62050B1ECDD8641F82F76486F448674B16C9766B8519ED9102BAD9458FE9FF34EAD147E57390C7444D377F31B553AAF754B8777E7AFD3EBA9B528EB5D8BF41EEA5404F3671EEE15E2DAD1573C3263C442CFE044B50C8F681105E3E6D5E48E2E4CCAAD9BDE36BD2EB7B27D4B9373F2B861D16172410CD3AAD5B9559307395C8E989CB1AD6DAD6372D955B336CD1E189B9C9A98E74C1E90A84EC948891B30CC9E5596E7C81DEA5E543F65DD146744BC393A22CE9A68CA48D424A518636C034D0E2A5F8851D7E069EF0B5CD5A9D0103CED81024F7B3BE30D8AC8DE30444A872D53BDA6F7B095CF720EF51CE68BF4E72A9D3A89F5ADC194DEFB547A9A7E211D4EF7F367293F78F9F7ABE8F0AA12AFE7C755D936536682E66477DF428AD224649ACC0312D4FCF085BEAF0D7C2E7B189FFC0E7093EFFBC1225C8FF762AC70934BA3B28FD78FEF7BD998DC6FDACA7AB71997FAA7EBF4DF594E9D02827B4ABF8DF6E1AA35CF5FB1ECE0AA91D2F9118F04F69133860E9B5E61D3F061E59935ECA3C5FBAFA818BA7CEF72B1EF9EE891D55D3CCA66AFB9A04254F7DAF8DB970AF79861B22C48830CA87D343E2E5D63D77609F57BE2EC6851DBF1A0B0ED51B0DB4C03F0AD41EF526A3491A699916DF236E04F66DC0070EFC0B7F8F823FC091259A27F97989B77EA4D3BFDCC376D19BD693BD4E1B18307E51527A965C3FDB386CAF99B76765E54989A8D5118D28615640ECE4C34A864CF0A3730DB346B06BE6B87E9B44F7445E06358113B2055DCA88F52C9982C4C63D0DCE31FCD676762E04BF15AD9602884A1BE7848DF27BC061A886585BB2C26664A95BE0D334BE86291BB73F2CAF284BCAC2E764167D81C28EB3932A55BFA08BE5DDBCE385DFED40BB278ADD254503DA9B0FDF155D575D71C58E46818599CA491876BC33569A5E34B86350F4FCDA899396C605D71BA260C5F9BEFCECC3525C5EB2AD6BCB87ACDABD7D544C49993F2F24DF67895D162CC9BF8BBD113AF6C484F302584C766F2995985EFC5A532BBF45E9CCEDF88EF92DE882FE36FC42CD717D18AEB27AF533E1BCABACBBA83EBEB67DF674BEB6F79FD7AFF7BE6CC4C332BBDEEF075A3FCDFA5542F6ABEE002CF823ABB907ACB2B570C4EB38B37DAD35C971FBCA66A49537E4F4BD6792B31AEE889988D9E64C150E94DF6B23D4A7C8F8D026562178BD8ADB733E95D93197CDA565C25864E05F984CBE36274EC70DF6BEA4FBC5EC69CF97A99CD43D873903B2A94625226C30FFFE5AC323C4229932923C2FDFBD8956892B7186D712AF259196B4F32A6C5A93EC68431D116ABF4FB957136BE2A56E17EA342EFAD50D029C7A7E5ED7B92D46A232419E5B814761A0C71B22E56B8D3D21AC7D73477BA9BDE13C96716AD38DDC3339E6EA24A6FF0DFC92AD035B99CBBB65F63CEB7E35DA941E7930C7AF1A942A75F1567337257FD57A8A89A4ADC6F4FCBE6DE79F07DCE2C1B8267E39A9D66337F93BBD40719BA2784ADB88CCB5824BE4259997277021E76127255FC5B5BA5B3F0ED694867EE9C6090FB9E30FCEDCCC0DFCECEF6FE54683DB511F2F39C228CCECE7D6F5046B952AD30148CB9A8B67679537EEE84252393CB8DFBC230CA381B616C99392526F6FFB0F725E06D5D65A2E75EEDBB2C5BB2BC5FCBB6E44596F7358E63C74BECC45BBD244D97D4B224DB6A644995E43829217129F4F198C04069696967980E33406128D0A42D69135AA70E4E69D3066829296D21A540CB52A62DCC230F12E7FDE7BFF7CAB2936652BE373330A3FBC747E79C7BCE7FFEFDFCE75ECB2918DDBEA3FCB61FDC39347AEF4B1FE9DB734D835923B925CF914E0DB8F29AF9ABB67EE86AA74EF723B5B93033B3D0AC2ACE5F1EC82852E82C4655CFC79EB9E5D6EFDFDE9F9A9D93867C834DB1BF87B863A5DFAA4965FFFE21A2D0F980B1A607A5683DFC91A9884AFFA24311FBFB54D3F9E5DC122AE9A2EA3C2DD3051295FA1A5C600A8FC33950460F83E78EC3315AD0BF6C11F4DF487A1E729ACB1D20E2ED6D2A9BAE425D5E6EAB850037DD96426C75DE728B469263F7E64C1B85F0464F1E7C866D82E30C08DA4ACF3634554A3C820851EE524790D49A543C8258CCB2454D566591BD325BCD2E3F2F6DDCC095671B24CB3F64A1D76EAFC852BBEC5F2F6F73E5695F92FE449757D6EC78C0E1CC53F3C6AE96549D7B3AC520556A9592FA73A7E2BD074B9C465B53F1F9E36C53697381C15922F02A6D07A9AE23AE07F34DF4D7A9B3A595F0D1A623D9F53E4D693A3573C9141FBC9BE2C7075ED010A31D129AF0A7F127ECB5DC582CE9352E49C246D45E66FF4E49A5E9D5FCB65C86651995B5D4662BCF50B9ECDF35E5655A544F1775702CC3328C2AA3D4565096A11A2B71DA4B99A5EE4FB5E776F76CCA5D66139951A5E6A42D5F37787B4FC1D0F05021B3203E4A824838063EF211F0119AEB3B6896FF25CCF2EFA7593E388461B280DA8DCC7F5124BC4C8E2EFDC8A68F3D73EB2DDFBEADAB173EF72E7EB467F9DDAC565F6FDFE486ACAC566FEFE6A9B66C36FFB6E76FEF6BB9F57B9FBEE5BB9FEA6FBDF5E43D43F3D75636DCB0B76BECC3D75634DC304FA334449737C0BA6AC083373E4AD4EC571EAA3296A5D4D22FABD8D7A5D0EF666497A51C661487D6AD4B6F3ACCE81EA62AE00D0C838D9085833A5E7C6BC5B21C8E4BA4D27C0C8A27D2F1C82E7943CB359797D5727A49BF3EA7A8A26833784691BD2607621033EAFBDBE9E6CCBA81DA8CD2229B714CAD5C3E96626FA9DF15ACD9506A4E55A86512291CAB5E2F6EB29B96F7C715F22D7BA1AD27B4A5FE9A4D7546756EF97AC74BD939EC33D9950569CBBF4D2BAAA5B6D671E1579252D0CA1672D5A36423BBF7617BADBD569F43BF6643F4954718FA1E460D9B6D6A1380B5F530A37938A743563669A55B04AF2CE1E479718A2C684F7EC5596D696BE89EEBEB26869A52957256A2D4AAB5159BC65B8B9A4BD38B378E5E3DDA5EBC6EEAC0906B6B77B551219348141A95A674FD50657E4DA1A9A4636CFBD8C612661D9C352A8C1939268339CF92576C5567DBB28C79CE6C5B9523BFB8669367E3E6D850A9DE9C61D4A7DB3232F3D394E999E9C66C87C55669B739AA37B9412259600BE352FA9733F21E2452D8690E590C52384A351CCAF2AA717711D358BAAB2468B76055923A9E62BCA0CBA9B63BAA727417943AAA119D52C22AB52AA9E45863F9B9C5B896D6F36F85E81B1D07ACFF61F09362F0FE325248F3D2BD9897CE3FACB6FB8CBEAC1517D9B0D6452E976C16B7CE7D3D32F3C0DC7A6D4E759103B6B5DCA64197ABBF215B935B692FA9C8D130F7CDDE1B68AE99BCE716F64631F69EFFD2C86843564EC3C016D627F681AF6C81F3D649D90CB183657C5A781FA2C96A3AC2D2DF25A960236DEAD4FC6E4D93234BAA2F1593FCD2C34C6F9BCABAB91653E65A683DD4A6EF97F509293F7D7A8D511A38AA6EC2676C7F268AC4274B75C28B3D9482253D2E0D888E8931A44172526D2DC9E58A33345D775D37F9F1EDC53513B7DFB0E5E616FAB8A9A8325BFBC77A4F7DD5A632B3A9A4B336B3AAA69EE38FAC6A83C6B37978F0B6439EB9C76FEB59BF8E795D7CE871BEB6B3A76AD857D778E348B5C1D680FBD7BE0B7F648F487E081126289C97EC86C3EC789B96641AD479EA0AB5442751D3A7B01AA61F12849136755BD966BBC1CCF59A91451AE881CD1B765C0FC6F756133EEB50FFBBC3D73C8655A45C642C664CE6E5EC11C8CED4CAB48C5C93B9B4BC2A5B8BBCE768D59925795C69BABAA0B5B1315B97CB593532292BD952E8CA542B948A94C216E7F917D47C8C574BF68AB55075BBDD2051A8D45A7329584C337B94BD57AE81D3491DA93EA8CAA83BC27C036CA59C79A8CD98923793A192147FD57253F503DA98244AFD0BF3A1156BA06E76C5FAAC6F60EFB55558F3D214E5EE96CEEB9B32F3DBC637B8FA8A68429963B7A89ECCADCFCB2AB66A54E98EECACC602F675BD51AAD428EACB2BABAE0AB4F44487CBF2F31933CDF32572B5627973A13DB3B43E2BB7A134CB5686A713F6DBCC8F65B9A49CD80FD93289E130F38D366DA6FA98E3269BC19C1B36530628F51008CF1F3735AD4EE314ABB602C82878E94B991FB332B542A1D6A5E874D6CCDC14A5A52827DB6E51175454DA2C8E229B499F93A69030D2272062292432A9D2946759FE964243736A8D8235EBE15A0713545285D2C481C47F71E11D96C0F664262524EF28C48FC310CECCEC271ED1C88AB2FA8DDD40E4ABCF89014478FC2A11E599BAF65DF76B8C3AA30CCC2043CD646AF3EA8A8B6BF374325D7E7D494903A7D3710D2525F5F93AE67ED1FC250774693AB94297AAFBD36049A3CD60B03596943615180C054DF44474EAC22F99D3D220D2C651DA3E8FB47DFE118DB114A883E0F6EA73C6E36BA39B6425BAADA1EE71757A09975F9AAECA5465D79595D5E4A8E004EDB0D7E4E974793576470D9CA427553A6A983A15FB823E1548D3A6EACFD51655737A3D073B6C2DFDAC05CAF648BCEC8F6473A2D4CCAC9C68483E2B7FA4449665DF64DC04527B1662FF5B2F5E9230B107B22F345033BBA832DB32B30AD254566D9693E39C59EAE5802AAD2033CB665632E90CED6CAF927C423CC8334F8004653290E072FBEA3EB39918C924B9467AAD7480288881A4D3D324A9200D6403FE4DA76DE406324542648EEC272FB60587A603A381C6DD7B5BF6168763CE1837EE2DF42A7BFAB47DA4AD53DA69ACAC4DAB0DEC8D79FB3A6B6B3BFBBCB1BD0145F6D5D759B33747760DECDA78F3BEEE7DD53706EB8399D7ECC8DD611ADE6AD9CA36B7CA5BD5A52EBD6BD7BEE08EADAD2E57EBD61DC17DBB14F6C9099B9D543C5BF16C4A3AECF978A5D4189FADBE7CC1D019A6F733830ABCC056575B53ED103E5385CF74E153BCAF58D35EFBB9F6BEC2B2BA5DB406BFB89EE485CADADACA3B68F1879AAA9AAA425A5B6EA886EB819AAAAA1A769896E73369077B6B7CECF9AF55D65657173255B5B555CC097A73F93A5AFE818EBE83D6249F81A2125ACB3FACA9A9FA093498BBA0B29562FB0014CCB7AA2BEACEF740EDCECACA5A9613062D2BA0F2269DF6526D65AD0B2A172E102B7B92FD93EC4D564EFF5A1444AB5176915D94BD0B3B75D3A1B2325DCE61E6609B81A80F1A5D078B8D0056EE89BAC3EC8583D6276487D965CCBC1332B9B78E57C339345588B7F401B09C9E2E20A7C5706BC1DDB31E0319CD68F938325AE33E70F5E6EB730D691AA9C9A0306974798EEABC9ACD1516F78EC25A7BB64E6352184C524D1AC485F266C7351FF7D44A87AFFD6C687D7E8ACA60E1322A39A55C9166D2156DBCA66EF6169D294D29577295195CBA41A5321954B59377029FBBD9EF4A2CB29F019FDF24846FB33761FB30F2BD9B3DC55E25FB19C98213944C7F98F97A9B2E4DA52269BA7F91C952A45FB33E06CCA6B017561E151C4F78505060468E30B7A30C8B0F09D8AB52F5677FA74949D1FCCED1D450C25999798349766759FE1DB6627BF1F229BD41A767BF0DDE4D291A6317257AD9BB40D163710A3B51334F08ED93521B52BC20B62599B237A07D8CF0F39F94F4E1FC45F13EFB328E5F420E9B41B303A0D90EB2F191B22FD568BF6032D1EF40A4A5F7D4D0EF40E80DA93D35A61A537AE317D767CAECA0DC83E95F011D5F5895B09795F1CF9FE3A10B0E867463C28D1432F5F8F36851F9F15C5DCA0E946D995ACF6D6870E974469544A355D96ABB5DCD2D55BD5B7BAB9C7D9EC6AC965A87422A97320ABD32CFD56CCBB5A7ABAA366FDB5C2579ACF5FAF57972AD51AD329AB92C7B769A35AD3CDF5656646F1A6B6F1A6BCA56EA4D6AB9362523CD9E6B4C35EA2D195A5B594161FD08482117A4703B4AE1044A25085252A354E95FBB6345FB874CC341DADAD28B747ABDC5AED5682485998E22FB519D234FAB95E7D1EF76A4123915460D7DFC696AAA819C9EBEEBB43E5B0DC2C102A462B1084CC79F7ED25F084B157ED14852E360DF91C91C75B6E274A5A47279B95CA24AB3E755D9E5B27F956AD28B0BECAE4C8DEC852F0E4B52B5E972B30ACE2BCA4F7C8C1E023469B2741DFBA056AF6059A55EB7DC7F9ED22ED83450C611FB5192C6FC0458CA625E39A4CA3CAAA30ACC3A2A1714B8EA782C5A28F5518B459170A0B43404FE61EA88D566B37EE7C63B6A6AEB972CF5DB3B2AAB5BB63566492767EE9928CFCC65BF909309A1E380A77E5B0BB75C98B9EE3AF41EF42662232D0FA6E51D665E694B53580D560351A41D9DCFFD642E9B9B2B4D3DAAA134E51D958A345DF4A090893FF641F731E3333821588093518FBAC9645AF6510299CF1A53538DCB6FBD6932D163C69B8CD96492E496E7F314E655947377E495A7E7A6C81FCCA7D62F78175947B61CCACAAAB0008D0F15105200C7B457DB4C15794748BA319D4D4FAF2D6D7A5CA2395D4B494D7DA95420F5FC075FB0E26F2A5C2F043923FFFB10CC45F10D9FB851AD0BCFDB20CAADCA417325123D1FE4EC55EB0BEBB7B6E6CF4E71A5FA0F1A52530D8C223D8F2600DB3DDE7B7736AE0B7D6E62E0268C8AB2EBF81867D416B45DDBF8819B95CADB3967597E6E169CE9CD293A4566FDD41D3BC6EF0934E76244248246207A1013C979941898570E12058ADF705A143FFFA42D51E4946028D84E90F1ED565B697DAD13A42BB1551480508FE95352F4E7BFCC216E8C4470DE6C6B53D908A757E6E75BE4479897C1FC8CCCCBDFB4E42B0C128D23136528D1E07A35351B20B634A1199AF0B7049A4C62A60EAB4BE428484942FCE41F3E894FD2A4B6C2C63AFB3185A3A6BA54F6A8BDBEBEC8C1DD945B966B51DDF3399539AB3023566C637F63484931B0DAF3EF9AB406036B38FF3B6C1FB215682C85D6E561E6818C82744D818D970F464F385F541E2A5065541C61EE877A2A73FFC31986124B750EF57829A49AE8F135E0DD02E502CDE26B4F8725CD7C11CDB992747B9DBD5694A924B32CA73FDD9693693826572AE452B6A8B63EBF3867474661964577973645AF55324C515DAD4DA2E372E1449FC3ECD418B55AA5A52C7DF946BDC9A4671FCBCB53A671D6E59F5BF2B2328D6926639E860918E1A2514088FB90E3E5D1286064CE801AACCC9943CAD4D37C14382DBB5414107EAFA61A02803D617B96F455BB3FB5E3E8A350DEF0CD6F3D357A7D6597D33C7C032DA59E897B77361D3F35FED99D4D4FFE606E7F61FBF6FA0FEE2DDC782DC622DC6D200FAE050F2B34E6ABE99F0F20A494FEC180FC2A238D092996C2AAC7160CDF359C31480C86D4CAA39954CA3292CA4BF92DF42FE1B9580DBE624AD868F8B7C789A2A6C10B4284C2421F8B49308A41B0A8675F969B4B0B730BD35492EEF4EAF26C4773A3C3667D21B7CCE88E6CDED45ABA5123FBADA5A832A36A5D4307FB2B380D49254AADF281E6AAE55FA2B91CCBC964597DE0FA7E5F6691FBB31966569A6D4B551CC4F780C26E422C847B90C880A7878D1AA9F6742ACD0E947C76808F7A8EC71FF5F0F4AE8404F6F654E3371D4D8DC58F98E062CB8DA9B23BCA0BCF7F1997DE56585EC9510F13762992438AE0BCC3BC828EF5CA4165A6167DEAB44450684D5CA1F2C443620A46A2B8FDA9BFFE4FFD378FB9CAEA6A9D7D9D5DBDE0D7A552CD3FDE6F1FDA33CA1CA76EBDBC61FB96BE41E6695A27CC85C7140FB0DDCA2A2221CA0741B515359555927C737E377BE07C4C59F561FC15EECFF1C06CB90CBCBA026CB7003FBE18243169FDFB820FAF806C93ECEC0AC86FBC1C283205F8C10A286B04F8BB3F0754EC65C09F005FE341ADBB045CA73EFD7E40A34B805B35BF5D016DCB65E1511E741B13E043027CFF3F03F433FF03E0D77F7960B8EA32F0CF4948C27F137837118C1BFE82E0134948C27F6F48B9EFDF85FB53EE37A599B24D85269F69260EB3A60F9A3E62FA38C29DA9C6542BFDB24C1292908424242109FF83619F008B69F43A1087C7CCD9E65B008E53B03458765ABE92842424210949484212929084242421094948421292908424242109494842129290842424210949484212929084FF723892842424E1AF11F03B71E5AC0D4A09ADB269D823C16FDEEBB125C1EF9B2BA53F12EA12E2923E24D4A5C42A7D5AA8CBA0FE53A12E87FA1F85BA82EC929984BA9294CA3E23D4558453DC27D4D5EC7DF1B53464AF6241A86B49A9B245A8EBF472E5A450D7E31886FF5F5918B52520D419A248DF25D45922B5BE24D42524DDBA24D4A5446BFD9E509741FD55A12E87FA2F85BA82ACB3FE9B505712B3252AD455C4985129D4D5CC507C2D0D69CD6813EA5A62CED827D4750A49C6A785BA1EC748082355017156D947853A2F67BECECB99AFF372E6EBBC9CF93A2F67BECECB99AFF372E6EBBC9CF93A2F67BECECB99AFF372E6EBBC9CF9BA4E6FE5C4B9BC9CBF4C38524D2AE1A70E6AFDC44F3C244242240A3F9324067D1D508B9030966EE8F1432D485C70A79D040038320C7D53641AEE45B1E5834F1F8CDE05A51747EA007AA03501BD3E32073D8380D1077846C91EAC71A40FB0EF01DCB3B86A006A53480D073F2118B307E68AEB7071BA2B490DFD4B03F1560371220D6EC01086B11CACEB8675280E0FD9298CDD0CAD69E8A5776781C6689CA751E8F7231F81F7A4671265C1918DD0A6FFFF10ED75A32456F3C8E309099C72B8CA2CDCF520BFA284E7606E047B6661941725C741FF34F6F5935EA0894AC78FF38228DB7538DF87237C6406D6A492F662C90914896339EC8FA25EFD408BA8C1153EE8FD1850E187995190420772E3474EFC713EDCF0330333780A797EDCB80627E8DB0F182956378CA3B8F6406B0E6A31D44314F89B807A00698AA02C28BF7E28A70449F15863C813BF661039F220A5415C258A7AEA45AD4C420FB5C959946014F1FA045DF891275E1651B48A2860750B364B351616FAC55566004F00E51316A80C42CF0CAECAE38CA2A45628A02B869117DE3F44D9F2B407D06AA8254C0B964BA99A81B16E583F86AD20EA5AB46B5E66FC2ABC1E83025F2194ED048E5CA13891232AB5DD388FE77A27B45DE8BF89DA7420B619C4B007E5302B786AA2BC45EB0B0A964CF9E7F512416B106DD487BAA6961B8E73C3D338258C8942EB66017B0CB8E035B42BAE2537DA08F58099557C89D1C70394B8717D8FB0BEEB1251AAF9223EA97786A0ED255B05AB11ADBE1E3054439C583DBE3C3EFEBDAD3F867478D13A294D3BE37A59F1D68BE3E79460EBE1F8686ACDBC150461BC0FEDE93F2B0EABF127198BFF5A62711F50E221C5E87F25C27D8E6C42DB08216531001AC99A490540003D2B82129CB9C88A5C82ED552045E5803B0AF518EA3D8496EA464DED81DE49A42C06A30228BD18F47956F986B8B6B8F22CDE8FC66746E3EB5DCA9EA3E81361C4C7CB4A9C4775BF1DF5C347AA3DA80F5E7EB1B84D88A3C5B8E211623F8D124E94141D17166C2731CE8791FAA0105F782C3EA1ED1662BA0F23921F39E4A99B403A445B58ABD7983083B7B2C8453D93711E9C571435F85DC58B328D09BB17EFCBFCBACEF83A6B39E0A3F01CCAC9835E772999CD099CFAD11F03E8796294582B7B3A87DF998A617CC92A3BBF34769E863F57B6895EC467079CB0BFC750739E55FBEC5A0E5676D5B574AD4BB001CA09CF0B9F6D88713512CF5CBCB8770731DAB8DF9353DEF6DCABAC8A8F1A21A1E4B9E2EBB3E82F7C14F3E23EE81722108F878E0CE04EF1DE36CA47FCA0A09915ECA287F813B29269F455BF206717E6E1A382942771BFE3331451CAABADDA899A7163DD4BC4FC6C6D345CEB09C56BE2820F63D11C66247ED43ED5AA1BFAA884A6608478AF42C079C39A085B2278EF4AB458C926446ADECF1E76857B0697BD06479F8883CB895BF38DD0C7EB49B41A3EBB09087BCD8A755F6E1F14ADF2BDF742AAB9A1B8E74413F2195EDFBC15F884B5F8481E14F4EE449E23C21E25E6207C5E3525E859B463DEAEC242CEC4AF10C2BCDD8D7C8A96E2262BB9C0DA78F61FA08BB884DCC83B959B5F88F55EC1573D42AE1E445A1377563FEE8A51B44D81C6F7D62DD447566703A0ED92041979134E1889FE70C5F8C8CAA9481C7DE9E8E65C13DD44D9AF9D1DC053857F0DDF225D2B99DA8AD7ACEC44A20E9D443CDDD1539CD8F625584818CF6F7C2E309DB0C3F2544F202D3E61A79A8DEB323196F03AAC10341E452F09C46910FD7AB52D5DB9541377789ECBC49D66B54DAF48620EE538F367EA51DC0D6631E3E225E34BA0C08B255D73452E37C2084FC2DE11BB4C3CE623BF17391077BCE65551DC0D184318712E9D9B07718F107799C4F39DB84F5C2AA6AC9E15C558C1EB6A42E0FBD27BAEFB3D341A89731F452B0D2276DE8B2E3E39FFB91620EE6F3DA40BEF0E926E686D83DD72187B7AA18F83283A0C77B642AB137A3BA1C701234684FB0ED4D436DC877A60DC18EE713C8E612807A0BD1D635C37E1B04D5B5B60FC00E0A273BBC8D5B84617601BC191C388BB1F7AFBE0B34B1847677440CF18B4697D1346417EBD0198C59F347A853D91A77414FAB93887ABA9EAC51545CAFAA1350CF87B84BBED80BB17F151FAE9FADD581F88D3D92D50DA8E32A29829CE0EA0A80F5BB4770C3E8760DC08AEDF8E3CF3D40E200FDD709FE7A50B29A02BBB045EF971543E5B853B544794BE3E8015AEDA51063D48CD8AFC3AE0730828A7F837C1DD51DC2106616627723A82D2EB126446B9EDC3D60A57BCA63A901B2A552A834EA8F7C3CFA6B8EC86B1E469194EC0B65A76DBF0FECA289EBF76A1EC40C90D628BD74607B6465157F4AE53D0E530F2B176D56D68895D38AA1D391E895B48375A2F4FBD689DFC1A830994F0EB51DD26D2225A3577191FE1B188F7C7044D5F2C172AF5769409A56B24BEF27B6106DFFC32575D595DC7F5FB3D9150343419E33A42917028E28EF9434117D71E0870C3FEA9E958941BF6457D915D3EAF8BD3E97A7C1311DF1C3718F60547F7847D5C9F7B4F6836C60542537E0FE70985F744E81C8EE2AEACE1ECF4A3C1C90DBB03E169AEC71DF4843C3BA17773683AC8F5CC7AA374A5D1697F940B24E2990C45B88DFE8980DFE30E70C28A3026048B72D1D06CC4E3E328C173EE888F9B0D7A7D112E36EDE3FA7B47B93EBFC7178CFAD671519F8FF3CD4CF8BC5E9F970BF0BD9CD717F544FC61CA20AEE1F5C5DCFE40D4D5E10EF827227EBA869B9B09014258C71D8C0296887F929B74CFF8037BB8397F6C9A8BCE4EC4023E2E128275FDC129200A86C67C333033E805014482BE48D4C5F5C6B8499F3B361BF145B9880FB8F0C7600D4FD4C94567DC20598F3B0C753A65663610F38701657076C6178191515F0C1144B9702404FAA0D402F6402034C74D837039FF4CD8ED8971FE2017A3B206CA600AF01884B54293DC847F0A11F30BC57CBB6330D9BFD3E7E204361D516EC61DDCC3796641A93CDD547C411072C40DBC44FC512A519F7B869B0DD36500E314F444FD37C3F0580818DA45597273A080197E2D6A3E9E69770408F3455C71936A16D7E4368602DEAD201A2AFA7A577583D05F4EFB57893F16717B7D33EEC84ECA0BAA356E9F5320F530EDF684400441BF2FEAEA9BF514BBA325A0496E5324148A4DC762E168734545C0E78E045D33E25417CCA8F005CB67A315B13DE1D054C41D9EDE5331190AC6CA03FE68ACC2C3534067D3C9B31E7794DE8CD2792BEB4767C3E1801FEC89DE7371DB43B320C83DDC2C58568CDA30EDA6F2F180C6633E27E7F547C360D7BC9EC3113FDCF5C0101F7CBA41BBBEC88C3F160374137B9051D14A4182604EA1885899A42B382F1607988777D61373522BDD05739D748EB800A86D6EDAEF994EA06C0E16F5073D81592F756591FA50100CA8D85FC27B4BC270C070396A79E70217007388C6227E0F6FA7E202689E22AE752881623FAC02AE42634C843A943734170C84DCDED5D273F3A20283037640A3B4321B0B4370F0FA289B74CCB42F105E2D51085860D2FC70AA103FBACFB47FC20F34BB74BA51207932449D88922C88DAC94DB8A3406B28180F20A2128A055BF0055D73FE9DFEB0CFEB77BB4291A90ADAAA80913708A1A604D48B6681AE41D15C3A365E2AA67D5F18D147473C4FC57C630878A2A201170B40BC4371AF8E9E5494ABE2A74E3744951345DF02BE41043E9805460E92F13AB9C908C442EA35E09F53C0339531C80A340AD3B9D004C4C020158A1BE3B7686757CE0525C81D8D863C7E37B50F6FC803912C1873F361D61F00C914538CABB8E5468400FE7C0952E4C520C9EBE192E330FCD2EE0473730AE646A9176F07FC60A7FCDA145784DFC260057422CAA1938678FF24FDF4A140C2B3C050741A1D16504FCC52E78DD24EC14A80C30A603CEAA3913B14F6F381F63D49E51D1E96E49D4690341231371D9AB90C8FD40D66234120C68708BC2108AD48CB8D3E4F4C34B0153B06E3F7FAD1F19A7913774F8476F912F6E16028465D868FF17EC18D794B116E45A7E93631E15BE5B9EE04462374F9680C8CC90F2A8A6F48971300F5B79E2E6E64B07B745BFB7017D73BC20D0D0F6EEDEDECEAE41CED23D07638B96DBDA33D8363A31C8C186E1F18DDCE0D7673ED03DBB92DBD039D4EAEEBEAA1E1AE91116E7098EBED1FEAEBED82BEDE818EBEB1CEDE814DDC4698373008DB7D2F7822201D1DE4E88202AADEAE118AACBF6BB8A3079AED1B7BFB7A47B73BB9EEDED1018AB31B90B67343EDC3A3BD1D637DEDC3DCD0D8F0D0E048172CDF0968077A07BA876195AEFEAE8151D88907A08FEBDA0A0D6EA4A7BDAF0F976A1F03EA8791BE8EC1A1EDC3BD9B7A46B99EC1BECE2EE8DCD80594B56FECEBE29702A63AFADA7BFB9D5C677B7FFBA62E9C35085886719840DDB69E2EEC82F5DAE15FC768EFE00065A363706074189A4EE07278343E755BEF4897936B1FEE1DA102E91E1E04F4549C30631091C0BC812E1E0B1535B74A233084B6C746BA5668E9EC6AEF035C237472E260972EF9BE20F9BEE07DC836F9BEE03FEE7D01FFBE38F9CEE0AFF39D01AFBDE47B83E47B83E47B83E47B83B5D13CF9EE60F5BB03513AC9F707C9F707C9F7077F71EF0FC03725FCB7022E58C96DE452172BFCB63F618AE1731CBF3570B94B2AB94BAB65600CF3D12B1DAFD3E1F837AF74BCC140C7B33D573ADE68C4F1F75FE9F894143A5EA2BCD2F1A9A9301E3E09FDF68314C74BE1C724943A622599241BE2989DD462646B452FBD1674108638F541720DF918D941EE82C8FDCF10651F6432C9E3CC01F28C64337911B0BE0E587EBD06FFBFFE7FC07F12F0FF10B0FE1CB0BCB51A3FFE575422FE74C05F04F86B007F3BE01F04FCD703FE9D80FF4380FF9380FF7380FFAB80FF31C0FF14E07F11F0FF1CF0BF23B98B92CBA856E3677F9E803F03F01703FE06C0DF0DF8C700BF17F04701FF01C0FF05C0FF38E07F167A5F01FCBF06FC7F640E306AC966C602F8ED80BF62357E695A02FE2CC05F06F8BB01FF56C03F09F86F01FC9F02FC5F05FC2700FF4F01FFBBC4CBB0649A3131994C39E06F05FC5B00FF7580DFB71ABF6C4F02FE1CC0DF0CF8B701FE69C0BF07F07F06F07F09F01F07FCAF01FE65B283C902FC4EC0BF1EF05F03F80380FF66C07F00F07F86FA99527141A9B05A5B0A27F74D4E2A6544290F3FB500D75361A5822895674F2EC175F22CDE39BBB000FF1656351670D8DE2717169E5B5ADAAB9412A56C81BFDE56AA88527D6CFE75803FCCFF60FED5F9EF00E0F0A55FFCE2C5179F7B6E899FBB84D75EA51C88397BF2E4D9D3274F9E1429797BB7F5EE30BD233F57C95F3C02710E1D66B5EE3E0DD76EB984C8A567706D25CB28A558230B0B1209A394DD77DF7D38B3B13110082C2F2D29E58C52B1FB381D727C376D00AB7801774C22AB4C02AB74189DF3CAC9937BF18EC0EA59A58A516A2E669551AA565885C60AABCC15B14AD7E3A93AB95B25272A8556ABDD4B5B7BE5522297BD8D8BAB5846C5F38ACCCA884A0ED250A9884A950D16520FE001D84F8ECD1F9B57291895B26502474FB4D0968A5731E8582567548A730B3CB3E756B516544A46A56E752F2C9C5A5CF4B4AA648C4AE47DE1AC4AC3A87467E07AE7CCF7C65F06787AFC39009CB2F8FAEF9E7FF999532716B1D532B948AFC9168A1C058E12A0E814208133E1461001322A8AA092C7B228CC53CB19B55214C2C9BD0A29A310A4B0A06619B5687A2007A98C512BA859A8D544ADD6925C801A00F7FC7E009CA0005C2DFB7E4AEB3FDDD7A256326AF5B9E51374A113CBE770A573C0FF59E0FF1C36156213E6D2C1ADFB5F5B38756AF1F5FDAD785794070CD6326AFD99F0DB70BDF40D0AA72A4F552E01A8558C5AF3DAFC3B002F013C0B700260711E6FB4828E5E9F3F26C0EBF3FBC1A72991AA7360AFE7405A4B4B48D5EE73C717CEEED51E38B75BAD246AE5850B56E142AA0459BDB1AF45A360342A395CBB60FED2F22E858C51C84F23FD0B1A96D188D212C4A54171695444A316EDA61EED86B79C63F31A25E0A34CD3EBB5FDAD1A15A3D12C930B64314EF431E0E502041EBAB47279990A03C62E2F6BE4D0C63A160B387503D93F7F661E5627A7E64FC1D4D740311B081D1A97250CD7E8188DE14CE399C6B777BF8D7EFEECDDCFDE7DEAEE13D61356C4B222CEEF240854A366345ABAC06B0B2BD76B0BB800B0A1A6225D3A776E6969711169A3323DB33B9B0A55A384212B42E5573936BF1A78ED68158C7645C220620C0AA7CFF24148CBB2DAB8970842D6A290B51AA2D5EA891EB6090A55F355F3FB17F62F8C2FC0BF71AD8AD1AAF380F471948D08E3209D3CA255335A2DC81C4848606CE1D8FC85F9659E1C2A7551EC6B3A80243A3D0F161B6FA3384F2C9CC0EE71583C6F9E8E56AEE084E97A469B7226FB4CF6DB2D6FB79C0E9C0E50A73B71E0C48145EDA256AB61B4BA33E36F039C1E7F65FCE4F8D2F889F1C5F163678E9D593883378107812511701D4219E4ED0661999C234B58A38245925BF63D09DA68D1CB6F3BB75BAB840909EAB0220F0B175DBC72754A46A796C0B56EFF1BD40BF6AFC3E022AA6441C7B2BA159D50A5C8648C4E4995729A24E45D34EF64BD81E094507745F9FA565A6F8FB8279C5C7B6426E8E43AF644024E6E932FB413CB0894111FD4E94B4E27D7E78E05DFDF68A4402DC94E3B48146E98499C6E98C9E47A6026D33605739833533087F9CD34CC61B900CC61BBC15FA5DDEDC31CD9DCDFB71DCECD23039D1CF9DCD830944BF87F53A71105E4235990A95F456E227F433E0BD9D308390277BF4F7E4C7E05B9DDDB0CC3C8C1A6E96813E41C4EC0D98FCF0D0F907BC83F400E7F14B296E7C94F2017621905D9208C549172C84606F0BB7F1F27F792FB2097FA16798ABC40CE90DF30B0F592361C990279BF0B82F0203E95F804F93BF28F20CDEF901F40AEF21623856CAD1DC7A5120DA920797876F6C389FF6FC9DF93CF439EF338799ABC0839D36F1988EC7012A379101DAF85197570BEB99EEC8248F549C8AEAE26EF90FFCB68605D76E3E008478C23C31BE933063ADA0C92D0425CA3E7D51DE4463247E621277B80D06F4B7F01B2B13F9227C833E487E475462B8C3743AEDB0059553EB901B2CFDD90C5DD4EBE461E063D7D91FC8EFC09BCE824394D7EC6E884F11670EB46C8FB6C90C7D3E7C21F229F265F278F40AEF525F27B30F5639053BE447ECEE8E31C30A4205E3743E66B204D70962A24F43B7937935BC91DE41BE49B7066BA9FFC1B394F9E24CF911F915F30069027D3BB0D746EC599525209197390FC93D0AA82CC3004B9B785487A87867AC8E6E1C17E8E4C8C0E6FE1C8DD3886E6D846C822ABE1ACE62013E403E4C3E4A3E44EF220390CF3B7932F93FF03CEB9484E9197C91B8C11E7A8C83A38E115C3BEB0977C0432CE6B9814ECB742469D425A6083DD4C4A20670EC309E036F2BF21FF3F481E253238177C85FC015CFE38F92EE4D36F322681824CB0A0F5F4FFF525A5C447F691FF05A786BBC921C8E9E5E43AF22FE42CB8C3B7C9F7C8ABE4974C2A93E6A98E7AE43763F9212C3F86E5ED58DE83E5E7B1FC8AC71D88C90F62F92B5A2A4C5836633981E567B0BC0F4B1CAF7808CBC7B17CEAFFB1F725D051145DDBB7AABAA766A67B2A0B903D11C2229B6131209B11111131464454448C2C21060C012104E4C580C81A31226B64098B1010312202A222026240444496B027C8BE06088B8810FE9A9B42D30DFAF9A2EF7FFEF3FDEF99739E3BCF545577D5D355F7DEEA9E4910B776EBD2AF3BDF877810F1386211E245C4AB5E7402A2A35BB75E7D9C2662046275C4FA88CD10E3103B21F6441C88988E38167125E269C4AB5E7439110312927BBCE48A44AC8DD810B139621BC4F6881D113B2326222627A4F4EEE5EA8B3810311D71386206E238C4C988D311E724F648E9E25A80988BB814F173C4D5897DBB7473E5216E41DC837818B108F18A17DD14D1440CE891D223D55D11B11A626DC4FA888D7AF4EB9DEC8E416C293BDEC5DD067130622EE2012F1AFE8858C7C03A465BC467103B25A7F4EF6574454C424C414C451C8438147124E258C4F1C9BDBB251B5988D988731117222E465C81B80A310F7113E256C45DBDBA27F4300A100F239E462C46BC224FD2D728F1A2A921BA117D110310C3102311AB2346F596C68C466C82D81CB115622C623BC40E88F18809BDE5D5367B22F6414CEBE3FD7C30E230C4D18899881311A722CE42CC415C84B8047105E22AC475881BFB764B4E35B778D1E344AC8BD80171685F79313C4B11D7216E473C8C78D18B424374F7932B4EF822062146205643AC8D581FB149BF1E2989A239622BC458C476881D10E31113107BF6EBD5AD8FE8833808713862266216E21CC445FDFAD5AD279623AE445C8BB8017133623E6201E251C422C4CB882512EBFB38104D447FC420C408C42A88B511A3119B21B6448C456C2FF15E9F4E885D1193105310531107210E43CC401C8F3815710EE24289D13E4B10D7226E453C8858EC455F8AE8441488E51143102B225693D8C0B7366233C458C44E88C9121BFA0E96D8C877B8F78B3FBEE311B310B311E7222E445C8CB81C7165BFFE7DFAF9AE45DC80B819713BE21EC4038847114FF71BD02FC9B7D88B7E14D11F3112B17EAA9C937E2D105B23C621B647EC88D81931113119B12FE240C474C4E1881988E3BCD9A0CC33CADF810D91B1AF93CC4EE265FED0199FD574C3272689F87CA687CC415E9679422F7CDED247E6667D65DC9C82F7787E6F77B3C5CDFA37EBFE27EA05FD617F6FD7DBD2BE3239CA50992FFEBD77446617FF0E729965B596D9481B993DC4CA5CD57BACD24F6EFFEED6FABACC737499697070FE0F8CC86CD5FE5980CC91EF91396D1D9979D59359D4BD328F692073CBFB64FED758E6554D653E74BFCCA81F9099E8837750FFAFF74E4356FA9EC9AC2C4BE6F77FFD1D91B9D7EF78D72DE8B9237CF24F90C9DC556E81FF03EF88DCA7FC19B6FD0D03E57E6180CCE75F9539F6BF6436FB9ACC3E87C8DDC0EB32637F4366C223E4DC1E25F3E13132239D843AFD6F6941E4DEC78B117F80FE77842D101F426C89F8307A41AAFE5215B530BC412F770ABF2320B6C35ADEE778379915DD77847E7784E1B760DC9FA2EF1DE0FF0FD1C1014FCB9DFEB3725FFE1C74FC0738815ABFA1773E554256E91676F333B07C26FE2D64B8A30FBAE37781F88EC0D4DB228548B9F7FFF72D81E97F8214AA40D53BB044ADBADB23856A70F71D5807BC0963E12D1807EFC0F87F8013BC1FF757D0DB3213DE962D27C0C47F80539809B3C01B7B1FC1EFB0F487697730A30804FF5BF84F8F82C0137F8A3EFF2E929AF4199A48D3E8483A99E6D0E5348FE6D3A3F43273B000568D3564ADD8332C91A5B1916C32CB61CB591ECB6747D965CD578BD192B5C1DA586DBAB6485BA96DD2F669A7B56BBAA987E9B5F5667AACDE49CF702C71AC756C751C741473CAFD7924AFCF5BF076BC2BEFCB8739073A473BB35C89AEA1AE716ECD5DDE5DC51DED6EE96EEF4E70A7BAB3DC79EE03EE7386DB08316A1A4D8C364647A3A731C8C830E61A4B8D75468151649498C28C3053CD02F38AC7DF13E969E689F5F4F14CF4CCF56CF55C16BE22512C102BC406715014FB04F8C4F924F90CF499EEB3C867A56F986F73DF8EBEA9BEDB7D0FFB5EF46BE3D7D1AFA7DF20BF0CBFA97E4BFDD6F96DF7AFE8DFC17FA4FF56FF83FEC5E56839FF7291E5EA975B576E7BF9C4F269E5C7959F55C15DA14A85E80A2D2BB4AF30B6C2BA0A05158A2A940488808880A8809880B880F8809480F480CC80EC80DC8055019B030A028A024A024560446054604C605C607C604A607A60666076606EE0AAC0CD81058145812541222822282A2826282E283E2825283D2833283B28376855D0E6A082A0A2A09260111C111C151C131C171C1F9C129C1E9C199C1D9C1BBC2A787370417051704988088908890A8909890B890F4909490FC90CC90EC90D5915B239A420A428A424548446844685C684C685C687A684A68766866687E686AE0ADD1C5A105A145A1226C222C2A2C262C2E2C2E2C352C2D2C332C3B2C372C356856D0E2B082B0A2B0917E111E151E131E171E1F1E129E1E9E199E1D9E1B9E1ABC2378717841785974488888888A8889888B888F8881499CD7A6797B3345708AB68E3D1361E6FE39DCB70CD56EE00085F089C94E1951D565E35D5DAFEEE0DD6E3DF53DBC6B75A8F7FCF511BBF62AD1F1562E351366E1B4FD43A2BAF1369E36D6CBCAFB5FF0D9658CB1B6EB6F298181B6F5E86CB081AD3C2563E113995F9957FE9089B772DB50F56C3124DFABA00994F56539F1E54F6B4B2974B6D0B7ABBDA0FB552B6ADB21D954DB4F6E2A1E9D651B66C6DE5AD7D6DBCA7B57DEB2C2B6F33DACA1FEB6BE3A9561EEB6BE3FE366E9B25B1B6AB1CDB4E72F27BFF6287D97806729B3AB199CA66293B57D9C5583B5CEE1E5BCB1D4E07999F25C92C6CA0DC0B8C96DE3F4BC6AE05B01856C06AD8005B60171C80E370CE7B879D38892F0922154B8FF33855D657D99B9FD755B685B271CA7652B6A7B28394CD5076BAB28B945DA5EC466577297B5CD92BA536CEA16C80B2D5956DA26C6B653B289BA4EC4065D5F9E3D4F9E3162BBBD67A15DA3AADAAB775D8B8BF8D37B4F1CE65B83CFE9357ACE5EDA26C3CC6CABBB86D7C9195776B6DE32965B8EC7FB734E441D01062A095DC8B3C23B3F3449983A7C99DE04819FB274336E4402E2C875590079B211F0AE0281495F6B69B5A6BDDDA29DB59D93ECA0E53769CB2B3945DA26C9EB25B953DA0ECB9529BA06653829A4D0911CA46291BA3AC5AEB09CA8F24A429ABAE62C26465D56C4F586C55BDFB12AB4ADDB7202F0F517F5197D2A37CAEAC9A9BDDD5DCECAEE66677E5B712D5DC4C2CAF6C1565EB2BABD648A21A55A252353145D97465C72AABE668E24265553F123728BB0B4753C6DFBE7454D973D67127A52337204C66F5B5211A9AC9DD782CB497BBB604482E6D93A4CE9EA43C4952B6B26A8526A9B327A9B327E52B7B58D9E252DB039415F29CAEDF6764CF5636DECEC6DBDB78B6750C3DCB5E5B197D5EDE60ADFF723E7206A6BCBE61A57D7859F5ED6535AF5FBE8A756CBE3359F98EE496CAAAEB931C6FD737394759DB3C4BBE8CC72D53B3979AC1BD62AD7EA5D7201B5F6D1D450AD8B869E57DD2ADBC6F4D1BAF5E864BD5FA6D074E2D63480D52B662999A5E9E63E36B6F69A9E67BEA45EB39FA675A5BF63F69E5696DAD6AA5ADC2233BD535F87D2D9696EE51565DBB3475EDD2AE96DA01D74AED40B5DA062A1F323002CFE28610B91FAE09F5A109B48036D00E3A82F21E8354CD4121CA462A5B53D9E8523B58C5B4C16A5E0C56F362B0EA617A7DFBD54E6FA36C7B7BC910159F86D4B76A3274B25DDDA16AFD0C2DB1D61C567CEBBC7E639DB29B94DD7A6B9D116AB423942F1F310CCFF8DB71472CBEDD5A18A956F9C8B5A57694F2DCA38EDF7A86D1EA8A8C512B7E4C9A7DF463E628BBE0CFAE7886EA51865056CDD00CE53FDF5CA06CAEB22B9495F92FF3BEF32F73CDB12453652799B5956DA8ACF2C099EACC999DAC5ABF9361E38BEC237A47CDBEF19AB5E604B8559F092A4A4D5051724216CE501D7C655CF6FEEE4CCDB389274BED24C5276F565645CB2901763F34455DAD294DACAB7F4A5FAC69E9C51415B3A7A8983D25CBEA57B3965B57F3BBD178AD5CBFF5B1D16FB923B67F57C58BA96A554C55DE72AACAF8A66BA57686BA8A33F629ABBCC70CE93D345B1F679ACAAA2B3B2BC1AEFB6CB5DA6737B9A544CD8ED9E7B0E40FFB3D47CD8939AA9F73562A5B526ADF5373E73D9563BCA7A2FD5C75E6B92DAC577C6EB28D8F475DFF608ECF55B17CAEEAED3C950FCF1B596A73542F731294EDAB6CBAF52C0BFC6D3CD6C67B5AF9FBB678F0FE66FB1EED43B5CA3E945E5B2FE31F7273AD5E3BF72ACE0B8E57EDF72CA2B44C69F891AAFB91CA8016AB28B858D55BACD458DC1157EE2D2B6189CAEA9728CFBC44ADDF258D946D793B9FB54C458A652A522C537E69B9E38F7BBC52E9FBA5F2395F2AEFBB6A6AA9FD4A798AAF0A4AEDEAC4323ACAEC63F5552BDFB0D6CA377AE3B2F377FE63B175EFBFADA375E56E2FDD4F88DBC4AE9ED01706C13050DE64BBF2E7DB63951DAAACCA1AB7ABD1EF50F376871AE90E95DFED50BBED1D6A4795AFDAE7ABF63B95223B43AC3DDC99F3577BB85345F09D2A76EC52B361975A81BB5486B94B69BD5BF574B79A91BB558F76AB1EED51EDF7A8F67B5454D92367A8A3CC0CDDDBC4EE27F7C62B6B5B157BD7FE4FB9C25ED5F7BD4AAD7D2A37D8A7D4DFA73CD53E750F63FF7865D50EA840ED9C0A06DBFB54A83282C228ABBE85B2F7BCCC680A3BD8CAFB20BF65CD14AA1D76A1F25B85C3959DA86CCE1FB453BB9842B57A0AD50A38A0F66607CA5B3CAD9CC307624BED4FCBAD11E4A0ED8ECA41DB1D8E83D165EEA3C937471ADA78076BFD231D6DDC5E9E6CE3B6FB8247FA80E53ED5F164EBDEF8445B1B8FB3F158EBF84EB4B1F1B27B7B79FC1349367EDACA4F8EB55EC9B361363ED85AFFEC3E2B3F5FCDEA5B8AFB94C9E4647F8A336DE573ADFC82BB4C7D79BE0BB69975A1AC2FD25479D9FA9D6DEDE36DBC93AD7E472BBF682BBF78C07AFE8B076DDC567E29A6CCF9E4782ED9FA7FA9938DA759C77F798F95FF1C61E55736598F7FD596555D3B6DE5D787597949908DB7B4F104AB5E25BBACFCC6648C863739818696F6DE27E7566EDD39133AC8CA59BC956B2D2CF389E8D56C3CDAC63BD878271BCFB25C4FA2E7D8CAE75AF4247AB1953B975BB931C8CA85F57A133F8A19E36FBC5C9E9507645879709CE5FA92307F1BAF62E511769E6FE577D5B5F1C9565EC9C6233FB7F173565EB9A795571967E5556DE7AF66DAB8AF8D4758F5AF1669E5D58F5A79AD85D6F65129565EC761E35DADBCAED3E2EF49DD6A563EAEA84C26295FE7975BE74BB1D51F9162A78DBBADEBA1D8EA2F4971BA757E142FB5F24B03ADFC4A332BFF15ACFCFA3A0BA730DACA59AC657CD4E16BD19326A45979F791569E32DECA07645BF9D085563E66B9958F5F6BE5D3365BF9F4022B9F77D2CA732F5BF90A6AE56B84956F0C299357C94FB695F51772FCDBAA5BAE07DD166D2BAF6FE33136DED6C6E7DAF8616B7FB6372A9319C94FB65BFD21DDDECAC65BCA56DE5F5274239320914CC76F8074952F201389CC8A745FDD0FAFB33F38CC47459ED95AAC13ABC55AF989839C216764BD7344EEBD493129064A2E914BC0C483E241D0C443E2219949797322CA1E66ADBD67A3FEB482FC449E9B793367C23CB2651478F78175655E3C1DF2E0005C25DEFFDEE694BD2A6F3E09D46C6DB693F8A8F994446F76F17B6ED6109A89E3C0A8AFECD309B479E2A4B415243F85364FE403956C97C43CB147E206395677E95D107140F675B52CFD096D9E3828ED5AC90FA1CD2B53F3B0AA7944D53CAA6A1E53356FF6F731EC6F2CF6F771ECEFCD92382C79024BDA962D111BB1879BB0879BB187374BB660C9562CD98E25723652F9929B52831A329AF9525FA96A05A92A335B998F48D5578BD5E0907DF2AE0306DEEF961116892B526EDF65FB617254C324F5213E3084849070184AAA93EA309C74249D60044926BD6034E94D7A43067985A4C29B248364C0DB248BBC0BE3C879721EC693CBE4324C20BF4AE730D13B3560127550074CA62635610AF5A37E9045036800BC4B4369284CA595696598466BD01A309DD6A56D61064DA5FD61151D4007C06A3A48C6E435F4359A0E6BE9703A1CD6D15174147C4327D2899047A7D029B09ECEA53B6103F3C859738D45B36828612D584BB8C11E658F12CA66B0198469A9DA6CA2E9DDF46EA4BEDE5DEF4EEED55FD25F22D17A0FBD0769A0F7D3FB91867A7FBD3FB94F1FA00F208DF46D8ED1A4B1FB29771772D63DCA20A4C4F4351FA6AF9ACF9BD9F4234F82A727BDE019E2194BAF0A2A9CCC292A894ACC4754169599AFA82AAA323F71B7B89BF98B1AA2062B276A895AACBCB847DCC32A883AA20E0B10F5443D1628A245340B120D4543162C1A89462C4434114D58A868269AB13011236258B8682E9AB308D142B460778996A225AB285A8BD6AC928817F12C522488045659248A4456452489245655F412BD5835D15BF466778B57C42BACBAE82FFAB31A628018C06A8A57C5ABAC96182286B0DAE275F13ABB478C10235894182D46B33A224364B0BAE22DF116AB27DE166FB3FA62BC18CFEE1513C544162D268BC9AC81C81259ACA1982AA6B2FBC474319D3512D9229B3516B3C42CD644CC117358533157CC65CD448EC861F78B0562018B110BC542F680582416B1E62257E4B207C5C7E263D6427C223E610F896562196B293E159FB287C567E233D64A7C21BE608F885562156B2DD68835EC51F1B5F89AB511DF886FD86362BD58CF62C5B7E25BF6B8F84E7CC7E2C4F7E27BF684F841FCC0DA8A1FC58FEC49B14D6C63EDC40EB1833D25768A9DACBDD82D76B3A7C55EB1973D230A45217B569C11675807714E9C63CF896251CC3A8A8BE2227B5E5C163FB34E72F27641FF05E8B908B94AAE4A2F7683DC90DE43A73A68B8CE745C670E5C679C86D01070D2481A092E5A9D5607B7771682A177D5BB82A927E809E0D113F544107A929E043E7A5FBD2FF8EAA97A2AF8E9697A1AF88B8AA2229413912252AEF12AA20A5410D544350810D54575081435454D0812B5456D081651220A42445D511742C5BDE25E08130D44030817F789FB204234168DE12ED15434858AE27E713F54120F8807A4B7F2FADFCAE87FAB8847C4235055BC205E806AA29BE806778BEEA23B54172F8997A0864816C95053A48814A825FA883E505BA48A54B847A48934881203C540A823D2453AD41543C550A827868BE1505F8C12A3E05E31468C816831568C85062253644243F18E7807EE1313C4046824268949D0584C1153A0897857BC0B4DC534314DFAEB196206DC2F668A991023668BD9F080784FBC07CDC53C310F1E14F3C57C6821DE17EFC343E203F101B4141F8A0FE161B1582C8656628958028F88A56229B416CBC5727854AC102BA08DF85C7C0E8F892FC597108BFEEF71F47F71D277AE8327A4EFCC83B66283F49E4F8A8DD2DBB6139BA4B77D4A6C96DEB6BDD822BDECD362ABF4B2CF88EDD2CB3E2BF265CCE82076C998F19CD82363464751200AE079715A9C864EE2AC380B2F88F3E23CC48B0BE202BC282E894BD0597D2BD7BBFB8F465FFB9E9C5B3A7981BC203FEE4EBACB9DC5A7DAA7321FBAEEB80ECC19E38CF146EFFFCEBEFFCEBE7F78F685E0ECF33EE3A7A48763EF7FE7D87FE7D83F34C788DED37B679444D268D64AEB00617F705F7B3C4C9599E64258029FC35AD8085B610F1C8493DEDF86CB94DF414CD74060AE7EAE54D7AB68FBBB06A14D73FD0BED00D76BD2A6CA77E968535D43D0F6770D459BE67A1DED00D71BD2F697F586A34D758D40DBDF35126D9A6B14DA01AE31D2A6C97A1968535D6FA2EDEF1A8B36CDF516DA01AEB7A51D20EB8D439BEA7A076D7FD778B469AE096807B8060395A5C324F6778D9698E6CA9438E06F28320947DECF35592933452993A594795729335529334D29325D29324329325329324B29325B29324729F29E52649E52244729325F29B24029F2BE52E403A5C822A5C8874A915CA5C8474A918972FCFD5CD9A8C85C5464E1DF54E463A5C812A5C8274A91A54A91654A914F95222BD45CF94C29F3B952E60BA5CC4AA5CC974A99554A91AF94226B94226B95225F2B45D62945BE518AAC578A6C508A7CAB14D9A814F94E29B21815598E3365352A92F73715F95E29B25929F28352648B52E447A5C836A5C876A5C80EA548BE5264A75264B752648F5264AF9A2BFB9432FB9532054A9942A5CC01A5CC4F4A91434A91C34A91234A91A34A91634A914DA8C856546417CE94837F5391134A91934A91534A91D34A91334A91B34A91734A91F34A9162A5C805A5C825A5C865A5C8CF4A912B4A915F9422BF2A45AE2945AE2B454AD45CB951AA8C1B4A9571935265DCB454193753CA1C47458A50918BA8C855EF4CF1DE67F3F61B9F3D77801A642B9DC962D9132C91BDC47AB297593FD69F0D60AFB2D7D868368665B037D958F696DC051F6487D86176841D65C7D87176829D64A7D869768615B1B3EC1C3BCF8AD90576915DF23494C7F5215BC81679826C9A0D843DC61E03CAE2581C3096C0BC7F372D89F50007EBCBFA8293A5B25470B13496263381816C20186C301B0C264B676F80874D63D3A01CFB9C7D0FE53D0D3C0DA0BA3C7A08B8B508ED2EADA256498BD42A6B55B4AA5A35ED6EEFC8648F2E01DCBC37A17EB7EAFDDB21B24CB6B91B3961C9BFD5A8AE6AE478EF4DB16459025A792D5CD6AEAE5507A34CBBD2F396D72A68015AA016A4056B215AA81626EBFE7E5EEF6F757C347FAD9CA66B0E8D6B4ECDA5B9354333358F26341FCD57F3DEEFD2E4D886C84E7ADB50ED7E2D064CED41ED4110B2AC1984B21CB6802D621FB175EC1B96C7D6B30DEC5BB6917DC736B1EF6FA778F017A16F848E946D5D6C1E9B278F3B9FCD973DFA807D2055CF65D29B4AFDBE96673DC84E8108FE3CF873080A1D163A0C824347848E90A3A2728D84C8B6F3659B5C59F70BB6927DC956B1AFD86AB686AD655FDFEEDACB238CF0DE6D93BDCD91E75CC016C8732E628BE4393F62D273CBDE7F2FCFE91DA390FD7B439E73A4EC65B06C1305E56F7B96DB8C17B53DA8B4F5B6FB8BB310DB79678D6CA7A7D24F6FF9AD65E9AF964A7F79E3FDE592F7D7379360324CC15FDD4E8569301D664036FEA668B6F414EFC9AC779E9C25F36101BC2FFDC607B0083E845CF80816C3C7D28B7C024B61192C874F61057C267DCA17B012BE8455F015AC8635D2C37C0DEBE01BC883F5B001BE95FEE63BD804DFC366F801B6C08FD2FB6C83EDB003F26127EC82DDD217ED857DB01F0AA0100EC04FD2331D82C370048EC231380E27A49F3A05A7E10C1479FF32109C975EEB025C844B70197E862BF00B5C855FE11A5C8712B821A73BA14FD276F429DA9E3E4D9FA1CFD20EF439DA913E4F3BD117683C7D9176A65D6857DA8D26D0EE3491BE4493680FDA93BE4C93692F9A427BD33EF4153A8BEEA2BBE91EBA97EEA3FB69012DA407E84FF4203D440FD323F4283D468FD313F4243D454F33373D438B9841CFD273F43C2DA617E8457A895EA63FD32BF4177A95FE4AAFD1EBB484DE90AE8A30CA18D398CE1C8C332773B127593BF6146BCF3AB1175867D685F562AFB0E16C041BC946B109EC5D369D2D661FB34FD852B6827DC636B31FD816F623DBCAB6B1ED6C07CB673BD92EB69BED617BD93EB69F15B0427680FDA435D59A695BB56DDA766D8796AFEDD47669BBB53DDA5E6D9FB65F2BD00AB503DA4FDA41ED9076583BA21DD58E69C7B513DA49ED94765A3BA3156967B573DA79AD58BBA05DD42E6997B59FB52BDA2FDA55ED57ED9A765D2BD16EE81EDD9F3FC85BF087784BFE306FC51FE1ADF9A3BC0D7F8CC7F2C7791C7F82B7E54FF276FC29DE9E3FCD9FE1CFF20EFC39DE913FCF3BF117783C7F9177E65D7857DE4DBEBACBD74BF2D583F7E42FF364DE8BA7F0DEBC0F7F85F7E5FD782AEFCFD3F8003E90BFCA07C9D760FE1A4FE743F850FE3A1FC6DFE0C3F9083E928FE2A3F9189EC1DFE463F95B3C93BFCDC7F177F8783E814FE493F8643E8567F177F9543E8D4FE73378369FC967F1D97C0E7F8FCFE51FF045FC439ECB3FE28BF9C77C09FF842FE5CBF872FE295FC13FE39FF32FF84AFE255FC5BFE2ABF91ABE967FCDD7F16F781E5FCF37F06FF946FE1DDFC4BFE79BF90F7C0BFF916FE5DBF876BE83E7F39D7C17DFCDF7F0BD7C1FDFCF0B78213FC07FE207F9217E981FE147F9317E9C9FE027F9297E9A9FE145FC2C3FC7CFF3627E85FFC2AFF25FF9357E9D97F01B4E70123E8FE7F0F97C017F9F2FE417F8457E895FE63FBB07BA5F750F72FFCB3DD8FD9A3BDD3DC43DD4FDBA7B98FB0DF770F708F748E35FC660E33523DD18620C355E3786196F18C38D91C62863B431C6C830DE34C61A6F1999C6DBC63863AA31CD986ECC30B28D99C62C63B631C778CF986BCC33728CF9C602E37D63A1F181F1A1916B7C642C363E3696189F184B8D65C657C66A638DB1D6F8DA58677C63E4191B8DEF8CEF8DCDC60FC616E34763ABB1CDD86EEC30F28D5DC64FC621E38871CC38619C32CE1AE78D0BC645E39271D9F8D9B862FC625C357E35AE1925C60D134C625293999AA99B0EF39079D83C621E358F99C7CD13E649F39479DA3C63169967CD73E679B3D8BC605E342F9997CD9FCD2BE62FE655F357F39A79DD2C316F78C0433CD4C33C9A47F7383CDCE3F4B83C6E8FE1313D1E8FF0F8787C3D7E1E7F4F394F794F054F8027D013E409F68478423D619E704F84E72E4F454F254FA4A7B2A78AA7AAA79A679A67BA678627DB33D333CB33DB33C7F39E67AE679E27C733DFB32034297478E8288C83F82400EFC80FA133A9F4A3789F7D366B23B3811DEC71990DEC641DD9F3B09BC5B317612FC6DEFDAC0FEB0305323EBE0E856C3C1B0F875816CB82C398071CC1F87614E3DB318C6FC731BE9D60CBD9A77012E3C469ADB1D68400DEAFA7BA5B7793BABAAFEE4BEAE11DF9FA8E9F1C47C9715E97479322BC3B7FC13DCA3D8D52F73CF75734D0FDADFB0AAD8FF7E8BBE2DDF91C9F489F48BAD41B2DE9326FB4A4CB65B6508CDF6D8C84DA102733A8A93232AC925E5B9ED49011517C8BEF16E13BEF331E5F08803063BDE43B8D0D12771BDF4ADC6B6CFAADEE4EF96E0D38653E12041152B99AA54F9F8CDDDECF8DBD12BF33F64BFCDE2894F88371C6DB5254F01E5104788F2802BD47C4635DC7A3DE7CC6E392EC1BE196B85E1896121F2CF1C5123F4B4910960463490896C8CC425EC7BAF26A36A28D80D0A6B42950DA8AB602461FA58F82469FA04F80EE9EE09E000EF7A7EE4F81BBCFB9CFC9E3517D01FDF13F147BAD91F77F77DCFDBF1379BDB1F5AFC6D3FF642CF5E7093C9127F17FC9C8E48DA80FCB581A8B51EE4919B132317E7690B1D31B354B6366F7BF182D07FF0F71F2D628F9AE8C8FBF47C6B251E7FFB528F95B1494F1324BC6F5B2D1F2419995787392D28CC49B8FB49519C92F2A1FF9556623CFC94C241B7391993213B92A67ED3372A6BEE89D9737632AED658DA7A6AFE967FA9BE5CCF2660533C00C3483CC6033C40C35C3CC7033C2BCCBAC68563223CDCA6615B3AA59CDBCDBAC6ED6306BDE360A8FB87D1C162EE116C65F8AC68B6E8DC7C247F80ABF5BA2F27A6383F12DC6E64DB78DCE3B657CDE6DEC35F61B8537E3B408108118ABCFFC61B4BE7E6BBC1641225884DC51D4B6C46CF3FA7F3A6A4B0F1F4728A920B7C221A43A94276D497BA88CCFECAB9378D21D6A9197C84B702FE9417A40347999F48206A43719048DC86032095A92A96406C49365E407E84AFBD254788DA6D1D760281D425F87D1F40D3A0ADEA463E85B308EBE4DC7C3247CFAFE2E9D4CA5B7C77B04D9CC64FE30939567E5218705B09A309FD566756025ABC75AC26ACC01B6630EB0037775F9DA1CED0738A9FBE97E2448BFAC5F26C1FA15FD0A09D1AFEA5749A843CA45C21C631C6F9170C7DB8E0924D231C99145EE764C75CC20B51C331D0B491DC722C752D2D4B1DC91475A3A3638B690A71DF98E7C12EFD8EDD84B5E74EC771492AE325BB84EBA3B6EC86C61186FC89B9215FC7EFE0059E5ACE1AC49D6386B3BEB90AF9DF59CF5C87A67436743B2C1D9D8D9987CEB7DFE46363A9B3B9B93EF9C2D9C2DC826672B672BF2BDF351E7A364B333D6194B7E70B677B6275B9CCF3A9F253F3A3B3A3B92ADCE179DDDC836670F670FB2CBA5B934B2DBDDD5DD8DEC71777727917DEE9EEE5472C09DE64E23A7649C9D464ECB38FB15B924E3EC15526250E379CA8D178C41B48B39D33C488778DEF24CA55F977E3F46EE5273F189CD0B24517DB2BCCC2744EEFE1D2AF7A886DFCDA732DACE43CC9559C13CB45EF6A5625F4AB65FBEBCDFD2A9456AC9591345A264B86B441AC9633E421E91C1E531F21868248B64E1B7743640173D440FD5C3F4703D42BF4BAFA857D223F5CA7A15BDAA5E4DBF5BAFAED7D06BEAB5F4DAFA3D7A945E47AFABD7D3EBEBF7926D643BD941F2C94EB28BEC267BC85EB28FEC2705A4901C203F9183E410394C8E90A3E418394E4E9093E41439AD314D6397D9CFEC0AFB855D65BFB26BEC3A2B6137FECE679A1C8A46F10E84867F0BD60FEF1D05C91703EF5FE3D6F0AFA9E8523DEF37AEBDFF5BCD29556D22F3C466F2E58618F932F0BF7198F0987C097856BE7CF02FE6F842BC7CF9E3FFD52B0749F2551EFF7E4905FC9B5181F817BE83E5EAA410427C882F84CA351A02E124824440047EBBE62EB95EDB4245B95E3B42257C2A1C892BB5324926C95005BF6F5395F42769508DBC465E936B7A0C190335C89B642CD424E3C838A82D57F054B847AEE06510455693355087E491F5508F6C229BE05EBC5F158D2BAF2166D96DF0AE553CDEB5EAFCDBBDB475EA5EDA7CA95438AD47EBC98CB1216D2833C696B4A5CC18DBD03632636C47DBC98CF159FA2CE832EFE90E0E99F1BC2C33C6D1EE0C70BAC7BAC781E1CE71CF075FF7FBEE45E0EFCE77EF8400F76EF73E087217BA0FC95C7AB0910E9564F4180E55BC91016AC8C8301B6A79FD38D4917E3C1FEA49EFBD1F1A480F5E080DA50F3F04F7493F7E041AC93DD731682C7DF9096822FDF929682A7DFA19798DBCDF1F6B4A3BFD36968D6A2C5EDF1861194B63DA58D6F58E88D1B67277A3E188741C9143E6771DE1FFB0F725705215D7DEA76ECFD2D3DD3373BBAA6ECFED611170186018866118867D806115106140960104D945F64D44414482C4200A222AFB26B28B886CB28B8A4B8831C628216A8C21C618B7E753342CDFA9FF344D5F9FDFCB4BBE25EFF7FB3EFA375597F3EF7BABEA9C5367A9BAF7762AC6E5E7E86D32A5615C018C2B1DE39218970EEC0AECE611ED09ECA32A18630D8CB156E04F813F536EE02F81CF795C66A4051869238CB404236DC6FEEF49CE0F9EE22CA30D46DD11A3EECC7EE91BEAC65EE9129E76B2383A1F1BDBBDEDCEF3730446B4D58C519463DE539C42580BB5C418D1364EB3441F619EFBD1F1EFF10CF8115EB4B25A312F0C479220E364F025057C49055FFCE04B1AC7BD832900EE0421F51078941E18101840199CB1CFA14CCEC796B2EC9705565255CECAF6514EE040E01895706EF6399506BE0C5CA0911C43DC4FE3395A7898667174B083E6B1EF7F8E1E655FFF2EAD86EC0F40F607D983FF9E0E41039E87061C86061C81061C85061C83061C67CFFE399D60EFFE259D640F7F895E607F9E426738C671E96D8E6B6AD27B1CCBE4D1798E4A82F419471761FA927D7C3667006C0939439A4C64724A2A33AB0FD4CBDCF745BD8377853AD2193EA79A78027745FAAE4904CFB810673446EB7A264864DB3589501F2A8DD32C6A4B790912D96656AD03AB029BB8E5E381D3AC6DDF058DFE32159977657F6AA22785B1D6B1DAFBCF58563ED3811D22D821013BE4831D4A821D4A861D4A811D4A851DF2C30EA5C10E05608782B04321D8A10CD8A14CD8211B7648C20E29D8210D3BE4C00E65C10E4549F84E9AE715AD2EBE43CC89BFB78F6389007EB9A596C81345A28528135D4539F76E98182B2689191CBBCC130BC562B18C5B5D27368B1D628F38208E8A53E255F106F3E61CF3E163F199F85A7CCFC63FC50A59D272ADEA568E95C7DC2D11793CFABACC8B06A82BD8FB997AB0688EFA16D102F510D112F550D10AF5ADA235EA61A214F570D106F5089E79A61E29DAA11E253AA0BE4D74423D8E3DAAA9278A9B50AF48CE3275D2BE6417F5FEE4A8A933FEE60F9A3A59F943A64ED9E44F477DC49F81FAA83F13F525BF8DFAB23F8CFA8A5F9A9AA31785BA4DA6403B63453DB60499ECE72DFE5F3E9715ECED4DECD090CB5B4421974344232E878A222E6F158DB91C26388EE0B135E1728428E172A468CAE5285166EE1D11EDB9BC5D74E4721CC70B168FAA0B9793C40D5C4E165DB99C22BA73B942DCC8E52AD183CB95C99A2C1EAFC3E5FE64B3F2F1373F0B8647CA5ACDE33477841FF173BCC1634C317743F953B9BCECF77379C59F46168F8DA31F7F1BAA177FE3C234BA9BE6D3225A46AB6813EDA0BD7498FDD8EBF4169DE3CCFF539EDBB1FD40D62497753D8775A950948856AC4D5D440FB690153CEE513C0A9E9FDCDBBA623BEAC16207EA5BC44ED443C42ED443C5D3A88789DDA8878B6750DF2AF6A01E219E453D52EC453DCA5FCDD43CC6EAA6E6515E87FA88BF06EAA3FE9AA82FF96BA1BEECBF1EF5157F8EA979C4B551B7116B20BFB590DC3A486E3D24B70192DB08996D82CC9E84143743724F41725B20B9AD461E7E0D8E3BE078041CCF02C75D703C0A8E6783E355C0F1AAE0B8A0A44CC25DE43ED80AC24C1799E63565E639B71E7896B42E15B12F8EAD448908742D0B3AE29AB6CD5544347E34C66892B1BD6C4F964357509A1D36619B37E20B87731A014B64C1BE183B5B821838FFDADA5CF664B2B207674FE1B27BF6542ECBB3A773D9C7B4913DCD60A6DFD903B347F2555CFAA9B859F41303447FD1578C09F467DF5551B9DA6C4DB7E6580BAD477D2B7C5B7D7B322E665CCAB89C7185ADF3EAC09AC0DAC0BAC0FAC086C0C6C026B6D4270227032F044E055E0CBC147839703AE3DB0C2BC3979194919C9192919AE10F7C17F83EF0B7C0C5C0A5C0E5C095201BCDE092E0D2E023C165C14783CB838F051F0F3E11DC17DC1F3C103C183C147C3E7838782478347836782EF85EF083E087C18F82E7831F073F097E1AFC2CF845F0AB506AC81F4A0B0542C15028941ECA086586EA87F2430D4205A186A1C250A35051A871A838D42454126A1A6A166A1E6A116A196A156A1D2A0DB509B50DB50B9585DA873A843A668432D23332326486CAD0191732BECBF83EA34A46D50CB3039A8B9C9190272673DCD18D3DE2586B1CFBFC699C0F86ACD99C0FA6E3DEEB0C647F99C8E96CACE5867DCFF89E2199F274CA6E5229FB53F69393F26DCAB71CF571A6435926D3E1E8E8BDC01FA99EC97738165AC89EBF0567FCCF517BCED5DFA5EE9CAFFF966E84E7EF01CF7F133C7F4F78FE5EF0FCE5F0FCBDE1F9FBC0F3DF0CCFDF179EBF1F3C7FFFE065F6F9034236FBF961F0F3B3E1E7E76638ECE7EFE3711EA28AFF8A44FF3909FE1F91D3550905C04D0237D3C047093E56011F7330F20618790946DE0B23EF8308A75F65DE981C484EC71CEE4A6655B88CAA27EAFF0FB5F87FAE8F95BAC357084353089AE283845320CF0CC83313F2B421CF30E429214F05796AC8D3813C23906716E4E9429E51C8339BE596455562BD0F266724F43E83A3D5D88C3516037A4AD053013DB5A0A7BED8B9A1E4CC84735D8E69E256E0EA4C87DDC12C802627439353A1C9EC8138FE72FEABABABF60B78DA09FBD7E9DDD2BB918E6525782EC73E41966DDE2521ECA18805AFD17DE9C571A432823479401FC48ADB639456784E63A18766E2CC09B4C143633BCFD9E9B218CD5C73A6E1859D63E710D9F5EC7A4C29B03912B09BD81CE9D8ADEDD69466B7B7BBF1777AD83D48D9BDEDDEA4ED81F64072EC21F6108AE02ADDCD73267FE72AE6CC00CE0CE29CB6281B18695887AD4F58425FF0DF37E8DB0E13515B9BF9F316D3CEF2DF0709F4C5BE7CEB30D34EF2DFE9383DC99A61CDF0696B1353B7F1DFEE38227CEC8DAC87B9F6C76996D5C5FA8CA977F3DFD7D7BE69BDC37FA3584E5DACA284EF56455B3D995E64554DF8B6698723445FB6AF862FF7DAF7C5A7D65246D89BFB2C9F1F4F2E5D3D6326FFA5F0183EB63E33C7F1330E592C77F119236F586F9BE3F8193C4261B8D03D81B69769C7B95F1BC4A204EA1AA672C4622DB2967A7AB980E94B993ECD9A65CD4D68B39335819159E659AC046AA1D51F79A5657512850974D7628971FCE6B30AAC6271F41A42972D1E3BC7893E4B5BD9568D04BE716CCD88F9AB7E4D7EE2A2F8C2B2CC560AFFF913E8EF707E62DED662FEBEB846A7359C2998779D99BF77AEC99B16D002B1579877EA98BFE309C8388E1B160BF3DE34F3B7398E249B5FED1573C53461DE0C62FE16259C55C2337F84304FFC9BBF49096755A5AAA294338D9EB19CAE6F0CABD4FAEEACF56676D4B3CB59C7F3EC9BED9B29DFAEB0075303CC9146F6227B111541DF2B673247DC6427A725A7F19943CD8CB787D91C89D8A3EDB194628FB3C7F34C99684FA6903DD59E4A99F674FB4EB2EDBBECBB78D6CDB6EFA1887DAF3D8FA2F67C7B3E55B117D80BA9AAFDA0BD9CAEB357D89BB81F9BD96E98A70A2CEED1CDF1191A8EB568DA12682B196DA5A1AD20DACA405B99684BA32D076DB9682B1B6D55B17F66FF8CAAC75BDC8816B753637B27B7DB3C6EC5B80D94E5286F44D91FE5BCCA67FAD82E98FF35E13212B7780F52125BBC71765760E67D3879789F4D846A00BF8947D51B473DE347BD70C4FA6477B03BC1D215E21C977262E7182B7AF5AC6BC7BD62C709678A0DE849631A83DFCB9E4573594F16714EFA38ADE16C621BEDA67D9C4F9CA4D37486338AB3F4019DE79CE22BBA4097451267A7B68888AA9C9FD61505A29833D4B6A293E8CE396A7F8ECE47FC304B658B69B106D5E6B2B69DCB65AE5D87CB3A365B6FBB2E5B528BED691E977936E76A767DA339763E5B4DCB6E000B5B6073C66637B43963B30B6DCED8EC4636676C7691CD199BDDD8E68CCD2E660E1B5BCC51B25D6273C66637B59B71D9CC6ECE6573B6D196DDC26EC9654B9B3D89DD8AE562B1D52EE5B2D46EC3651BB6D696DDD66EC7653B9BB33DBBCCE66C8F3D43072E3BD89CF3D91D997F96DDC9E6CCCFEE6C73E66777B139F3B36F60495A7657F62196DDCDE8A1DD9DE78AC533A61CFAD9DBC88EB5D4E27953C165057B088BFDC4202E07F11CB2ECC13C872C9E498BB834F35524A7253CBFE0622EEE8CAF84FC6333321BD246BE61DFC231C14F4C995E0CDD9B4122A382EEE33C3197A558C15663B1D8224E8A73E21BCBB6F2AC0ED62DD64CB6B53BAC97AC0FACEF7DDA57E0EBE21BE6BBDBB7DCB7DBF7AAEF23DFE52437A928A97BD2A8A4B9492B92F6269D49FA38D94AAE9A5C92DC33796CF2FCE435C90792DF4CFE342525A5464A8B943E29135216A66C48399CF276CA17A981D49CD4D2D4FEA9535217A56E4E3D9E7A36F56B7F86BFAEBFCC3FC83FC3FFB07F9BFF94FF3DFF853499969FD6296D68DAACB46569BBD24EA77D98763110091406BA06467004F778604FE0F5C0798E56B383C5C11EC131C179C1551CA5BE11FC249414AACE116779685C6841685DE850E8ADD067E97EBC93B96FFAA4F407D237A51F4D7F27FD2B8E3C7333DA5ECDE098F7CC2553A617A36C7C1531BACCFCCB3108CA6B486D20B581D4F620B9407281E47A903A40EA00A9E341EA02A90BA4AE07A907A41E907A1E240F481E903C0F521F487D20F53D483E907C20F91EA4019006401A7890022005400A3C4843200D8134F42085400A81147A9046401A0169E4418A80140129F2208D813406D2D8831403290652EC419A006902A4890729015202A4C4833405D21448530FD20C483320CD3C487320CD8134F7202D80B400D2C283B404D212484B0FD20A482B20AD3C486B20AD81B4F620A5404A81947A903640DA0069E341DA02690BA4AD076907A41D90761EA40C481990320FD21E487B20ED3D4807201D8074F0201D817404D2D1837402D20948270FD2194867209D3D4817205D8074F1203700B901C80D1EA42B90AE40BA7A906E40BA01E9E641BA03E90EA4BB07E901A407901E1EA41C483990720FD21B486F20BD3DC8CD406E0672B307A9005201A4C2830C043210C8400F3208C82020833CC8602083810CF62043800C0132C4830C053214C8500F320CC83020C33CC87020C3810CF72023808C0032C2838C043212C8480F321AC86820A33DC8182063808CF120B701B90DC86D1E642C90B140C67A907140C60119E741C603190F64BC079908642290891E6412904940267990C940260399EC41A602990A64AA07990E643A90E91E64069019406678903B80DC01E40E0F3213C84C20333DC89D40EE0472A707B90BC85D40EEF220B381CC0632DB83CC013207C81C0F720F907B80DCE341EE05722F907B3DC83C20F380CCF320F381CC0732DF832C00B200C8020F723F90FB81DCEF411602590864A1075904641190451EE441200F0279D0832C06B218C8620FF2109087803CE4411E06F23090873DC812204B802CF1204B812C05B2D4833C02E411208F78906540960159E6411E05F22890473DC87220CB812CF7202B80AC00B2C283AC04B212C84A0FB20AC82A20AB3CC86A20AB81ACF6206B80AC01B2C683AC05B216C85A0FB20EC83A20EB3CC87A20EB81ACF7201B806C00B2C1836C04B211C8460FB209C826209B3CC866209B816CF6204F01790AC8531E640B902D40B67890AD40B602D9EA41B601D906649B07D90E643B90ED1E6407901D407678909D407602D9E9417601D905649707791AC8D3409EF620BB81EC06B2DB833C03E41920CF78903D40F600D9E3419E05F22C90673DC85E207B81ECF520CF01790EC8731E641F907D40F67990FD40F603D9EF410E003900E480073908E42090831EE4109043400E7990E7813C0FE4790F7218C86120873DC8112047801CF12047811C0572D4831C03720CC8310F721CC87120C73DC8092027809C006291135B8D31D9AA40B69A876CB53EB2D506C8560B385B1D4A4558B129C68A4D33ACD8B4C28A4D29566CDA61C5A60C2B369DB162D3052B36DDB0627323566C7A70BEBB9C7A617568105687CCCACC064AA71A9447C5544A5DA89C06D1289A44B3683E2DA6C7B13E821C1F47C8F371845C1F47C8F771849C1F47C8FB7184DC1F47C8FF718435001C611D004737F2D18D38C2AA008E90EF9BF572BB3D5308397B8884A8A00876137BD0509A12EBE706DA41FBE834BD49E7E83C7D41DF73BE1E1135449EA8ECC70AB3CA10CBF05762C56195596B88515683B22681B21694750994F5A06C00C55C7123AE688E36C78F9E8A1F6D891F6D4D687907AEB1337E8D5DF16F3D133FDA133F7A367EB437E11ACFE11AFBE2D7D81FFFD681F8D1411C55EA5DC4CC103EE308F9EC7E5C1FE5BA7FFC6AC7801D8F8D331DEB90D7D606C750B23D96F52D15FAE6677D9B4401E85BC89EC1F150BA7D677C9DD0B6E7B0D685A1750A5AE7705F0AB0CB5235D61ACF48EE03CF3EBB7F8C720494A3A09895CA79F621CF8EC8A698869855C4CAD5C2EEB17544B3F66359CDCC7AB4D509AB3FBB62B41C8BF3746B556CEDFE2A35C38A90CF5AC09FAA8974F18DB84C49D6047C923CC839F1119F37C99AE1A1BE24CEF0754AAD8AD8FAFC55FA2EB18FAF93CB9F32AB8B0759265651B279CB157FEA5A051E6CA698CBFDAFEBA18D10E34CEB96F6507B88BEE4E3D65F12973DF412514A49DCBAF99CF72055450E97BBB16A7E8D9A2232B0A37E32916A7E8F86AF3E46CC179B3D74F36B353ED1538C13CB3C74F35B3649E6BE50D14778F8835FF64832F70E891662980731F762248B247C6A88320F667E2F27993E361F46F33D98B9A34388888766DE3B6E09BFD93D48A09AF70C0B51C343336FB1B6E83D118A518D964DB277FD5F5F0FB7589B73EC326EC9EC815D670F64CB5E032B90D7C7D6CA2D9E99EDE3AB9601D8BBCA5DB2152837A1DC18DF3BF847771DDA910FFC30B3B156FCF9E8A781B5473927B6AE6A8E3BFF605D741BECF0F698ED16CC21B31FF4BAF8183B5666776C0CAEB71BF4BDE20DA6BF8D7DB46BD435D694CA3D2BF199D52281BEC0AA60FA16ECA35DA34EB2BA62CFCA12C7AD5002BDBF99D966C7CA0A2450CBAC5A953B5662A9782F819E67BE25CC5D92E712A85A7CCF9412CCB6DDD7E874517C58B94F25762550CF9B3924FC986DF312E867B0EF64DE633837817A40985F93390BFDEC93405F27CC1BAC4FC6EED1BC4A7D005734BB4867456E027D0AF6A078D6899C04EA20617E938BF3403EE34202BD03E693E1F53709D4026124DF938FE6D0AB09F488309235BC3E1DA31AEDC4DE87DD85E5EB834EA54283F0C647B302F10FEDED5AAC31C3ED11FC6DE3452C9E51E3B885D99CDB26DBF7F0FC49E1F9732F5F7135FB5EBFBD96FD6D9ABD91753BC0736633CFBA2DEC4143F601F664E9B179D12DA6E969E895B9D73DD91ECF5A483C37A7737F8C27B2ECADACA13E7B2F7BCC14F47B355DDB81AA9C39E3506EB9BAB6CFE51E9463506E66FEF828973F869733C8FC331CD3D88D1F119B33CFFC2FEF975BF075F3F8FC43B6D945B5F88CBF77BDF67CBDAE1C430571BD10AE67EEDAA84A57DF209E640FC20E4812764C06C1D655D883A8729FE41BB6CB33C51EFE54EEF4EE89D1DF63FA5073D796F8C0437F892D7F177126E629AE52CDDD6D45E280D8E3A1AE606A55B1452CF750E7333585E7E3020F7502D75F8879D0EF6BD4FE5C9F653F53E1A196717D4A0C8A7992ABD47CAE77894EB1797495CAFE9D1E178531CFB2E7BF41746DA43A9CE74EE52C1098053EBED60C96D06A8E3753A0F37EE87C1A743E60EF617D0CFE6FB91FE3EABD15A6EC85F226943D51F646D9116507949DCCAC259F3BD4BDD51D6634343C363C96283C3B3C071ACA73CE1DEE9A7BCDADF06DE1F184F766184A787F746F78A633D999AE0FEAFDCE9DE6BBFC8DDBF8DCF1FC3D11BE33CCB4F0C2F042F2851F083F4049FA0E7D0725EBFBF47D94A2F7EBFD94CA671E24BFD3D2698937E2BB9416CD8BD68FE6471B440BA20DA385D146D122B3431BFE49F841ECD04AFCD656014702E53C2F67D042B6ACAFD33722E6AF24CF009925397F90D9314A3F506E4DA0F407857D86AC12A30C00E59684EF5480323481321094E1382BB5F24E43F8D3022A461B12D755B896C6F90ECE89C8415CE6A26761334BE5305C3599B91E7B42182D6BF43A8C361DF457E29B6EACFDE1B896E9B5C255CC55B38C95E4735C2299CDFDF2733BB914C0ACB0703FA4E9B34269B4C392FD4D9F8CBC7DBDCC9B18CCF9BEAEBEAE6CEECCF3DA02CF6B9BB7FA0A3C43D12166F99E8535EC41460B8A12683E3C156334AB7A9C6AF4E4DE6CD3EBCAB78550784AF82ED68CF92C41CDD22D4264E60BFF297C8528DA317A2345A3FBA3FB9997AC8DE17BD1769F04ABBB176D4F2033BFCB13683EAAE08F89AB4B13A849DC67F3313BC375E374A3D583C383B92F43C3B742ABFFF3BE9D099FE7BEB58A76E0BEED8BEEE3BE995E193F5D10BBE673E85533DC8F55354E3363BF253CE49FB8BE918D9056CCEB94248C6A9FF1799EAB2DE4B95479B5ACE8DEE85EDC1B618587C9E4FFB4DD4A6B59C075293EE6DAFB635497F95637F6A9A4FF478EFD58AF4D445E2D7C207C307C28FC7CF870F848F868F858F878F844F864F885F0A9F08BE197C22F874F875F09BF1A7E2DDA385A1C6D122D89368D368B368FB688B6C4554D4F093D0DA0A73A76D529E1A9E169E1E9E119E13BC233D996CC0ADFC5DFFA497841F87EE6C04FD9A2FC2CBC28FCE08FDA0B8BFBF41AF7B531B7A12BF55D1FD347F45183E99D7A27913EA95F30E312A7E87D39514E9293E51439554E93D3E50C79879C290FC883F2907C5E1E9647E451794C1E9727E449F9823C255F942FC997E569F98A7C55BE265F573E95A492558A4A557E95A6022AA8422A5D65A84C65ABB0924A29AD72546D95ABEAA8BAAA9ECA53F555BE6AA00A544355A81AA922D55175529D55177583EAAABAA9EEEA46D543DDA47AAA5EAA5CF5567DD4CDAAAF9AA9EE54B3D45DEA6E355BCD51F7A8B9EA5E354F3DAA96ABC7D4E3EA09B5423DA5B6A8AD6A9B7A419D522FAA97D4CBEAB47A45BDAAFEAC3E517F519FAABFAACFD4E7EA0BF5A5FA4A5BDAA79374B24ED1ED7507DD5177D29D75177D83EEAABBE9EEFA46DD43DFA47BEA5EBA5CF7D67DF4CDBAAFAED093F4643D454FD5D3F4743D83ADF87CFD13BD406FD01BF526FDA4DEAC9FD25BF456BD8D2DFB01B6EB87F4717D429FE2BFE3FA6DFD1BFD8E7E579FD5BFD5E7F4EFF47BFA7DFD81FEBDFE50FF417FA4FFA8CF3BD94E15A7AA53CDA9EE5CE7D4706A3AB59CEB9D1CA7B693EBD471EA3AF59C3C27DF69E8143A4D9D66D117A32F455F8EBE12FD79F497D15F47DF65995E2747CA096C03EF94AC45F2E7F23DBA4E39EA7A6AA41AAB0ED456F553B752B9BA4F2DA4C16AA55A43C3D576B58746ABD7D45B3451FD9BFA96EED4A93A9BE6E87EBA1F2DD503F5ADF4087BAB59B442DFAF1FA2357ABBDE454FE9E7F561DACE9A748C76427F76E917F5AF69B7FE93FE964E38F59DFAF4A6D3C029A05F398D9C22FA75F470F428FD267A3A7A9ACE465F8DBE4ABF8D9E899EA173D137A36FD2EFA26F47CD6F835AA205AD901BE526F9A4DC2C9F925BE456B94D6E973BE44EB94B3E2D77CB67E41EF9ACDC2B9F93FBE47EF9A5FC4AFE9BFC5AFEBBFC467E2B2FC8EFE4F7F26FF2A2BC242FCB2B8A9450961AAF26A8896A929AACA6A8A96A9A9AAE66A83BD443EA61B5442D558FA8656AA3DAA49E549BD5F3EAB03AA28EAA63EAB83AA14EAAF7D507EAF7EA43F507F591FAA33AAFFEA43E5697D46575854361A11BEA42DD4817E9C6BA5837D125BAA96EA69BEB16BAA56EA55BEB52DD46B7D5ED74991EA06FD363F5ED7A9C1EAF27E889FA1E3D57DFABE7E927F40ABD52AFD2ABF51ABD56AFD3EBF5B37AAF7E4EEF73D29C801374424EBA93E1643AB61376A4A31CED384EC4C9725C27EA34714AA227A32F444F455F8FBE117D2BFA8E89F4207182C41D48B90EA45C04293783945B41CA1D20E51E90726F487934A43C06529E08294F8594EF8634E742824B20C14720BBE590DD6390DDE390DD13956B53EE10E3B9F4B331492E960FC987E512B9543E2297C947E572F9987C5C3E2157C89572955C2DD7C8B5729D5C2F37C8F7E507F2F7F243F907F991FCA33C2FFF243F967F969FC8BFC84FE55FE567F273F9851AA686AB116AA41AA546AB31EA363556DDAEC6A99FAA07D4CFD422F5A05AACD6AA756ABDDAA09E557BD5736A9FDAAF0EA883EA90FAB57A5BFD46BDA3DE5567D56FD539F53BF59EBAA0BE53DFABBFA98BBA8AAEAAABE9EAFA3A5D43D7D4B5F4F53A47D7D6B9BA8EAEABEBE93C5D5FE7EB06BA40F7D7C3F4703D428FD4A3F4683D46DFA5EFD6B3F51CFDB05EA297EA47F432FDA85EAE1FD38FEBA7F56EE76EBD475FD0DFE9EFF5DFF4457D495FD6571C728463393E27C94976529C54C7EF34768AA3C7A2C7A327A2AF457F11FD55F437FF0D2469EEACFEC173244E39FBE4894E6F2E27397DB89C9C7591ACACD509DFE88B6FF4C337FAE31B97F00DF62BCCB7DB626B51B5F08C5F21724AF37FF32B0195BEFD40FC9BAC41720A634AA6C800F32124332999233B49691C193A14E4082E9BD265355993C2F27A994311C47AAE6C201B515436964DA8BA6C2A9B514DD952B6A2EB65A96C43B56567D985EAC86EB23BD5933DE44D545F967354D9207A217A914AA397B393A93D5DBB9FAE167A75105E72B81EC35E72AC9EC8D12747E0EC2367D2B537F15D8DAD0E191FCE2318C6DFBDCD8CC399E04C34E71BCEC8C93C92A97C9E0FE7192E98ECA4729DF479C43AC5C85ACCCA5F718CFAE3D733F1D1987F1987CC5DBFE679A61A1CFD76A88CC75D1EB99CE2727F9D7131CA51508E25500E83722481721C941331CA8F8DF42A8727C538CCD7A04CF66FCC7DF6697D492373EA8BCCA91F7BA413D49FBDEC791AC2FEA788E6B1876C4E0F38AD9CCEF4A0D3C319404F38A3B9AD279D8DCE76DA9EF548D60ADAEB1E725FA3C3EEE7D1DA7406B66B7B4C3335D6FE2A57528F00C13A61D8E40999E81B71DED08B2C5F3F1F67EE9C418CE7D87432E71129BE59BE59948A27CBFDE141E141C805C75210B9607A786278126520A7B4C373C37349869F0C6F26E50E72079393A0819577741E8DB79A1C97762E1F37906DA9064B6C0415472F649B3BBA7FF854C431F0AF0CF90BC5292652DF050DBC46F3510E7F562057BA4A35B37024742D6CF2B57F89AEB17D501195C5D2CE569C9FAA6AAA2625A962554269AAA52AA5906AABCAC8561D38B2511C377621CDF1624FCAE258B10F55E148B12F55E7B8E445BA4EBFAC4F530DFD9AFE15D5E218EC6DAA6FA230CAE718EC232AE0B8E4156A1AE36039D6620C178E83839D3057294EF1313FCB60AF0A12A84978C3443E9E3471E374C3C589712E5E95E4BF8697AD8D37E656D91B737FD81B73E6FCB87C9C52D81BAFA454E38F396B5E27D771DCB8416EE0DE701CC6D936C7619461E230B2390EDB4992E3B0DD3C068EC4487324F61CF772BFDC4F59EC099791CB3E703555E398663DD566FF7791EAEA2BFA0AE5B3EF13D4C0F83E2A30BE8F0A39CE49A7228E706C2AE11847525313E3503313E3500BF68D25D4CA79C77987DA3AE79C73D4CE79CF799FCA9C0F9D8FA88373DE394F9D9D8F9D4FA88BF357E7AFD4CDF9C2F992BA3BFFE67C433D9CEF9CEFA8DCB9E45CA2DECE1556EA3E115F2499FA465223A934209216095245242392418323E188A45B223A92454323D9916C1A11A91EA94E232335223569542427924B6322752375E9F6485E249FC6451A461AD2C44851A4314D8A348934A329ECBF4FD10CF6DD6FD1DDD1DF702C36277A2EFA11CD85EE982724CC5AF5D77431B68EFA157E1D745C6C5DB5D2D69B75CAB3B1FF9BDF17ED1ED39F13318D6C41422C8E51D8769A3887E704C7ADEC9BAAE82A94C4D168434A86054D81054DFD977907B37A93853A57363559B81C280712B9B66B737CD8D3ED49965BEE968317D562B67C15C7359A63B70D3C7337A9CD94CDD9DB36D6A1745DC673F6065DC1367E187BDF316CBFC7D08CC895ACA534D3B5DC141172FD6E5084DD74374338DC465864B9CA8D88A81B75AB896AEE756E0D51CBE58FC871EBB90D446DB7A1DB48E4B98DDD62D1C06DEA36130DDD166E4BD1C82D75DB88C66E99DB5E34713BBA9D4453F7067780689E9D921D105DB343D94ADC64786A5AE5D170AB946C5AA534D32A054DAB946E5AA5B0699522A655724DAB1435AD5275D32AD534ADD2F5A655AA6D5AA53AA655AA675AA5FAA6556A605AA552D32A621241E6BE01F3869B57B9ACD493B760E72BF5E4647CAD58C49E843214815DA042AECFC7682C0DCE02FBB2977D91BD648E7B927D5F27D83EB343624BFEB0BE28B3AA26233262D6F76455F2C95AB2166B506D599B6D45912C625B51224BD85634972D58A75ACBD6AC536DD91F85E40DB22B6BD68DF246F6D33D652FBEE670F650327A297A09AB0F491CB98CE536C6718E6A3CFE48D6578EA5B19B5113112F299FD2DC89C61CF7E670A6BF907A7366BF824620EE1DCB19FDAB348533ED6D348B47F12DDDC7F97211ED33D930FDC299E5DC45BF74EE7536D0AFB21ECBFA9EFEDD0DB92131C0CD743345852B5D2906BA59AE2B06B9D5DDEAE216B7A65B530C710BDC0231D42D728BC4AD6E13B7440C739BBBCDC508B795DB4A8C74DBBAEDC428B783DB418C713BBB5DC46D6E853B50DCCE59F72B623C67DDBF1613A2EF46CF8A89D9C1ECA030F6DD36ADB29670ABACF3DC2AEB3CB74A3ED32AEB0DB74A29A6554A35AD92DFB4CA9AC4ADB22671AB1C1D71ABAC4FDC2A659A56F99ADC2A49D30676622C8EF1EF837F699E103354FE8AC50B097EDBAA9C6398393AF6CDDC589C49748AAE3D11B92AB643667EF75D38772313992839F692534CB429A7C969E453392A37666F5239E76D4A7ECE765B539A6EAFDB534077D3DD28A87BE95E1432792FA573CE3B8132CD7A09D97ABA9E4ED2A9E254E1F0ED3AA70669A796538B224EBE934F59664D835CC831DBE9CBD19AD9D549951BE553DC831D7207DBB727F413AC2F2B357B2BF61D01F29B0C99D238430E63C720C9AC1EB106F5509CC1B08E6C601DDBA437B16FF6214E372B8916EE97A99C4395F1B6D997BF1B237FD1C475F119F216E570A4F047BC352AC8B92C9F65B258E6F863F231BEF232F67649ECED9673CF9ED1CF70CF2EE80BCC95CBFA32F78C4339EE99E5A450C06479881905E7B0E3105D5A182D61B42643C8E571EEE0EB1B6F1A905FCAAFB9C56FE4F73C8B2E2B960EDBFA27C9352B141CD5BCAF7E4FD5D41FD41FA886BAA4AE504D48234717EB62F6B84D750BCA854CF2F4003D80E31C23877CC8A140DFA3EFA186E06321F8D848AF666F5D046FDDD8AC40B0274E63CE3603675B80B3AD1CE564516BB3EA406591DB23D3A84364766436F588CC8DCCA59B22F322F3A867647E643EF58A2C883C40E591C59187A85F64496409FBDA47228FB1AF5D11594943C0731D8B496F01C75F3232668E97B1D43A70CC662366AB09EED702F78B309BCBD856BD442320E36CC539A3AAC9B1A050F5543D8E0B0B5521FC8985152742965BB97E9C679E7CB464CC4EBE8CE82DC21FB692E2729CFAFF23B2FF3722B2CA68FC87EFC132BF0E58FD3FCE6FB34EC5F25825D7B23CD6CB8D2C83AD721BEB82B145997297DCCBDCDF67B80C8B11D54BF4126ACD56613995EA157A05B5E3B9B596CAE06B3BC2368CD6DF33F7C7C042DCCE16228DC63941E6F80C279367DB9D3CDBA2340B5CBECFF9964772BF591BA257CC5A1FBD063FFD738CE71718CF2FE14F47CBD1DCEFDBE5EDDCEFC992BD8F9C2EA743CF2B9FFFB48414B562EB2DC86763FF33F77E183E54F2C03CF95FFB4779B096DB586F744FB93CEFD25555559567694D753D855533D58C6D530BD5821CF573758622EA0DF506DBA937D55B14352B6E54559D5567A9BA3AA7CC3AF44575916775755D9DAED735740DB659B5742DD6C93ABA0EDBAC7CDD80EAE8517A14D5D3B3F56CB65F86A3F5C1D17C58D886E06221B8D8085C2C662EFAA9092C6CA933D599CA9A7937FBAE76E05C59F4B5E86BF43FD8BB12F82A8AA45F33EFCD0BE48506DEDCE10EC825200872CB2108C82A0142B889102017109300810565916581E00122282A028A04D75B6E6F547459175957F15C44C15B512E0F4481AFFAFF3A8FC7F52D1EDFE2EEEF637ED4CCEBF47457575757555757F774659ABD4997C2932365214116EAA791C206DB123C2F863EAA8CBF45F0378BF5FBDB58470C9EAA1DD02F5DE3747034BEED2599DB7EC37E83CB936345E351F201E9DC733BF005331D760EC19E89C4BD1DF5FDFC0DD8BC69BFC96FBF6DFF93DF7ED7DEC5E57DC463A9BCFFAEBF13273F9CA98CA8EF6A2B5AF806BF415CEB4EAA2531828C276BBDB59EA9B1D1DAC87AEC71EB7168C8323B609F16F53CC82F14D4619E90126A05CB9D004B93F9ACE5A4F6486039F23DEBFE23DC07E5A18BC3D0184968B1B0BFB0BFA08AF677F67754C9497292A8B2E3391E459CC64E63329DB64E7BB29C5427955C679033883C679893413EEB967154055AA5BA339735490D68929ACE126709A5388F3A8F526DE729E729AAE3BCEABC4AE7393B9D9D54D739E81CA47AEE327719D57757B9ABA881FB88FB08357437B81BE87C7793BB891AB95BDC2DD4D8FD87FB0F6AE2BEE5BE4517C87914243C450661853A23924141D8F206CF52FAB06596EEA5E38BAF7AA499D758D147AEF34DD1EAC6C693A476348A631BFF45FCEF2308FC5C01FC2CC0C995C1C91170B20D4E76C0C935C0BDB5C0B7B5B9DCAA950B2B4BFFA1B4C634B6C6D80E8B14B355178A6C8C6C654DB5DF6409C696D985D4D41C67CEA08EE63CB698D3D96AB88F46B0D5F01CE5B2D5F001159A1F991F51B1F989F9254D32F79A7B699A5C01A33F98472C8DAE653BA23FCDE23132961EE231524CABD95E98454FC0CBF6BCB5C9DA4C9B6199FD15D6E4CBF6447B32FDDD7BDA7B965EF35FF0FF426F9E32A6FE15D5FE0EAAAD60E94A90AE1AA46B00D23508E91A862CAD00592AD83629CF2353CACC0864A60D99E9C036A9013959CB7F8B25E47F3AD5A29EC7C1CA4B40143D536F2868F60AE728CF34DBC0233FD39CC4B2B7C45CC872F236D6EFAD98423ECB40498F3E4C8FCD94E66F673DD81F5419009971A9946072F682D3F40C35EB92B3AB88BD82A545B27B87FB0CE5FBFF649971735C8F45A386A5D6D120F9E8ACDF966D697942EFF74459AFC2EF5B8567F9643F663F4DF5ED97ECBF2362FA5F4BE272512F3CA89FC8D42F662B56D2BD1368DDC3CE615A5FEE9A6E5DBA02B41EA16A9735CF54F6FFE238DFE86BB017F7E1D4D886716901DA413B1067E5C45299FE5605AB89C23AC5DE6CFF95EA3BC7DC0835F176783BD85A3DE21DA12EBEEBBBAC7D06F983E8523FDFCFA76E67D5B2CACA2BC2C8B37695D6AE6D56336BB0769536AF6F5E64B6A464B3BD79316B57E9FFAC0EFF672DB31FDBCF29B09F6BDB7D990675EC95F64AB6F256D9AB58F61D700F32768F33259A4263B53E67566FF99807BF36B74FEAD3DAB091BA03EB5C78E70BDDFD8CEF1478E7AF01BEF3E2FA6F9AEABF0571FDB71D51AD429B19D77FDBD17F87E9B05610D77FDB25F730DF30D7599731F758E092146FA7B7935A7AC7BC63D4CAE77FD4DA1FE20FA1367E815F406DCFAAE75C78A9C8DEC2FC20ECEDF6EB54C9259739DE0DB801AEC7700DB2DDF26E22396E05E616CFB55C9BAABBFC8F6A32B3F854CBADE656A714B7166354C7EDEDF6613D96E6A6B1064B77D3B91707B98359830D7333A9A93BCA1D4D2DDD6C379B5ABBB96E2EB571C7B9F9D4D62D748B7112D2B9E9DDF359074AC9B486E56743F375F3536A6B1E6239D90BB419684DB56650165B127751BEF5B0B59AA65B875862CD84D55B6A5F634FA3FBECD5F6467AC0DE643F4B6B40CB75F676E7286D90B4D4764B5A6A1F4A5A6A1F495A6A1F4B5A6A9F4A5A6A5F495A6AFB242DB5FD9296DA01494BED6B494BEDB0A4A5F6A3A4A57644D2523B2A69C91DC7B4D44392967A39494BBDBCA4A59E2869A927B16DF1BE1E71BF770FEBFDE4DC42EFCF76E5567DA8FF77FF153D43CE33F4E1D22ED73359EA7DA78F8224998CF9C65CC573AF835F651468715C8A4EDFE26CA151F1695A4FAD8864CCF2F1B480D6524FC11941EDE373EA8703417873CAD2D856F1FEECC99353358C743A654E2C7D3A679831B07DEFA9D9B501491332EB99F578762EE7D8E530C72E8F997A2266EAC99034E7C3126E047DD0DEEE67F7E3F9DE407B205DC1B3F6153CEB9312A81012A808DEC6F16AFCE763FCBB5C5615B30ACF2AAA993579C4F4B5D3784CA5DBE93C56EE7097F0589152C0E5B63C856F799DADA7E06FF0148462DEAB09DC46A9F90DD60AB954CE1E6B8FA544F74E7729BC4635D9667D9B29F421CF62833C8BFD84F37D61EFA104FB2BFB005BB7DFD887493806CF562D9EAD96239B2DDA0A6CB956744CB6591DA70A5BAB7579565A8767A50DD82A6DEC34A17A4E53A70535705AF12CAE09DBAFCBA8A9739F731FB5701E701EA48BD8965D4DAD9CB5CE466AE33CE16CA20ECEDF1C9EA9382F3BDBE852B66E5FA3EECEEBCEDB7499B3C3D945BD9C3DCE1E9E317FE5ECA574B677BFA601CEB7CE619E371FE17191C16DA8179917B999DB7A4BE4161EEBD2631082B59E602DB016B0B4BBD55ACC3A4BDAEC61B6D98FB09DBEC2FE3355600BFD30B74AB6CD43DB7CB4AD0ADA560D6D4B41DBEAA36D0DD0B6F3D1B6C668DB854E3BA723B7EA12E7126EC9E5CEE5D416767D3BA78FD387DA3BFD9D0174316CFC8E6CE30FA34E6CBF6FA2CE68EDA5686D37B4B6075ADB13AD4D456BD3D1DAFE68ED40B476305A7B2556E0474B2FB2E425702D816B3570AD0EAE0D806B83E05A83DBBA8242E0C504F062B9980F20458D9D37303B5CC3B322F2AEF4AE8CCED04E63C9CA77A231D7D26A4B8CCA3A48B3869063ED21C732EC379836992C379EA117E08DF818DE883D98BD7F85D9FB3ED862D2EE24F7907B08B1DBB2863A9C9EC1964954C33DA93C66D11D4C6F1DB7FC60EDD9B0F6AAC3DABB806758ADA9196CBEBEB0F9D261F3F5F777736D03E26CC671D266C4FB35F17E03BCDF1658B4C7FB17E3FD4E78BFB3D496519B115EF708B46015D0A61168D304B66453E909E7FAA52E84F70DB629C1367550768AC261ABC2BE216A6F8EDABB02FB6E5CFB5F281BB58F43EDF9C0FEAA98E750AE6C4757C2DE56F4BF1BF45FCC2D3AC4F3A7EA983F5DC0F477A919E83F9EE9FF2C2D64FABF46B76246B598E9BF0B114B3F9F963AE61004FBBD6CCD5EEE34191BB372653F2EE51E8BF6E38F51FCB5F6C0FD9D5F547762D4F2C5CC2511F6AF0FFBB733F3EFE3948A19C7009E4BDF414379867C946EF03FF7BFA287FC6FFCEF68CDBF9D0F7EE91849F81774926DEB8BB60D5011C332B6A69B1AD7F23BDE01B67A2CCCF307B1E41882A86FE9C9C93447820AF93C0E4BCCB99C32CF9C8F5D33D1B5CB5869DA7C55DA8E3396D68E5B7913FC24A53C6F7D2FB28BE727FB2307298CB55A81B5DA4A322E8D22F0E25B6C19BDC916BDF4E5FBE621F330DBF2D2975F03EBB929F0E8D7C67A6E1DACE79EC776D354AA0BFF7D3D48F6FAF0C334601BEA61A6EB1A6B0DEBE275D63AD6C552CA378667A6093C334DE1996906CF4C7378665AC03373113C332DE1996905CF4C6BA7AD7331CB7129C1A352BB033C331D999BF2596A4BCFCCA5F0CC748367A63B3C3397C133D313DE98DFC11B73B973CC394657B05D6D522FB79E5B8F52DD766E3BEAEDA6BAA9D4C71DE98EA4BEF0D8A4C163D30F1E9B74786CFABBBBDC5D34C0FDCCFD8C064A9B8B0641220F01EDA59D4A6C9BB6620BA7B9D79CCAA2C4AB62C4457BE95DF4A0ED55C62AD97C077B3ED8A62D93F965D119727554ABD002E526B3454C91169C4B8B644486AB28ADE88A5A34F77B2835C34B8FF28727E3E0433C8BEA405D794ED21B1123192AEFFB244F4B543B22B07BE092D8FCF97D6023659966CEC3B3DC25AC71BFCA729B7A8DF02B137F694CD87362EDB16BA02D5FDA35116922EBEB0F6F4026FF9E4BF3E916C819839AD20CF97D35D4D7837316B0BD3983AE8E49A58631CFCB2E8AC6D995D55D56678EB49CAC4FAD4F79CC494ED2C0433A56ED02E0892038C0406EECB331EBE0FD2754CBD8A2FABF5B49C6CAAA8595551B2BAB0E56565DACACFA58594DC6CA6A15ACAC56C5CA6A35ACACD6C0CA6A4DACACD6C2CA6A6DACACD6C1CA6A5DAC51D7C7FA6A036E898CD44B6209267765C9EFD755B5075350C6275A1B624F9B634F8F95E54AF6392557E68A3D6D8E3D45735522CF1E42019414BD6F56F7C7C08B39DC07C4F2E175D92796DC8714DDC19888D31CA3B524C76A498ED5927C4A2DC3542DC3542DC3542DCC4BE6EB56664CABCA394874D7F36EAC292C8A2CE2DEBB4FFAE3B0CAA963953070EE3C06A7D13B72168E38786A0CED7301B44F33689F0BA17D9AC7F6EEC8D97F3406E203AC7C24457D695A8BB8B45E18316571361FC0C32457E1082B6F1A56D874ACAA05E0C70DC22F69B0E67A8642AC2D9F3B6731373F9F3E32966894C9B34F33DBCCE6717C95791573469159C4D6DB0DE60DAC116F366FC6578E12A235A0EC08CAAE8DB2EBA0ECBA28BB3E4A6D009DBF2FB28F4BD54DB9E6BDDE5CCFA53E6D3ECDA5BE65BEC5A5EE3477F21C73B7B99BEBFFD4FC944B972B43E52CCDD2B0F7ED5F795ACAF856EE64DD8DFEFA107EE4A591A54CFB359135CCB7725D5EB79659CBB8BFA4973D88D5CE04AC7696C36A6722FCC84958E7AC8875CE4A58E78CC03EB1608778FF717D5A469BAACA3F46F41134CB9D91D5FF916D89EEBD8B9E6D4C3C8A65DAFB4A667D7A3C0DE720709BB54495C66DF637F9CFFFC7B559CAE62CB3F0278E39D9C39F457EF80963E7387F7C02DBA2A1256363CE457CDBCFC1F953E0DCC8EAF41F84F367C0B9B1D5F9378CF38971649F83AFEE63DDFF53DE8D9E45F30534A85C37A6C82A684D3983B33083AB86195C13CC319B628ED91C73CC16BF48569CB8FABD07FE959132DECACCE7996EE24F1C512797F725CA9B6BDEC8E5CD3717FE64AD7872795FD1A93B4B7E2A8DF782C637AA18A2BBB142BF982C7842AAC113D204DE8FA6F07E3487F7A3C54FAA27BA07761FECD2F722EF713DBB22FBD91A3A68EAD1D5C3B32E29DAEAFDA0A28CF42544FA067E46190750C65AF3712EE349336A779D7D19D153570EC2F691AB13C4B3EF433C1F3F6C1E21DB3CC616882FBDFB54557AF7B147F9A7E2F7357AB6AA5C1FB49A5A9790F933CAF806655C6D4DE332A65B337E229DA2F11BDF6256B6FA678CFBEF20A9D6DB32723D78C2BB53EDA914C15BE629F51D427D8F9EC673AAE3BBDFC7BD32DFAB38BC7BB1BBE5C258AA7CBF54BEE1657B8F11F9F5FD0694966C25BB947ECEF478806B650B99E5F510BAD23FC492F431CC914A23A59C2AF1D480673FE0D9FF34AD3D7CDAD61E466B57FC17B4B61FCE4298A2DAF5835A33DF0D7EC88A4BD5E9A816A2E32B5BD19C9FD3463A40C757B67E00E7DF6BDDCBFCD3C096FE8ADF1285649FDDFB33E8C4AD406BE49E879BE0299439B5C8FB91F759C31E881C80BF3C93E746E3CC713C372A314B583ECD33E7B18E59662EA372E60A7305EBC635E61A4A349F309FA0B0F9BDF93D259947CDA354015E4301AF61456BA035882AC1731081EFD084EFD082EFD0B61EE611EA586BAC75E463975D55C4CB55878FAD0630AF09CCC703F389313F580BD53F3F4A79126D2730D680B10E8C03C03808EF7F37B31FE7906B7415A1072B9DE27F3B22A919C178973BE759D2AD649DAF43AB1F5FA159AD721FE57CC9BF41DA5DA3685753C9CAEACCB735B9A70D48CC4A90959563AD2955AD915F54F27E23AD59A35A930CC9DD3426B9357C5BA816F5A0C134936E61F9F512EDD1843C5F48EBA7656993B5B9DA12ED216D93F6AAF6A1F6AD5E4E4FD61BE91DF4DE7AA63E562FD6A7EB0BF47BF487F48D14DDEFF932975EC3DB2BB543FC892FDE733226C9FB0BC3746F2B8FFD7BBC6DC8B90F39A3EFBE8294FD7129FF40CA01A4C476217BCFA3AC2D28EB55E43878528ECDC8F157E4780D39BE3E29C70BC8F112726C478E6F4ECAF12272FC0D395E478E6FE3307B0329DFC5A5BC89944371296F21E5FBB894B79172382EE51DA4FC1097F24FA4FC1897B2032947E2527622E5585CCA9732C50FC7A57C8594A4B894F791A2C5A5EC464A202EE543A41871291F21251497F2315212E2523E434AB9E329BEF4265FE0D795E9CC6341EF93D8D3E7B1A73D788A96B00B25E871657E8094205238775C59EFC69E3E552554F98D8CB293E42D56456A28C911DD8BA2B36D20F783E39B529A5CDD0E7A9AA7419F5C439AF707EF66F220951B4327CEF3E6F1DF16C6744DBD736635E8C022AA9FEB9EB635DACF6BCD3999259F0E9732F9ADCE37D2E49A9F865DE3B29F12BD5BBCC5FCC6EDDEEDFCF6526F39B7F56EEF6E4AF0EEF7EEA772DE83DE838CF9C3DEC39CF351EF51C67FADB796F97883B7912A9C6C476BB22E2E5BDA0CDE5ABF7ECC0BA6748716842DB544936F2C8C4B0BD01CBEE4D9A8D363A9FFBE684289ED0E2989CE110F96433C21219EB022E2099B03EF74C4130E43245116E2097381F1D4B878C2E16A957EC2713B54334E8D0745DA29F1A09A019E91D18384E8410DD18367B79FE0FF23066544DA99220665ACE040440E0C47AC6011E2078AE19F5F8C58C12588155C8A58C195F61BCE515A25A3F5B45710AD1741B49E8568BD6444EB5545B45E7544EBD544B45E0AFA7914D612546C1ECF522437C8531232E35274165F19C7E72F2A6D32BEAFD73E2E2DA08DD2B761774DFD58EAE922F392BCBD3CCAC9DBCF768DE61D94968AF70DDB1A01EF3BB61E82DEF76C1F18DE0F6C0184BC23DE514AF035D682E57D837570D84F609DCABA94F5BAE0B2AC7F5B54DFDDD48BC7D2B7548038BB62927B23CF14CF27E3AE22901B26E4C609517DEE8FEE8F94EC1E758F622FCBFF4D6CDF45BF7CDF26F47565C408461023E82046D0458CA08F18C12A8811AC8938BABA88A3AB8738BA0688A33B1F71744D1147D7127174AD1047D7067174ED9C564E5BEAE474723A5357A78BD385BA39694E1A7577D29D74EAE10C7406D2654E8693413D9DE1CE70FA9D93E964D1E54EAE93477D10599886C8C201882C1C88C8C2C1882C1C8AC8C21188B5CB46AC5D0E62EDF2106B3716B1768588B59B8458BBC988B59B8258BBAB116B772DC99DA93F35B250C61456002D2A831611D0C2022D1CD0A20A68510BB448012DEA8016751153783E620A1B23A6F042C4143647444A0BC4145E8498C2968844688D98C23688296C8B7676403B3BA29D9DD1CE2E68670FB4B317DA998A76F6413BD3D0CE8118EFBD58AD2F56233601F1B56B034BF0DDD0B834A3A5B199D38A4E48DB191ACC6919B1349D469C662790DCE512C42E1703BB5C12E0512D274FBC6239FB49E4531E497B225FB29CDD1BD94B1523FB23FBA9923CD98C65EEF791C32C9D8F468EB1F6D64C8D5CACDB7A58B1953BEDDEE491BBCBDC4555B0AFAEAAD5D86A4CD5B023B8BAD5D9EA4C35C0F535C1F5B5B09A9F82B5D1DA18017510F9781EC641038C83861807E7631C34C2AE9B66D86F7321760437C78EE01690C36D303E2EB69F6509DCC17EDE7E9E3A62AC74C258E98AB17229C64A778C95CB30567A813FFA813FD2C11F03C01F83C01F19E08F51E08FD1E08F6CF0472EC64A3EC64A11C6CA048C9589182BC5182B9330562663ACFC1E63650A8F9531F407A7D029A219CE046702CDC46EE53F39B39C5934CB29714A68B633CF994773B067B9047B96E73AB7F3D89A87B1B50863EB168CADC5185BB7636C2D03CFAD04CF9582E7EE05CFDD079E7B183CB70E3CB71E3CB7113CF73878EE19B791DB889E75DBB86DE839B793DB899E77AF70AFA0CDD18838CC0C3E9672D1DBC73361F20EF3DC50F37E94B33FEF98CFF68A1FE01990E18778FE95E097F7CBE39CF213F691A3FFC3D8F398843D8F02316315B1F3BB12B8A032760547B0E7DB469C988B1EF6D1C3C9D17D558EC77D520B7D721EFAA42EFAA43EFAA421C6EC05D817DE0CFBC2DB214EAC3DF6855F0C4A77C0BEF08E8819EB0A1A77038DBB635FF8E5CECE588C735F502B0DD44A07B506805A435DCFF528C37D8469232380BB9FCDF802CF9703CF97476B13C1F361F07C12B8BD02B85D80DB2B82DB2B81DB6D70BB035AB8A085076EAF066EAF050E4F0187D70587D703873700879F0F0E6F0A0E6F090E6F050E6F030E6F070EEF046A760335BB839A97819ABF0387F70687F70387F707870F00870F04870F02870F06870F01870F05878F00878F02876781EED9E0F01C70782E383C0FD41F03EA8F05871782C32781C32783C3A780C3AF06875F0B0E9F0D0E9F030E9F0B0EBF1E1C7E13FAEC56F4D962F4D9EDE8B325E8B3BBD05BD2C3ED9EAA43D8CEDBC93AFF90F923F36015AB09CF9133AD1C6AC836DF346A060D7311344C4B689856D0306DA061DA423FB4837EE804FDD019FAE112E8872ED00F5DA11FBA413F74C7CEAC1E6C117E4F437FB2A5619D46FF655A2399BBB2AD6CE62B39BA1231BA92807505602D807545605D19584780B509AC3D60ED03EB64605D05585705D6D581B5F45D249CC9AA834D16844D66C0A60AC566A8EA4C2A9C021D8C4C8FF05C30F24CE419D2ACEBACEB48B74AADD27316C9558663999D2D637D2A45664558C3466E88DCC06D7C21F202B7716B642B5BAE83CC416CB90E3587B2E53AC59CC23C738D790DF7DE6C73365BAEB799B7B1E5BACDDCC636E776733B85CD3DE61E4A320F9807A882FFA4FF2409FF05FF059CBB712EDBDA56B535112B8EDF99DF1159218B6704D61C6B0EF7C70A6B05CB72896F10F81ABF117CC3B0B24B22258CC796C816C6F706EB06C6F75BEB3BC6579E146960161B3AC7F896F17B92E4F7F87523E018008EC1738CA38A21D6E4B70AF4C89CC8B93A71E4649AC99963D01C620E616978B57935D3EC29FF29D2FD17FD17CF998CD012FAD36EED25ED15ED0D6D87F6BEF6B1B6473BA01DD6490FE9497A44F7F49A7A5DBD89DE526F2FBF33A4F7D6FBEB43F54C3D4B1FAB17E993F5E9FA2CFD7A7D81BE585FAA97EA0FE86BF527F5E7F42DFA36FD0D7D87FEBEFEB1FE95FEB57E98A7E9A14052C00A2407AA07EA041A052E0CB40E7408740DF40CF40D0C0C0C0D640672020581E2C094C0F4C0ACC08D810581C581A5817B02F7051E09AC0F3C19D8147831B035F06AE0ADC0CEC087813D81AF033F0683C1A460A5A013AC1A4C09D60F3609B608B60D7608760DF60CF60EF60F0E0D6606F38245C129C119C1B9C11B830B83B70797074B830F045707D7079F0C3E17DC12DC16DC1E7C27F87EF0D3E09EE081E061838C724625C333AA1B758D864653A3B5D1C1E866F432FA1B438D4C23C7C8372618938D69C64C638E71A3B1D0B8DD586E941A0F186B8D278DE78C2DC63663BBF18EB1D3F8D0F8DCF8CAF8DA381CA2502894148A84924329A1FAA1A6A196A1F6A14B423D43BD43FD438343C34359A1B1A1A2D0E4D0B4D0ACD08DA15B424B43A5A10742AB43EB434F869E0B6D096D0B6D0FBD13DA1DFA3C74207438414F484C882478093513EA273449B830A16542DB840E099724744BE8C57CD4CB5B089803C83ACC8FA6CE04CC055CCA63947378EBF06B2CE072C07CC0BB016F43AE31AABC65EA9DE83DDB5B84D40701A703DE8FBF5C83FCA90AE6004A2C52F134133017506291AAB0480516A9C0221558A4028B546091AAB04845EDA90A8B5485452AB0480516A9C0225561D1CFCBE69AFBE16921A7F36F953E117039E064C04580CB906B2272A5E3ED743CC9B7D3D5DBE9783B1D6FA7E3ED74BC9D8EB7D3D5DBFDB9ED9ADF1F4FD9806C43C854EF0EFE35007F1D80A76C40F9D701F8ABE60FE49481DE5580530097031601CAD207797980CB39F7203CCD032C049C04B80CB004703697CE907345EF13D47D91BA2F55F7495CDE607E63306A1F8CDA07A3F6C1A87D306A1F82DA87A0F621789A075808380970196009A0AC7D88AA7D88AA7D88AA7D88AA7D88AA9DAD453FD3BB16F02A4049EDA1C061A8771DE0F59C6F183F8D44BE91C83712F98679AB00AF03BC9E6106D3372021289B8194992A651D7E8D51BF16E17E95F7277597655F89B7AF546F5F8994992A651D7E8D51BFEEC43DFAF695EAEDE1DE06C06B006700E600CA11311C4F8B00A7C57E4F075C0AB81C703EE04D808F71E95C1E701DAEF87F046A19815A46A09611A865046A1981A73B01A7C57E4F075C09B80A703EE04D80B2162E0F6D1A81B69D3A82969F61D48C066F8C066F8CC6D33CC042C04980CB004B00256F8C56BC315AF1C668C51BA3156F8C066FE87E16CACE42D959789A07580818CDB10CB00450969DA5CACE526567A9B2B354D959289B2557B28516CA3B6461B22D25894A4D55A9A99C2A258A940B7274CB312CB94AF206F748B28BB247E07EFC5471B96FD1C6E9E10DCDCFD81A6D61E9563275B1BA58FD69284E0F2FB00AAC629A84D3C3A7210E73364E0F9F8FD58CBBEC07EC4769B53BC95D401B7192F8F6E82926384FFC1DFF657F1BFDD3FF074EF57F9D2DB0F76081ED224DCBA414B5532A93F268024DA3597423DD424BA9941EA0B5F434BD48AFD03BB49B3EA7037458935F0FABA4799AFC86E5855A6BAD93D643EBAD4989D0DB5FCE2DEBED8DE17B90EFCC072A65B94A1913F754F6B77C75CF55F759EABE40DD67F892AA7DFCBBF8571F2EFB2E7EBF0FCA8EA62C572963E29ECAFE96AFEEB9EA3E4BDD17A8FB0CBEEB7E5FD4D4D7CB56F745EA1E6D47DF583BFA027BDD4FC3AF34953F4DE54F53F9D362F9D3A2F979CE244F8B279C9A19C6A99955FFDF9EFA2FB2A7A2F22E1B12351B12351B4F33017301A51CC956964C362C996C488B6C5832D9B064B261C9642B4B261B32335B5932D94A9267C392C98674CE862593AD2C991C0573002516D1A79980B980128B1C85450EB0C8011639C0220758E4008B1C8545B4F61CAFEC1EC5220758E4008B1C6091A3B0C88545948B272915739536C885EECD456DB9B0887251522ECACD559A210F6FE7E149BE9DA7DECEC3DB79783B0F6FE7E1ED3CBC9DA7DE1E038B690C9EB201A5C53446D95363F1D7B178CA06947F1DABECA9719C320E56C2385834E350D7385834E3507A3E344B3E344B3E9EE60116024E025C06580228354BBED22CF94AB3E42BCD92AF344BBEB26864BD577951380570396011A0ACBD00B517A0F6023CCD032C049C04B80CB00450D65EA06A2F50B517A8DA0B54ED05AA7659C62458239380C32450BB103814C24E2A843D25B1998C7C93916F32F215C13A2842BE22D853E361118D5716D178A4CC5429EBF06B8CFAB508F7A845345E594413F0F604F5F604A4CC5429EBF06B8CFA7527EED1B727A8B727C2D299084B67222C9D89181113312226E26911E0B4D8EFE9804B019703CE07BC09505A3A13953D3551F17F316A29462DC5A8A518B514A396623CDD09382DF67B3AE04AC05580F3016F0294B5142B7BAA58D953278FA0E567183553C01B53C01B53F0340FB0107012E032C01240C91B53146F4C51BC3145F1C614C51B53943D3515654F45D953F1340FB010309A63196009A02C7BAA2A7BAA2A7BAA2A7BAA2A7BAAB2A7B295E594AD2CA76CD853392A3547A5E6C09ECA855C90A35B8E61C9559237B847943D55FC5F694F952A7BAA34664F952A7BAA34664F95C6ECA952654F952A7BAA54D953A5CA9E2A55F65429497B6A95B2A756C5ECA955CA9E5A15B3A756C5ECA955CA9E5AA5ECA955CA9E5AA5ECA955CA9E929CDD1735497BAA54D953A5CA9E2A8DD953A5CA9E92B8A4E1579ACA9FA6F2A7A9FC69B1FC69D1FCA7B5A78E47B7C93DF61BE147ABF82FA2DB4E8C8FFB6D44E9C96F18D6F1AFF6AFF1A7F97FF0A7FBD7FA33FC3FFA33FD3FF9B3FCD9FE1CBFC49FEB5FE75FEFDFE0DFE8CFF3E7FB37F90BFC9BFD85FE22FF16FF567FB17F9B7FBB7F87BFC4DFE83FE6DF89D2B77A5F71E975FDBA545BC55655573130D15F9594D7B1928C82E19AEFA4E809827191F4883F7F4C62A825F987925D4DC00F5937FE0B8C5A349A5AEE4C6A1A4B397D44BEDC037AAB7F076254CEF0ED14EEB510F5F5CA792934D06BE0B5A7F15E072E61363059095A1D9298601747192697A87A23314C9AC452CE8409B7F857C7A38C22E6291431FF178A5CE35FFBAB635216FB60C530E9194B39D36E0983396E0673CC4C7F265367AE3F9771BBDEBF9EC7DF8DFECDF0D9FFBA380E5418D9311CBBC652CEB8A38347C774C6718E3F87F15AE82FE49425CCB9C6AF8E5D9EC2C58961D73F967226EC1278C4FE91B1FB933F9B2958E2973076D7F9D731656FF06FA0901CAB9C67B17F3B76D5FF1AF89E3BA9E1FE42A9E19D3246BC732435FC53A4867F4EA446F22914493E4752A3CA2952A3CA6F4E6A543D456A54FD0D498D6AA7488D6ABF21A971F2BA6375D84BEF7AEF326E47BDA3D23B0B1FEA14B6FC8388959DCD56BE1CFF41ECA56C191B3FD1B4B2EF4D474B93FB3D34539E9CA0D95FD0F1538DE48951E5CF88BD1EC37E00B02F02F6B340A57B4E590D97BBBB42389F92ECFEF22B87DE13DE13DC86A7BCA7C8F09EF19EA190F7ACF72C2550F4BB69678B7B2D603A156F1DA0D8594C661D3ABBEFBD25A8D39E5A520F96CCF274BCC1AAA604554F559C4155D60E7C593AF21E6A2A90102DD5EC41143B01CADAF08BE8C6E63265D1582AA2C93C23994C33D5F9544BE8EEB85FF792ECA34714AE2630EC44DDE872FEDF97C75C068D62DE2E88FB555CF60D36ADB6C4D2C137F9CC71C0F88F712D194CD153AC62ED31F185F7C8FBC7A96BC96FB4E988BAFA652D1531EC32806D31B738036D2CE0566AEA542E99AF8C135A725FC99EEACF4F4379DED6837254AB7086965922A1B7FBE4F6986B80776E0CEF683F49F822FE9EA9E8F06BF55C11B744B663013F2DE619E53DEAE93E4E7D84EB5A7F4ACF75E2BE93D418CE4FD152A24F9339759A6AE379BFA48DF81A61599FFE3AED8DDA1A754EB135EA022BD4618FE43A3C2A6F17DA45F6787B823DD12EB627D993EDDF4BF98AEFAC92F5476B1605ED76763BEC5B956548ABB76A742FBF568FE2BED6E445002F229CEC866F3ECA2F96CB2F40464F0D965F615CAEF0A88FFD26A3F89227075F1F971A641E92971CC3C571E906F355F48A3B8F0E7F09313E655787382D569FCEE69BEA5AE552C095AA7D93F9AD69F2DB3AFCA3EC6C0B79EE711E5FD79F90DA8B71ED87ABF884F4968C6B7B75659CF097AA8C6B4AECEAAAFE16C5E1AC70F5E4C978F20B19EDD568EBC75271789C548A9749F7D243B4961EA74DF4226DA55771C66AC0BF8FF44816600E602E60016011E078C05DFE43A49B8EFF00C33AFE830C9BE3F952C027005FF7EF677848422B53BE65A1346BB67CD7DA20F3582F4A68F796E9761FC074F9573B4F3E3B4980AF4AE8D69339C9036750242B9225A55D2457621729A0A0FC723B8F835D915D94603AA643E5CC3AAC4DE41E8FE694685ECAD2308CFD8C493861AE024EBF10D8BD5811BB172B59B3ADD954195F2F88582FF2D833EDDE761FB2702EB363E7D979E4E2E4480F5FE1F0B19331193A2E84EFF9CA6FFC5EC8522110D9EF3FE43FCCF783D1BB99A9EEE3A2773F83EF8F488F2CDF1F45BC998C79A7C8C1C8417C2B2B1327E48E43CE0CB652C6FBE371EE601D8C1E79F660D05FC3E537C5798A417F35B7DFF17AE35442DD1E600F535A5C9E9C1DACF032E97A58F2872E3D105B6884B65FFB56FB41AD8455D61DBD8A5E5B6F10B8CC18698C36B28D5C63BC31D198246A89DAE23C514F3410E78BC6E202D14CB4102D456BD156B4171D44277189E82A7A880C314A64891C314E5C250AC5443149FC5EFC415C2BFE24E688B9E206314F2C100BC52D62B1B85D2C114BC57271B7B847948A7BC57DE201F1907854AC11EBC406F19878423C2D9E15CF8B17C45FC45FC5DFC4CBE2EFE21FE235F1BA7853BC2DFE29DE135F8A7DE280F85A7C2B771A68FBB47D3C42BED1BE214D3BACF11C4D3BA61DA3806EE80605F530B7D9D02B719B43BAADDB94A027EBC9544E4FD153A8BC5E5FAF4F8981CB029751D8C8343229C918658CA20A46969145C2C83172A8A25164145125638231812A1BC5463145444D51934C912252C81275441DB2455D51971C515FD4275734140DC9138D4423F24513D184924553D194AA88E6A239551517898BA89A68255A5175D146B4A11AA29D684735C5C5E262AA253A8A8E94223A8BCE545B74115DA88EE82EBAD3796298184675C5483192EA89D16234D517D9229B1A88B1622C3514F9229FCE1705A2801A890962023516C5A2989A88C962325D20A68969D4544C17D3A999982966D28562B6984DCD458928A116E27A713D5D246E1437524B7193B8895A899BC5CDD45A2C128BA88DB855DC4A6DC56DE2366A27EE1077507B71A7B8932E16CBC432EA20EE12775147B142ACA04E62A558499DC52AB18A2E117F167FA62EE27E713F75150F8A07E952F1887884BA89D5623575176BC55AEA21D68BF57499D82836524FF1B8789C7E279E124FD1E56293D8445788E7C473D44B6C169B2955BC285EA4DE628BD8427DC44BE225EA2BB68AAD9426B6896DD44FBC225EA174F1AA7895FA8BED623B0D106F883768A0784BBC4583C43BE21D1A2C768A9D3444EC117B68A8D82BF6D230B15FECA70C71501CA42BC537E21B968E3A6B3F43CB324CF143E868B98E52D26AC3B461CC59A335D6BCC10D41B60B434742472850AE43B90E9869B106D3F2423BE468D37243F2AC5D1E6941390BD102F29BCEC99418B48276D009BA412FE8079383558255837266A205AB07EB6126CF65E817EB5203E87A3B7DA84AF99D3E162997E9795CF6D7F49DDE54BF486FCD39BA705AAADE47EFAF0FD287EAA3F43CBD207160E235FCF7D35E89379F787129275EAD4FBD12379C7871ADA7BFBA9C747563DC4EBC524FBD12F79D78715BCE7085E79C78719B4FBC069DEE0A3F78E2C5543AF1CAC075FCF7A893AE6CBEF2CE70159CEE0A1F3DF14AAA74D2E59F74A59C78A9F645F14509CC054DF4667A336690967A4B96D86DF436CC0DEDF5F62CD7BAEA5D59AEF5D47BB25CEBADF766B9D657EFCB726D803E80E5DA607D30CBB561FA304AD447EBA329AC8FD1C750925EA8175285C441898348244E4B9C46151367272EA04A890B13EFA0AA892B13D7539DC48D89CF50CBC4BF26EEA50E89FB130FD1E8F0D4F06C1A172E09CFA729E1DBC30FD08CF043E175B428FC4CF86DBA33FC6EF85DDA187E2FFC1E3D16DE15DE458F873F087F404F843F0A7F444F863F097F424F853F0B7F464F87BF087F41CF84BF0C7F499BC27BC37BE9D9F0FEF07E7A2E7C307C849E0F1F4B0AD1B6A4CA49FFC3DEBD804951DC7B1FAF9AE1B6CBB2CCF46E57758F088888885C159508A241450544838078436212255150A318A3A0881E838608981E631C6BBA4582C6FB5DA3C618638CC9C9316A8C518388468D315EF112F082A7EABB0D5994C79C933CE735EF39C5F3F0AB9ED99EEEDEDE4FD7F4CCF4D43F128F37559AB612AB9AB66E1A205E6C6E68EE2A5E6BEEDE5C166F3647CD15F1F63F775E638F8791FF408EF887F2807F2445B1F1D2C6E54234DEDBF8A068685CD75532CA98ED554A6E5C56593A35BF35925B03DB6E756CD8F85AA227FD076703A5EB45A13481A91BF2A942E984D275EDCF094AFBD8FBF6718F6619478B263722C9C6576BEDF772A1D4B7DB309BDB9183C99DC89DC95DC811E4E7C85DC9DDC883C8C35C8ACEA5BE25FB9AA3B45DC99ED596069706BB2595ECF95269B7D26EA2A17450E920D1583AAC7498E8CAD97DF3C691A437BC466EFF0AF99FDBAE3DC9719FD8C686BFB38D7B96F6B4DB38AE344E74657B9BD8DE6EAE5F1767CB2619C848F6947DE5003954EE2C47C931725F39514E9687CA19F268799CFCBA3C559E21CF91E7CB25F22279A95C26AF94D7C95BE49DF25EF980FCB57C543E2157C9E7E5CBF6ECE65DF941A150E852682EB4DA731777B5D2C0C20E56D968DB138CDB78BDD2CCC2ECC2C985D336B95E6979E1AAC20D85DB365EB1F458E129AE587AA5B0A6B0B6B0BED8A1D8582C1555B147B14FB17F7170717871D7E21EC5B1C5095CB334BDF8E5E2D7B866696E71417161F1826252BCA498155714AF29DE54BCA3784FF1FEE2AF8A0F171F2FAE2C3E577CA9F85AF1EDE27B1D44874E1D9A3A041D2251E8D8D06D287F1F97DB90FDC86DC9FEE476E400727B722039881C4C0E218792C3C81DC81DC9E1E44EE4CEE42EE408F273E4AEE4487214B91B399ADC9DDC83FC3C3986DC93DC8BDC9B1C4BEE43EE4BEE478E23C79313C889E424F220720A7928791879387904792439833C8AFC12F965F22BE431E44CF2ABE4D7C8E3C859E4F1E409E489E449E41CF214F21BE4A9E437C9D3C979E419E499E459E402F21CF25CF25BE4427211F91DF2027231B9845C4A5E487E974CC82A7911790959232F250D59275332232F2397919793CBC915E415E495E40FC9ABC8ABC96BC86BC9EBC8EBC91BC81BC99BC89BC95BC85BC9DBC8DBC93BC81F917792779177933F26EF217F42DE4BFED4A5083B36D89E56D8DEC5F6C7A589A58962406992ED3FB62F4D294D11834A87968E10834B479666881D4A4795BE2286978E297D4D8C281D579A2546958E2F9D2846974E2A9D243E5F9A53FAA618533ABD74BAD8A734AF74A6D8B774566981185F3AA7748ED8BF746E69A198585A54BA487CA1744969B938BCB4A2F453718C70A3D56D5B7EB7FCD7F2DAF2BAF27BE5F7CB1F943F2CAF2F7F54FE53F9A5F29FCB2F97FF527EA5FC6AF9B5F2EBE53736DEF766794DF9ADB6FBE2BDE3B1F13EF1BEF17EF1B8787C3C21DEDFBD97BDC97B12E794BF93BF27D1335FDFD3E555E567CAABCBCF969F2BFFB1FC7CF985F28BE587CABF293F5C7EA4FC68F9B7E5C7CABF2B3F5EFEFDC6FB9E283F597EAAEDBE7854BC5B3C3ADE3DDE23FE7C3C26DE33DEEB53D727E568B1ED7FF3BC6095785EBC2CDE10EF8A0FB846A459B6CA8AEC2DFBC981EE3A1151080AE5A7C955E433E46AF259F239F28FE4F3E40BE48BE443E46FC887C947C847C9DF928F91BF231F277FFFA98F7D827C927C6AF38F8D4791BB91A3C9DDC93DC8CF9363C83DC9CF62CF762CBE42BE4ABE46BE4EBE41BE49AE21DF22DF26DF7159FE3A7912793239873C85FC06792AF94DF234F2F44F7DEC42F23CF2FCCD3F361E406E4F0E24079183C921E4507218B9C3A7EF59FBBF988F07570844F9089BC5F20C9B1DCA5F749F11978FB0F789F20C7B4B6E7A8E174E71EFC73175483E5570F518FEDEB95C38DB5DC317724DA5CD39EE51EE1A309BDF2617D9FBB9CECFE689A49B872BE36C7E9B5C243E3E82AF7BB7B3A16D54BB4DD65B088F8B2439CF6D65F443A6E79267720FEF2B466770CF1272A95B7A707C70A210C149C1A9BC3BEC464E3B36E4957130D3FEB69CFDB6FE84F7C2AF6E7F5E6B6F15CA2772FFF56D739567F30EEA896DB7C263F277D4DB6EF1694970BCBD75A9181F15A262D421EA18758ABA440D5163D4D58DBCE5C6DD8A5AA2D6288C54144795688BA847B4A51B7B2BEA136D170D88B68F064683A221D1D068981B79CB8DBBE546DD72636EB911B7DC785BD17ED1B8687C3421DA3F9A181DE0AAEC4693A283A2C9D194686A7470342D3AA4D2A9D2B9D2A5D25069AC3455BA559A2BDD2BA54AB912545A3EB3ABA6868A306A8ABA4781AB3312F58CB68A06473BB8AA22D1E7A251AE9648B497AB22E26A8854DC77664BFF73B54FA850D29A7F72D02D9A8C83727044EEE0463EAF70D70BF417659DEA4C5FA697E9CBF572FD03BD425FA1AFD43FD457E9ABF535FA5A7D9DBE9ECF76FFE9D171EC529A4507371E98FDEFDE8F6C1B6B4830D6906494A102A30CB95767CDF8B432ADB50DE2DCA36BFA5246ECF9B47AE60571A1181B3E1EFE3E7C227C327C2AFC43B8327CDAD59F0F5787CF86CF859787CBC31F842BC22BC22BC31F8657855787D784D786D785D7873784378637853787B784B786B785B78777843F0AEF0CEF0AEF0E7F1CDE13FE24BC37FC63F87CF842F862F8D3F04FE14BE19FC397DD680EE1ABE16BE1EBAE867DB8267C2B7C3B7C277C37BC2FFC59BC327E9AEAB6FFFB2BA64B314274749564446F6BCAFE0DC3C7A9A95C0C57E6ED7379FBC7B6366EBBFFD32A9F4B79A9D8924F0BA7D957B02788B962A1484426AE117788FBC5C362A57849BC6D7134D957907DEDABC751F695E364FBAAF138FB8AF11CB9C4554577EB603D1DC327DB4D3FD56EFA0FEDA69F6E37BDAADDF433EDA657B79B7EB6DDF40BEDA65F6C37FDA776D32FB59BFE73BBE997DB4DFFA5DDF42BEDA65F6D37FD5ABBE9D7DB4DBFD16EFACD76D36BDA4DBFD56EFAED76D3EFB49B7EF76FD371BB7D12FF6D9FFCFD9AF352CEB6CF6DEEF3EBE9F61976369F78FFEDAAE3EBC46D5C75FC9078DC9EFBBC285EB3673EEB65277BDEA3644F7BD63358EE2C47CBB172A29C2AA7CBA3DB79FA7DDE3E91B74FE6ED5379FB878FB97B3A6F57E5ED3379BB3A6F9FDDBCCFF0F9BC7D216F5FCCDB3FE5ED4B79FBE7BC7D396FFF92B7AFE4EDAB79FB5ADEBE9EB76FE4ED9B79BB266FDFCADBB7F3F69DBC7D7793E3A618E7BF57DBDFC49D01D8E3E85D21ECB1B34AD8FE54BE688FC27F7ABFCBD9F21479863C575E202F9275B9425E276F93F7C807E443F271B9CAF66117B46D45B0386F97E4EDE579BB3C6F7FD0D6B6E63F6FFD7EDEAECBDB0FF3767DFEDB36E66D73DE76CFDBC73FB697FFDAD6AAA6BC8DF27650DEEE9AB723F37654DE1E90B787E4ED11793B3D6F8FCDDBE3F27656DECECFDBF3F336FFFD55FEFBAB4BF3F6C6BCFD71DE3E9AB7B94295FF95759AB757E4ED0D797B7BDEDE9BB70FE6ED2379FB44FE57EF9BD77470D5338A8C2AD389919B3A339E4C176AFB355097AD2B633635D1DB3653DBAF3BB5FD4A7C425BA6B65F406DBF16B5AB1A255A19734633CE4C446DBF581DAB66892D18B3A92795DD7A314E536F6AFBF5A1B6DFD6EAC7EAC7A22F9FF76E439DBF7ED4F9DB961A7EFDA9E1B71D35FC0650C36F7B7DAFBE570CD40FEA07C520FD887E440CD64FE827C490B6EB47ED16AE0DD785EF85EF871F841F86EBC38F94505215545175501D55273766926A508DAAAB1B374935ABEEAAA4CAF654AA45B5AA5029A5E367E2D5F1B3EEECE1D39F81793EECC6F36133CF84659E09039E09439E0915CF84BD78F6DB8AE7BDADDBB6D2EEBB5855D416AA87DA52F554BD546FB595EAA3B6567DD536AA9FDAD68DDDA406A8EDD54077B58A1AA286AA616A07B5A31AAE76523BBB51B1E2E7E23FC66D95A9DCD85482B1A92463531583EB825BEC56DE16DC6EB7D25512EBD66A5A53FB3774A34F95A94C153006551896C3D86E252371C5F7C53FB35BE96AA5B8AD1C285AC2B3C205E1D9E139E1BF85E786DF0A1786E785E787DF0E1785DF092F0817874BC2A5E185B1AB375A68AB55C258EC01D70F96C2EF8649580D2F0ABF175E1C7E3FBC24AC85978626AC876998859785CBDCE7748C8924ECD46C315C7DE4C626D5055DD41D7447DD4977D65DDCD8A4BAAB6ED2DD74B3EEAE4BBAAC03DDE24629D54A6B1DE95857F416BA871BA554F7D2BDF556BA8FDE5AF7D5DBE87EE1FDE1CFC307C25FB8D14FC387C347C247C3DF3206AABBB2660B579FDD9EA9DD23FA87BF0A7F23DCB55A89D8477F439FAABFA94FD3A7EBB97A9E3E439FA9E7EBB3F4027DB63E476FABFBEBEDF400BDBD1EA807E9C17A881EAA87E91DF48E7AB8DE49EFAC77D123F4E7F4AE7679FF1EFE3AFC8FF0A1F037EDD7AB0F70E3A7EA49FA203D594FD153F5C17A9A1B3F551FA60FD747E8E9FA483D437F511F153D1DAD8FA3F82BEE3B50A2A1B59BABF4C196F6B1BFD12F457FC69B1A1CAD8C568A31D187D18762CFD8EE067B5675487C88D83B9E1DCF1663ED23E78A917AA41EA577D3A3F5EE7A0FFD793D46EFA9F7D27BEBB17A1FBDAFDE4F8FD3E3F504BDBF9EA8FF4D9FABBFA517EAF3F4F9FADB7A91FE8EBE402FD64BF4527DA1FE921BD7551FAD8FD133F557F5D7F4B1FA3837AEAB3E5E9FA04FD45FD727E993F51C7D4AF44C2CE24A7CB4FB7695ED4386B8FDDBBA5FEB54D16AFF5EFD441F46B0DD99116C776104DB11F161F161E273F109F10962D7FC4CFDBB3AD1557D91F8645D71F7D3EFE98BF5F7F525E2E315400A72AD58A7DCB85DA3D46E6AB4DADD8D6FA6C6A83DD55E6A6F3556EDA3F655FBA9716ABC9AA0F657136D8F749C9AA566ABE3D5096E4C3375923A59CD51A7A86FA853D537D569EA743557CD5367A8336D6F76A0FA829AA40E5293D514378696EDC7CE520BD4D9EA1CE5C6F7FB965AA8A6D9DEEE5075983ADCF577EA4835437D511DA5BEA4BEACBEA28E56C728373EDAF9EADB6A91FA8EEBF9D412B5545DA8BEAB12555517A9EFA98BD5F7DD689B6EAC3ADB271A5557A9CAD4656A99BA5C2D573F502BD415EA4AF5437595BADA8DA2A6AE53D7AB1BDC486AEA66758BBA55DDA66E5777A81FA93BD55DEA6EDB93DEA37EA2EE553F55F7A99FA9FBD5CFD503EA17EA41F54BF52BF5EFEAD76EA435F51BF5B07AC48DB6A61E53BF538FABDFAB27D493EA29F507B5523D6DFBDF67D46AF5AC7A4EFD513DAF5E502FAA3FA997D49FD5CBEA2FEA15F5AA1B8D4DBDA1DE546BDC886CEA1DF5AEFAAB5AABD6A9F7D4FBEA0337329BED9D7FAAEFD33FD3F7EB9FEB07F42F6C3FFD4BFD2BFDEFFAD7FA3FF443FA37FA61DB673FAA7FAB1FD3BFD38FEBDFDBBEFB49FD94FE835EA99FD6ABF4337A75FC42FC62FCA7F8E5F82FF12BF14BF1ABF19FE3D7E2D7E337E237E335F15BF1DBF13BF1BBF15FC53F5FFDF74E71E87F43C327FFF67FFF2FEBFEAAFFF41ECDF7C4AB762F6CF8CDFFF1FACEFE77FEBFF03BB77D8BD0559428946707FDC85DC486DAD39BBC27DAEEE736DBAA1E6FA612F2C6F757EC29DF4EA2ADE6B1BBCEB2D3864A1BBC27E97E5A2187E773BA9C4E1E49CE109BAF88DC6E8B837EE5D976DE3EBCABD8560D99F7A0821D445BDDE2CDACB7F595600B9B1FBA0C9BC95E2ED511E4052EFFAB95870BD3C5F87FEC3D77FB3A682F394E1E685F091D2E8F9233ED6BA193E56972BE7D35B4485E282FB6AF8796CBABE40DF615D1DDF23EF9A07D4DF4987C6AE3B8196BE5FA42874263A15450851E853E85FE85C185E1855D0B7B14C61626142615A6D9BDD1C97D7B3CE84C76211BC846B289EC463693DDC9321990AD64486A322263B2426E49F6247B91BDC9ADC8ADC9BE643F721039981C420E2587913B92C3C99DC85DC811E4487214399ADC9DDC87DC971C4F4E202792079093C883C8C9E414722A7930398D3C843C943C8C3C9C3C829C4E1E49CE20BF481EC577F5D792EBC8F7C8F7C90FC8F5E4472E2B829464812C921DC88E2E3F9B71EFFEC54D27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D78D39B356D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306DBCE9CD9A4E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AF5A6376B3AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E9CC9BFEA4E9A8E046B78A8A6407B223D989EC4236908D6457B21BD94C96C832D942B69221A9C898AC905B903DC82DC95E646FB20FB91D3980DC9E1C480E22879043C961E48EE47072177204B92B39921C4DEE4E8E21F724F726C792FB91E3C8F1E404727F722279007920F9057212791039999C424E250F26A7918C485C61DF563A93ECE10A7BB8C21EAE3491ECE10A7BB8D29D643F57D8CF9580646F7F26B509FFD54D1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B4C1B6F7AB3A6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BA8EE93AA6EB98AE63BAFE5999A69676A30844315811CD8C6EA33DC6B6EEDDF2AB5A8D9072A5D8891143E68A0562A1B840249B1C03F78907C5C31B8F803562AD14B2936CC27F9F7CFCC60D57F46CF84E559BFD857289959FC92BADFB3BE4BD6DEAED5A57F0CED20A377AA8CD39E439E449643DDFD65BB9750A9991A792CBC8CB986B4EBEAC347F4C9AFF7E55EEBD969C4F5ECD4FE6E5F31F93CFB7E156DB36B4DD776BBEC60D4B72ED896EC455DAB3DC4FE3ED98671EF72DC8E79999B76EB455AAC9DBE9B6ED38239F763F9D9FDF576FB79625F9CF96E66DD58D8DCAD65637D98A8FCDD7366A282DFBA7A2FEF6BBE5638376E1CA1D115C11DCEEAE8A6ABD4CB4F2C9D0967C323498CF8486F299D08E7C26345CB83AF7AD7CC7CF5D313E6E936FF89DC2F70C16592197888CB13D0B2D47B9B1696DB22F5BDC39BBBB75ECC6B6EDDED9E457C973C90BC9056E5C0596302B5FC22C1E392B5FC2AC7C09B358C22C96308B25CC6209B3DC126CFBA596E3846899DDF20D6BDD8D3CD468DDF716FDC4C076DF559C6CE73BCFFDAD6D5649B7DEF3F2F59E175D6C73313F5FCCCF17F3F3C5F9CF17BB9FDBF6FC960BEC9A96B4248CFFF0995CDBFFFFFC885DCA71B29423762947EC528ED8A51CB14B396297D2BBB85BA79019792AB98CBC8CB9E6E4CB4AF3C7B4B58CFE6BDB6BC9F9E4D5FC645E3EFF31F97C1B6EB56D43DB7DB7E56BDCB024D7B61DB14BF323762947EC528ED8A5F68835F9DA4DBE4DB61F0C963247DB769C914FBB9FCECFEFABB75BCB92FC671BE6311CB14BDB46336EB7151F9B2F3F6297E647EC528ED8FC77DB78C4B65D717761B08C2BEE2E16ADAD6BC32EF6887557870D8E7F12BB4AD7BF8D7F6B8F58778D983D6265CF7CFCDDA98CE43453CC16278BD3C4FCDCC68663757367345687582F3BC8465972A33B06ABD9BFABD9BFABF98EC86AFEC6ABE9B556B30F56236035BFC16AFBB72DBAF9F35B33C994BC9EBC893C87FC11F3326A7BB026CF63C879E4496495AC9373C88C746B5A93AF690D6B5AC39AD6B0A635AC690D6B5AC39AD6B4ADC94EB9EAA622783678D3FE95DF6A29F0ED944F7C2ADC9272ECA76E9D36EDF25B2EE79ECBB9E772778F6DB39665F6F85FDEB282CFA14FDBF89DE84D8FFE0D7F8542CBCD2CE36637F2BA9BA62FB999A5DFEC8E149B2791991BA58779EF62DEBBF279EF62DEBB98F72EE6BD8B77320A2DB7B4DC69B7E4EE96FBDC586FB2D9F677AE973B902BA237F4D773F95ED8E67A8887C46362A5784EBCC435BA9CD5DA65AE73A3D1B7AC63AA66B7621D6392BB5B73C88C3C953464CA5C73986B3D8F5ECF947BF4FAFCD1EB7934EFD5D83C953464CA5C73F275CCCCB7A06D7D6EB933F3C7CFCC97DEB62CF79899F9636AF9DA363C92B9A8EAF892DD3B6E4CA1D696F75A3E1461CB47AD52C4AE02B7E8E12A70F34DBAB1F63962D367B8B9F6B839D73EC75D988F36E68E9BBBC5FD9F781DF05EDEABB67DBF3CBFB2D9F6D45BB89EDCE637C88C3C99ACB59BCE846CDD82A9C59F784C4A9E477ECB5D7FD836B638EDC9796BF2B69EB7EE914358CA907C3A234F266BEDA6DD9A8730B5F8138F49C9F348B7E621F99A87E46B1E92AF7948BEE6216D6BB6F3F770571EB60E6D1D235A367BC5C5E9EEAF623321DDB3DC99DC7326F79CE9EEB1EDDCD633EC52E6B72E68FF1D9DD61BEC73BCFBFED84DEDAFFB68BDC53DF387F3F859A1F5B6F08CBF3DC2F6A8B7F0881BFFB55FD3F9EB33FCF519FFDBDE4FF6D767F8EB33FE179A36C25F9FE1AFCFF86F9AB6E790E58F8D97F4C9511B16B9EFC370E6BAB77BED62733E792B5923AFB167BC7B47C7E7B76692C792B3C905E4CDE457C979E4B93CEE98E86C77ABE2C6AD2FB68C6D996CCF8B5DADF1EE7C03A724DC48DD6D63056C78BFA4ED7D9F42EB72F7CAD4256769CBDDEB6D6EDDCAAD63F35B555A6A12D19E65CFBC96F3CD9965AD97DBF3B91FB45E65FF56BF8B7FC7880097D833C38FBF5B32ED63AF58DCD97721ECE52A0ED99C472E206792C79286B4E77D612FA6E69375322397904B49FB8AD02DCB9DBFDAF698FCD1DF75B72A1C91A24358097B0A11F60E07888EE1C070A02851E1A6BCE935D0E110B668084B1FD2363A423874E3774CEC79E78CFBC476625AE1A68E4D9D8F6EB8B7A9D27C72E9A196FEE102BDB2B2738F253D5FDE6AAFADEBDBACED3F69C035833A0D9931ECCEE1AD3BCF1EF1E0C83EBBCDDDFDF13143F73A7FECF3FB8D1E7FF1FE6B0E9C3069C51471F0A187DC7278F3F499B67F6C7B457295B841DC665F936C7815F794582D5E14AF6CFA5A5EF6907D647FFBAA64B8DC55EE21C7CA0972929C26A7CB2FCBAFC913E42972AE5C2017CA0B64222F91995C21AF9137C93BE43DF2FE8D15FA9E932FC9D7E4DB9B54E8EB59E85B185018BAB146DFC4C2E4A093EB2183CEAE870CDCD97797A0C1F590F678B33D64D0E47AC8A09BEB218366D743DA23D0F69041D9F590F638B43D64D0EA7A487B34DA1E32D0AE870CDCF81B5110BB1ED25D231E54822D5D0F19F4743D64D0CBF590416FD743DAE3D6F690C1D6AE87B447AFED21DD15EAF6181EE47AC8C08D03323818E27AC8C08D03323470E3800C0B76743DA4BBEE9CEBCA6D0FE9AE68E738B73D6430D2F590811BB56554E0C66B71C7BCED21837D5C0F698F7CDB4306E35D0F698F7FDB4306135D0F697B01DB4306935C0F191CE47AC860B2EB218329AE870CA6BA1E3238D8F590817B4E9916B871420E090E753D647098EB2183C35D0FE94651088E70D7C107D3DD75F0C191EE3AF86046F045D743DA5EC6F690F15AD743C6EB5C0F19BFE77AC8F87DD743DADEC7F690F17AD743C61FB91EB2225C0F5991AE87AC145C0F5929BA1EB2D2C1F590B69FB23DA497E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697F53F24AB208AD1E268B1105112FD48C8B87FBC9DD8F6FF5A5D83A840D5E52255973B5075B92355973B5175B90B55971BA8BADC48D5E5AE545DEE46D5E566AA2E97A8BA5CA6EA720B55975BA9BA1C527559517539A6EA7285AACB5B5075B9075597B7A4EA722FAA2EF7A6EA721FAA2E6F47D5E501545DDE9EAACB03A9BA3C88AACB43A8BA3C94AACBC3A8BABC2355978753757917AA2E8FA0EAF2AE545D1E49D5E5D1545DDE9DAACB63A8BABC275597F7A6EAF258AA2EEF47D5E571545D1E4FD5E509545DDE9FAACB13A9BA7C0055970FA4EAF217A8BA3C89AACB07517579325597A75075792A55970FA6EAF234AA2E1FE2AA2E57ECBEAD74AAD8BEA3D2B962F770A54BC5EEE14A43C5EEE14A63C5F61D95A68ADDC3956E15BB872BCD15DB7754BA57EC7EAE942A763F57CA15DB8354828ADDDBF6BF97E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697F53F236BF3750D0AA2AFE81EFD205A115D115DB9B1BD26BA2EBA21BAC9CD63E72D88C6E8A2E862FBC84BA24BEC52EA51263A44CBA265A273747574B5E8125D1B5D2B1AA2EBA3EBED9C3746378AAED12DD12DA229BA3DBA43D82D145DECFA1A8514327ADD2DCDFE764F47EBEDED42B432FAD0DED36497FA4C2CE20A5BB92A5A65D7F551F4917D94FD67EF2B887EA214778BBBC7A5B81C07714B1CC63A8EE22DE21E71AF78ABB84FDC37DEC62D277ADDAE41446F466FDA75BD15BD65D7F04EF48E5DE65FA3BFDA6D5E17AD131DA3F7A3F745A7E843BB059D6319174443DC31EE28BAC69DE32EA2296E8CBB0ABB3F4564EF6F8E5B636537A1126F19F78C7BC75BDBFB3B476F446FD875BC17BD67D7F141F4815DC747B110C5B81877101DE34E7127BBDC86B8C1FDD685E9F688BE542C13578AEBC42DE24E71AF7840FC5A3C2A9E10ABC4F3E265F18678577C200BB28B6C96ADB2227BCB7E72A0DC418E90A3E55E729C3C504E9587CBA3E44C395B9E2C4F93F3E5B97291BC505E2CEB72B9BC4ADE206F9377CBFBE483F221F9987C4AAE962FCA57E41AB956AE2F742834164A0555E851E853E85F185C185ED8B5B047616C61426152619AAB5312DDEAEA94905DC806B2916C22BB91CD6477B24C06642B19929A8CC898AC905B923DC95E646F722B726BB22FD98F1C440E26879043C961E48EE47072277217720439921C458E267727F721F725C79313C889E401E424F220723239859C4A1E4C4E230F210F250F230F278F20A793479233C82F9247B98CD792EBC8F7C8F7C90FC8F5E4472E2B829464812C921DC88E2E454BD029681422680ABA8B8E549069A0764CD7400715D12DD832D84A94A905A3827E413F1105838261220E760C76123DA9F0B215B55DB6A6AACB36D473D9964A2EDB51C365FB605270941814AF8D3F10A3E3F5958E62CF7F79D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27984E309D603AC17482E904D309A6134C27DEF4664DD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC3740DD3354CD7305DC374CD9BDEACE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE62BA8AE92AA6AB98AE7AD39B356D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306D306DBCE9CD9A4E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AC5748AE914D329A6534CA7984E319D623AF5A6376B3AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E90CD319A6334C6798CE309D613AC37486E9ECB3323DFD68D15F4C2DDCD0B1B1F3971BEE698A9ABF5EFA754BBF70BE7EAA32BCC7053D5FDA6ACCD6976EF36EFF03075C35A8C390E9C3EE181EEC7CDC880746F6DEEDB4DD1F1B3378AF85639FDB6FD4F88BF67FE3C07193964F5E7FF0B4436E3ABCE95FF5FD7E5FC7F8FFFB3AC65E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E56579595E9697E565D9FBA9CF29A8CFD94F48A9441F314E1C28A68AC3C55162A6982D4E16A789F9E25CB1485CF85F7768B7606E9CDA9C176736CF8897D93C939C4F9EC5FD0BE2CB6C9E1D5F6EF31CA6FF8DE973C96F910B99FF3CA6CF679E6F33BD88E9FF6CEFDE63EDCAEEC28EDFB9EF069AC28C3D3DE3A6344DD314284C29A494D234A414689AA694A69486240C6108F831B6C76F7BFC7EBFDFE3F76BAFBDD65E6BAFEDF1783CB6C73688228410420821841042080102841045082184D21442EFFD5C2B85963F2A357FCC1FFEE37EB5CF3DFB9CEBBBD6CFCB1F59BABA27F4A49ED2D37A46CFCE77F4DBAECF799FF35E7B412F3E7763AE975C5FD62B7AD5E7AFB9FFFA7CC79E9AFB6EAE8F8D8D3D35FBCB738BF9977EBFC3F80BE39F195F31BE667CD3F8F6F1BDE387C74F8E9F1BBF321EC6CBF8ADF1BBE38FC67F7CFCA7C67F76FC17C67F79FCD7C67F6BFCF7C6FF70FC4FC63F373136313DF1A5134F4F8C26BE62E2BD135F3DF17513DF38F181896F9DF8F0C4774E7CF7C427263E3DF1C3132B27D64D6C99D839B17FE2E8C4E9890B13D726E2449DB83D717FE247277E62E2A7277E6EE217277E65E2D7277E67E2F727FE68E24F27FE6C727C7276F29D938B26974CBE7BF27D935F33F9F593DF34F9C1C96F9BFCC8E4774D7ECFE4A7265F9C5C36B97A72C3E4D6C9DD9307278F4F9E9DBC347963B29BBC397967F2C1E48F4DFEE4E4CF4CFEFCE42F4DFEEAE46F4EFEEEE41F4CFEF1E467273F3F3539F58EA92F9B7A76EA5D53EF99FACAA9E7A7DE3FF5CD531F9AFA8EA98F4E7D6CEAE3532F4C7D666AC5D49AA94D53DBA7F64E1D9E3A39756EEACA54982A53B7A6EE4E3D9AFAF1A99F9AFAD9A95F98FAE5A95F9BFAADA9DF9BFAC3A93F99FADCF4D8F4F4F4974E3F3D3D9AFE8AE9F74E7FF5F4D74D7FE3F407A6BF75FAC3D3DF39FDDDD39F98FEF4F40F4FAF9C5E37BD657AE7F4FEE9A3D3A7A72F4C5F9B8ED375FAF6F4FDE91F9DFE89E99F9EFEB9E95F9CFE95E95F9FFE9DE9DF9FFEA3E93F9DFEB399F199D99977CE2C9A5932F3EE99F7CD7CCDCCD7CF7CD3CC0767BE6DE62333DF35F33D339F9A797166D9CCEA990D335B6776CF1C9C393E7376E6D2CC8D996EE6E6CC9D9907333F36F393333F33F3F333BF34F3AB33BF39F3BB337F30F3C7339F9DF9FCECE4EC3B66BF6CF6D9D977CDBE67F62B679F9F7DFFEC37CF7E68F63B663F3AFBB1D98FCFBE30FB99D915B36B6637CD6E9FDD3B7B78F6E4ECB9D92BB361B6CCDE9ABD3BFB68F6C7677F6AF667677F61FEA49C9FAAA7677456FF86BE43BF54FFA6BE53FF967E997EB93EADCFE8225DACCFEADFD6913EA74BF4EFE8BBF4EFEA57E8DFD377EBDFD7F7E83FD0F7EA3FD4F7E9D7EAF3FA4FF4EBF49FEAD7EB37E8FBF59FE937EA3FD76FD27FA1DFACFF523FA0FF4A3FA8DFA21FD27FAB1FD67FA71FD17FAF1FD5FFA0DFA9FF51BF4BFF937E4CFFB37EB7FE17FD1EFDAFFA71FD5EFD847E523FA5DFA72FE8F7EBA7F507F445FD41FD8CB3E3C6E8A9F9DF603D7F3D9AD0499D52933032032333303203A32F51933032092393303209239330320923933032092393303209239330320923933032092393303209239330320923933032092393303209239330FA2AFD6AFDC7FA356A1246266164124626616412462661641246266164124626616412462661641246266164124626616406466660640646FF5ABF55FF8D7E9B7EBB7E879A939139199993913919999391391999939139199993913919999391391999939139199993913919999391391999939139197DF2F18E2FD565BA5C57E84BBA5257E96A7D59D7E85A5DA7EB75836ED44DBA59B7E82BBA55B7E976DDA13B7597EED63DBA57F7E97E3DA007F5901ED6237A548FE9713DA127F5949ED6337A565FD5737A5E2FE845BDA497F58A5ED56B7A5D17D6B3D1A0AD464DDA69D6A2BD561DF4A6BEA6B7F475BDAD6FE81D7D53EFEA3DBDAF6FE9037DA88FF447E6FBDC57EA5711D90D22BB41643788EC0691CDF7CFF5F3FA17F35D32A64FA95362895362895362895362895362897F2F96382B96382B96382B96382B96382B96382B96382B96382B96382B96382B96382B963CB330A54B16E9627D56E7DC3DF6255FF80D47EF1B9B9AD3F387C6DE3DE7DDCF8CBD7FF4D4687AEC63A3D9D17BC63E3EFAAAD107C6D68F3E38FAE4D8A1D1D2B935C8D4F8D9E73E3BF71E9F7B62A32736FAFFB051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C346F3677AF3D8460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B356CD4B051C3460D1B2DECF8525DA6CB7585BEA42B7595AED697758DAED575BA5E37E846DDA49B758BBEA25B759B6ED71DBA5377E96EDDA37B759FEED7037A500FE9613DA247F5981ED7137A524FE9693DA367F5553DA7E7F5825ED44B7A59AFE855BDA6D7F5862EAC6AD056A326ED346BD15EAB0E7A535FD35BFABADED637F48EBEA977F59EDED7B7F4813ED4473A6FA3868D9AC7366AD8A861A3868D1A366AD8A861A3868D1A366AD8A861A3868D1A366AD8A861A3868D1A366AD8A861A3868D1A366AD8A861A3868D1A366AD8A861A3868DAC271B356CD4B051F3C4464F6CF436B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3F9D33C3CB65160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3851D5FAACB74B9AED09774A5AED2D5FAB2AED1B5BA4ED7EB06DDA89B74B36ED15774AB6ED3EDBA4377EA2EDDAD7B74AFEED3FD7A400FEA213DAC47F4A81ED3E37A424FEA293DAD67F4ACBEAAE7F4BC5ED08B7A492FEB15BDAAD7F4BADED04617D6B6D5A8493BCD5AB4D7AA83DED4D7F496BEAEB7F50DBDA36FEA5DBDA7F7F52D7DA00FF591CEDB28B051786CA3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B05360A6C14D828B05160A3C046818D021B5949360A6C14D8283CB1D1131BBD0D6CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B2D1FC39DE3EB651CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB462D1BB56CD4B251CB460B3BBE5497E9725DA12FE94A5DA5ABF5655DA36B759DAED70DBA5137E966DDA2AFE856DDA6DB7587EED45DBA5BF7E85EDDA7FBF5801ED4437A588FE8513DA6C7F5849ED4537A5ACFE8597D55CFE979BDA017F5925ED62B7A55AFE975BDA18D065D58E1A8493BCD5AB4D7AA83DED4D7F496BEAEB7F50DBDA36FEA5DBDA7F7F52D7DA00FF591CEDBA865A3F6B18D5A366AD9A865A3968D5A366AD9A865A3968D5A366AD9A865A3968D5A366AD9A865A3968D5A366AD9A865A3968D5A366AD9A865A3968D5A366AD9A865236BC8462D1BB56CD43EB1D1131BBD0D6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D968FE048F8F6D14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D96861C797EA325DAE2BF4255DA9AB74B5BEAC6B74ADAED3F5BA4137EA26DDAC5BF415DDAADB74BBEED09DBA4B77EB1EDDABFB74BF1ED0837A480FEB113DAAC7F4B89ED0937A4A4FEB193DABAFEA393DAF17F4A25ED2CB7A45AFEA35BDAE37B4D1A0AD2EAC73D24EB316EDB5EAA037F535BDA5AFEB6D7D43EFE89B7A57EFE97D7D4B1FE8437DA4F3368A6C141FDB28B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846918D221B45368A6C14D928B25164A3C846568F8D221B45368A4F6CF4C4466F031B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25369A3FBBD3631B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25365AD8F1A5BA4C97EB0A7D4957EA2A5DAD2FEB1A5DABEB74BD6ED08DBA4937EB167D45B7EA36DDAE3B74A7EED2DDBA47F7EA3EDDAF07F4A01ED2C37A448FEA313DAE27F4A49ED2D37A46CFEAAB7A4ECFEB05BDA897F4B25ED1AB7A4DAFEB0D6D3468AB511756BBD3AC457BAD3AE84D7D4D6FE9EB7A5BDFD03BFAA6DED57B7A5FDFD207FA501FE9BC8D121BA5C7364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B15162A3C446898D121B25364A6C94D828B1917563A3C446898DD217CF465FD49FE39BDFD91DCFCDEFECCEE7E6F77497EED63D3EBFF7B9F91DDFF7DCFC5EEF777DC0F5413DA487DD7FC4F551F71C737DDCF5093DA9A7F4B49ED1B3F31DFDB6EB73DEE7BCD75ED08BCFCD4FE025D797F58A5EF5F96BEEBF3EDF273FC7F7C48E5F043B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76EC387F76748FEDD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B1E3C28E2FD565BA5C57E84BBA5257E96A7D59D7E85A5DA7EB75836ED44DBA59B7E82BBA55B7E976DDA13B7597EED63DBA57F7E97E3DA007F5901ED6237A548FE9713DA127F5949ED6337A565FD5737A5E2FE845BDA497F58A5ED56B7A5D6F68A3415B8D9A7461CDB316EDB5EAA037F535BDA5AFEB6D7D43EFE89B7A57EFE97D7D4B1FE8437DA4F376ECD8B17B6CC7F93FCFFFD0CFE9FFD43FD33FD7CFEB5FCC77CE8E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B163C78E1D3B76ECD8B1A31563C78E1D3B76EC9EFCBFDA131BBD0D6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D968FEBCCE8F6D94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D96861C797EA325DAE2BF4255DA9AB74B5BEAC6B74ADAED3F5BA4137EA26DDAC5BF415DDAADB74BBEED09DBA4B77EB1EDDABFB74BF1ED0837A480FEB113DAAC7F4B89ED0937A4A4FEB193DABAFEA393DAF17F4A25ED2CB7A45AFEA35BDAE37B4D1A0AD464DDAE9C2CA17EDB5EAA037F535BDA5AFEB6D7D43EFE89B7A57EFE97D7D4B1FE8437DA4F336CA6C941FDB28B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46998D321B6536CA6C94D928B35166A3CC46D68A8D321B6536CA4F6CF4C4466F031B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15369A3FA9CB631B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15365AD8F1A5BA4C97EB0A7D4957EA2A5DAD2FEB1A5DABEB74BD6ED08DBA4937EB167D45B7EA36DDAE3B74A7EED2DDBA47F7EA3EDDAF07F4A01ED2C37A448FEA313DAE27F4A49ED2D37A46CFEAAB7A4ECFEB05BDA897F4B25ED1AB7A4DAFEB0D6D3468AB5193769A7561FD7BAD3AE84D7D4D6FE9EB7A5BDFD03BFAA6DED57B7A5FDFD207FA501FE9BC8D0A1B95C7362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B05161A3C246858D0A1B15362A6C54D8A8B0915562A3C246858DCA131B3DB1D1DBC0463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BCD9FD1FD631BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CD4B351CF463D1BF56CB4B0E34B75992ED715FA92AED455BA5A5FD635BA56D7E97ADDA01B75936ED62DFA8A6ED56DBA5D77E84EDDA5BB758FEED57DBA5F0FE8413DA487F5881ED5637A5C4FE8493DA5A7F58C9ED557F59C9ED70B7A512FE965BDA257F59A5ED71BDA68D056A326ED346BD1855DA83AE84D7D4D6FE9EB7A5BDFD03BFAA6DED57B7A5FDFD207FA501FE9BC8D7A36EA1FDBA867A39E8D7A36EAD9A867A39E8D7A36EAD9A867A39E8D7A36EAD9A867A39E8D7A36EAD9A867A39E8D7A36EAD9A867A39E8D7A36EAD9A867A39E8D7A36B23E6CD4B351CF46FD131B3DB1D1DBC046958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958DE64FE7FAD846958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D16767CA92ED3E5BA425FD295BA4A57EBCBBA46D7EA3A5DAF1B74A36ED2CDBA455FD1ADBA4DB7EB0EDDA9BB74B7EED1BDBA4FF7EB013DA887F4B01ED1A37A4C8FEB093DA9A7F4B49ED1B3FAAA9ED3F37A412FEA25BDAC57F4AA5ED3EB7A431B0DDA6AD4A49D662DDAEBC25E0C7A535FD35BFABADED637F48EBEA977F59EDED7B7F4813ED4473A6FA3CA46F5B18D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C54D9A8B25165A3CA46958D2A1B5536AA6C6465D8A8B25165A3FAC4464F6CF436B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046F3E7F2F0D846031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B0D6C34B0D1C046031B2DECF8525DA6CB7585BEA42B7595AED697758DAED575BA5E37E846DDA49B758BBEA25B759B6ED71DBA5377E96EDDA37B759FEED7037A500FE9613DA247F5981ED7137A524FE9693DA367F5553DA7E7F5825ED44B7A59AFE855BDA6D7F586361AB4D5A8493BCD5AB4D7AA0B3B72535FD35BFABADED637F48EBEA977F59EDED7B7F4813ED447FA23F365A3E1B18D06361AD86860A3818D06361AD86860A3818D06361AD86860A3818D06361AD86860A3818D06361AD86860A3818D06361AD86860A3818D06361AD86860236BC246031B0D6C347CD16C343EF68EB9BF0D87E7A666FEEC3B3437434F8D3D3BF7313BF731B9F807E63EFEFBD3EB167D72EED153CF7CC3DCDD739F5FBC74FED1D33FF457EE7C616CF2E93F5EB4EB99F7CE3FB768DB5CDFF585E73E3D36B368CDD8C4D3BFB1F87B17BDB8E8A157FFC65C5F70C7F8D8F4D8F38B5F1C7BE699558BF68D4D2CFEC4DC9DCB16BDF8CCB73FFD9B8B762D8AFFFBD1B35FBB68DFFFD37DCFCF3D3FF7359EFD6F73FDC817BEC67B177FFFD83B47BFB5F0CA67EE2D5A3EF77E0FC72616FDF4332F2E5A3EF7CEFFE7B3CFFFE5677DFF47FEEA9F79F4C2D8337FDDFB3DFD43BECB2FBCF6FFBAEFF9BFFEBE2F7C8D85559D5EFCE2E21F5CFC99C53FB4F8879FFB47F3CFCD7DEF766BF1DAC51BE7776BD1E6B9D7D891D1A7E69FFFF2FCF8D1F77954C6C6FE172E172D7A0D0A656E6473747265616D0D0A656E646F626A0D0A3130382030206F626A0D0A5B2032373820302030203020302030203020302030203020302030203020302032373820302030203020302030203020302030203020302030203020302030203020302030203020373232203732322037323220373232203636372036313120373738203732322032373820302030203631312038333320373232203737382036363720373738203732322036363720363131203732322030203934342030203636372030203020302030203020302030203535362036313120353536203631312035353620333333203631312036313120323738203020302032373820383839203631312036313120363131203631312033383920353536203333332036313120353536203737382030203535365D200D0A656E646F626A0D0A3130392030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E6774682032363735342F4C656E677468312036393837323E3E0D0A73747265616D0D0A789CEC7D0B7C54D5D5EFDA7B9F33E7CC4C1E93F78B30270C93840C212104C223929390443005C2434C80D40488A2F511E4A5D8427C201A506355AAB596F8002DA84C2688498012B55AB555B05A8B7EB6CDAF8A4FA87E2DA217C9CCFDEF3301A1E5F6B6BF7B7FD7EFEB9D35ACBDF663FDF75E7BEDB5F7D96742801811C52051A875E69C82A2A41537B712B1A5A86D5C7C65534BCC9F8D12A2721711AF58BC6A85117AFEC9F389166C22D21A2F69B9F4CADE9CB86D4453E612D9265F7AC57597C42F797904D1A22344F3129736372D39D1BC730FFA4299C62D4545FCDAE4ADE87F38CAC3975EB9E2DA97DFF35C87F24B4465D5575CBDB869F5F577CC22EA41B3A7FDCAA66B5BD26E8FDF87F6A9A830AE6C5ED1243AD42662D1E3A57D57355DD94CC14B7F41F46E3B51E1AD2D572F5F11CAA3DFA13D55EAB75CD3DC22668E7B8A68DA3D44715F909CAB16F5AAF7E9DFCCB838B6F40B3D4D27490FBF579A29E5E10B872C3971E2E4808BF46BA06BB7F425416A938333688A8B4E9C38B1C645A75B0629FA5D5913F74B6A25172513C7C74505340FB81A8CCBD12AC49B7C2FA9A4AB3F56C7A0838CB014AFD3253C5E57B95353B824A59F4685FAE8DA05E8D62EFB9E3B7D8A41F8787FADBE119CC5C6689359C024160A85B068D96AAF9C2925D9064DE21306793B758B5F510BFD0B04DCDDFF8AFE3F22F597166F063781EF51E7D1BDCA7BF423DB045A24EB31D6A653BAA87FD0B69DEE42FD7D68AF97BA9694F8797401DA47227FB73A2F14D26E27CDEA7F5E68E01F8DAF2CA769C06D80BC10722E64397C926AE5DFA31F9E395799D732692DEAEF02CF066F042F109916BE103837CAB723EF845DF6C1FE63FE6FF92A42FF35E95CFB01B1F0EAB7614B842214A10845284211FAF723B639D4FB6DDBF0CF92F2C17F1F5B2314A10845E8DB2446A15E1DECA2D09E6FDB9608452842118A50842214A108452842118A50842214A108452842118A50842214A108FDFB90F22C5DF26DDB10A108FD7723F6E36FDB8208452842118AD0FF4FA43E42B5EA1B54AFBE4D9BED79B419729348A649B24DFE7E94FC5DA653BA7C35DD28CBBC966221DB4ED54B7DD9267F974539883BE09FE93EE597B450F94FC85BC023E83EF53C5AA8C6D37DC0DE770AA78CA4FB6CB9688B025F00FD4D9073208F03733D5DA0A4D108E5536A577E480EDB2C4AB430DB48FF7FE89E6F85CEF451842214A10845284211FAB72131C843067FA5FE099490630152A89DE46FDB1BC8110DA351348D2EA27ABA8C56D375D4C146F3B76DA661370ABCBF96BF9D0FBD51544EDF8146135DF1F71AA1F7FEE6B338F468909DF47FFADAA78F1F3EEF6FFF8D817311B37DF34F1130CE713DF95B054C4551CFA888FBFB4E867BB3737247E4F9461215148E2E1A533C765CC9F80913A974B0BDB2AAFAFCA9D32EA8F90ED1CCDA59B3E7CCBD70DE4575F5F369E13FEDD17F92C43FAFFA5B99BC13CEFF975B15B3E2C2B966D9E4F34A274D9C30BE646CF198A2D18505A3F247FAF246E4E6647B877B866519EEA1994332D2D3525392931213E2E35CB131D1514E875DD76CAA2238A391559EEA46C39FDDE857B23D53A7E6CBB2A709154D675434FA0D54559FADE3371A2D35E36C4D139A97FC8DA619D6344F6B3297514AA5F9238D2A8FE17FB5D26374B3F9B3EA90BFBDD2536FF88F5AF9E956BEDDCA47239F9505805195BAB4D2F0B346A3CA5FBD6A695B556325BAEB743AA678A6343BF24752A7C389AC13397F8AA7A593A54C665686A7544DECE4A447C3287FBAA7B2CA9FE6A99416F885B7AA6989BF76565D55654656567DFE483F9BB2D8B3C84F9E0A7FACCF52A129D6307EDB14BF660D635C2667431B8DCE917D6D9BBA5DB4A8D117B5C4B3A469619D5F34D5CB31E27C18B7D29FB2E6FDD46F8AE83C7E4ADD86335B33445B55EA65862CB6B56D30FC7DB3EACE6CCD92697D3DFA00967BAB1BDBAA31F42638B1668E81D1F8FAFA3A3F5B8F210D391339ABF0FC9A3D55B2A6F172C36FF7547896B65DDE88A5496FF3D3ECEBB202E9E9664FA89FD2AB8CB6B9759E2C7F5986A7BEA972486722B5CDBEAE2BCD34D2CE6EC91FD9E98A0B3BB63326763013157D66A6F9749B95B3D465AE66F669CF326991671A02C26F2C3660499D07731A2F93E6F1D4B6783CD440F50C28FF12ACC8657EFB94C636D744592FF17ED5EBF2186D5F1022C073F4C8D9354D833536AFEB0B92591927A7430DEDA7F27E9FCF9F972743449B8235858D93ADF2D8FC91ABBAF9384F8BCB8080FBA816BE6DAA9F5800F76765C905DED86DD22214FCADB3EAC26583166504C82CF0D5FB79A36CE93BD59274A16C693DD5721ADEE84124EFB27678925FCF3EFD27D6959C50B574A29F25FF83E6E6707BCD1C4FCDACF97546555BE3A06F6BE69E550AB78F3FDD3698F3274CA913197C30C73384D58AA05C785A5916EAA2FC8A177F6C56502FF10B04A555C18C6ABFAB716A38AD776465FD2F31DD9A7E06A83BF4B94459E21BD8A095FE89BEB3CB93CE2A9F655D549B80BD4A36AF993BBFADCD71565B350EA0B6B66A8F51DDD6D8D6D41D6A5DE4315C9EB61EFE187FACADA5AAF1D48276877A3766F8AB37D563124BD944042BA78A4E0FBB7556A7C96E9D33BFAEC785E3FBD6B97501CEF894C68AFACEE168ABEB3170E65AB55CD6CA4A593064816A18E23CC0754B3FA3C7246AB55A15ABC22A2FEE6664D5E9A7EA182DEEE6E13A5778A06C6B20130FD8C5DD4AB8C53CA5ADA04E0FD7B586B57307B575B4B8644B2FE14C27AB314CF2D09832B7EECC70B0F6587D3E517914CD153BE5878FA54C728BA7C493781ABBC5935DB64C776B79B47882768239B9901AE00E212F29A678A24B8B2E32BB21E3132D1948F615F584FA909938C6AACFBFA7A875AFD84117D31854EF085C28AB7774999545961C33292C0B465B32A0879BB5C42277793A6005604EB183B999E03BC15BC0FBC13618B483FE080E8185785C3C1CA876A387ADE828B63C516C85674DA407C021B080F55B3197ADF4D9608D02AB1EE9B247C9E11FB15019E211A06291BAC0ADE09DE0036095AE46BA051C020BE41E46DBC3C4C5C3E2A180CBED2A77889FD23A30173FA658C6C88DDEEFEB7259BEB9BF2B36A1C82C77897BA916CCC92FA6531F98A3DBBB00BB8B38D46B02F9A32D17D67439628A5CD0DF08A337C2908D18B20329B3CA2658EA6FEC4A4896DDDF14888DB370D7070A8BC3992E576A512DBC702D31D12CAE220F96742DE450C8C59072A9178925146DD96976C5BA8A5A315E19D4CB44128D4073B948A622C84A914E1996DACA404C789C9581DCBC22CC788A48B5546245341543EA420B14B98D3DC2B49C7F6B97DD29EDBB35E04A2ADA27D60B8D12A1D50AAD1477EC3EE1C0CA3AAC99CCEDB24717B5974789B998E65CB8C50D1B19BC7C95D5D1550174541E27AAC4104A46DBF744262541568BA1967C4C3C44D5900F76650F71F7ED11775BA81FCA4E31FCE470684DEE8A8E29EA2BB78BC968F58B3BB000775883B777658F2FA2F26C914B85600E1FAF436E9D15F46DC8B561D5DAB0526D58A93618D586E823711B5A6E834E8158432D6235B583B7202FC32A290087F65899E1B9453D224DA4C231AE3D7025436D7A973D465A961A884FB0D452BBA2628ACAF689E588F3E5E8D3142BBA52528BAEDE23F2ACA98CEC4ACD90809600C2759F48092F0D80C97249F689217084744CA6181A4872FBCBDD28CB4076E3AAFE0A3F289DC4DFE0BF95CBCD0FA02CE5AF06E5AB83F2B5B00CF5F183E14DC17F23657FF9107E189D5DCC7F4F5B90E37C0F7F9E0A017887774B2BF8DBBC87CA200FA1BC04B207720C646F20EB257737EFEE8280ED0F04A293E564F9F3015FC160C6ED1DCCA4640C66E2938BCABDFC39FE2CDE89DCFC7790C3219FE57DB86DBBF97EC854C83EBE825E827C1AA7D624C85D83F2177CAF0C71FE0CDF4DE321BB0231D2047F40936267C026C553010A976A0BDC7BF9537C07A543F5C940763A6A1FEFCA1EEE8EDD83FE18DFCA570432DDF1E50EFE10AB63C7A0D44187A4A478FE70A04476D21ED86BB87B783B6F37534B4CAF996F6E1385DEC2FCC26DC2F01AF94689B1CD2877F13B70806CE1D8BF7C23D2123238A2076C82DBF96D01A5C45F3E8039C979716A45DA61E51A91B6583942EA3ADDFAB9952BE3EB692698A38FB5E075E056F00DF23D85AF015F0FFE3EF80756CD0AF04AF06A9C262D40B400D102448B856801A2058816205A2C448B35FA4AB0443402D1084423108D16A2118846201A8168B410D2DE46201A2D442D10B540D402516B216A81A805A216885A0B510B442D10B516C204C204C204C2B410261026102610A68530813081302D442110854014025168210A812804A21088420B51084421108516C200C200C200C2B010061006100610868530803080302C840B0817102E205C16C205840B0817102E0BE1B2D667255822FA81E807A21F887E0BD10F443F10FD40F45B887E20FA81E8E7AB3BC5C1F217003908C841400E5A9083801C04E42020072DC841400E02727070EA2B2C677084CD5AF03A702B5862FB80ED03B60FD83E0BDB6785D74AB0C4FA81F003E107C26F21FC40F881F003E1B7107E20FC40F82D4407101D407400D161213A80E800A203880E0BD16105EE4AB044FCEB41F92F2F0DBF81D5E978D6F25636C292EBE88825D7D2214BFE803A2DF97DDA66C9EBE9464BAEA1124BAEA66C4BA23F4BAE20B7CE02EE92D8F2641C0133C11783AF066F01CB4BD27EB066E50E80FF080EF1B1E63025569BA96DD1766AFB3575A7D6AFF158DB4CDB16DB4EDB7E9BBAD3D66FE34679068FB6CE511C2D74A795AE43FA19180F11A46556AE8C1763DC629CB363F129E6C566DC51E3B33C76208FEDCF633BF3D89D79ACDCCECF678A75D2195482EB9E9BD59951D993DD87C025D939937132DDB1FB488A3B903DCEDDCDF686C508D3077904DC09DE06BE115C022E02E783BD60B7559707FD3A73D860977BC139E02CB02187A0E464BC9AC4C7E9660F8F66DBBA5E8826BB1C272717B83D819C4288EE40CE4C886702398BDCE576B69B72E4AD883D8D95DB01B933E07E1FCD4F86C51301F71E88C703EE62888640CE288805819C57DDE5D1EC42722B123A7750CEC1BCA59C1D70CF83DAAC807B04842F90932DB5F3309017AD23581DBD0FE91D440D0F8FE409B827410C0BB827486D9D72E4C2331BE55BE6A9602945170CFAAC87D529CC74BA8FBAEF761F01FC533816E1F1B6D1AD401CF076B379A6C3BD37FFA7502E7707CA1D521FCF87CE41E997F269F736EF6DEE07D017F3EE76DFEF1EE5BE23BF5B47F5EDB0FB366B8880FB46BC6EEE3013DCADEE42F78AFCF7DDCBDD17B89BDCB3DD0D5ED407DC0BDD7BA59954CFEAF88EDDEE5A74380DB3F006DCE77BBB2D13ABDDD7B94D778E7B82B157FA97C687FB2DC9DF2B3D4045E1D147C2BF79DE6E19E3179674B338334FFB5C6BD7166815DA24CDA30DD3866A995AA21EAFBBF4183D4A77E8BA6ED3159DEBA4277687FA4D9FFC9E2FD1E692C2A6C854B1F22E2E53F995A07CF7603AA70BC89F206A78CD9C0A56E3EF5B4C358B0CFFF1399E6EE6C0DB9CEAA960FEF81AAA995BE11FEFABE9D642B3FD25BE1ABF56BBA0AE93B13BEA51EBE7B7E265696E5D370BC9AAF519F26B934E46EB6FCFE821C6D2D6DF5E5F4FA9C9ABCA52CBE227C74DA8AE3C47D23898FABEA1D433B399FECD3573EAFCDB33EBFD453213CAACAFF1DF20BF54E9E1B13CBAAAB287C748515FD7A3B4F0D8AAD9B25E69A9AC87DAFB961AA239066A942305D4F40A32A41ACE930AA986350AEB65030EBD2C29A0E788A66C4B2FDB116DE9294CEA751E32AA2A3B0DC3D2F1121DB2740E79E90C1D440CB0959DD9D99696C76075528BD5790CCBB01156476E3754F2DD960AC3BDCEEAC8CDACC1FC05DFA8780755C69E56196B8D25D8373AEEB04E62EE299DC45CE8F8FE0FA9B9C2C7BA46AF5CFBBCFC9EAAD153D50C6EF46F5CB534D5DFBAC8303AD7AE1CFC022BBB71D1E2A5523635FB577A9A2BFD6B3D9546E7E8E7CFD1FCBC6C1EEDA9ECA4E7ABE6D6753E6F365706469BA3AB3C4D95F55D65A575E5678D75DBE9B1EA4ACFD159A9ECAC4E8E55567E8EE672D95C26C72A976395CBB1CACC326BACAACB64DCD7D675EA54513F6561587671A70331DC9891555F91EC6A992C03BA675256EADA8C5E85D8E3E4F4D5FBA33C15FE68B06CCA2FCF2F974DD867B229467E1939D894BA765256462F7B7CB0C985EA384F059D722D49A51AFFD85935FEAC39F3EB64A8F8CDA673AFD9724956732A555D56893F28AFB0189F333569F93969C5B968E5CA95CB65B2D2B79CA8C69F37A7C63F6E162CD1340CD558598FBA51A7EA84B0EA3AEDF6AAEE501F1A7D3082AD90C3C99C8FF9E041D381B72E8D77D83A342E5F155674A567165DBD0F4FF07560BCC7F1D58102EBF599AFEE1AE695EF2F2BBA0AC686255E57A50CA467156184AE1240A5F486A519978F4CBBB73DBFBDA4C3DB91DF516243EDEE6DA8746F938FD240C136412B7CCB4F3902D915F57036CC92E33D141892690DDC21333E5FBD6F39B3FCF5F7CE66A79C7EDAB1CB077B5D6E75BFE2D48284EB970F768295088FBEF2146CE520C86A5C6981C29D844BA7936F68C54AD995F4274E69B5978658FC180D51B2F1AE45A1F74F71F0B2D0FBB24D4AFE094EF4CC300F52809EA0DFB15C6650173B4129F4154B63A3691AA2F44B5CE176D200DD8BD7FCB9B499C5E3DD2D992EA4694C818E8F36B10742AB421FD379F4437A38F40CBB31B41DED77D28BF4152CF8039E98253403FA1752337D2C0E537DE8C7A4D30672E2DD6E364BA6267A0B9F2F60C3DD740FFD9C7D3FF415464DA41BD15F29955379E8D9D049CAA34D4ABB7AC8FE34DD457B982DB43874196E4AC3A88DFB426F85FE48D9544F8FD013B0C9C7FA94A99445DFA3F5741F4B132F22772F3D4A4116C51BC414753F469A46F3E82A5A4D6DB49D5E61F1AC563DA47E1EBA3EF421A231817261D365F4311BCBA6F3AD4A546872E81D5A403DF412E62B3F7DCA02E5317541B02CF460E839BC853FC31C6C2F7B562D52EF18B821F450E8298A823DA3E19119186711DD44CFD2CBF49FF417BE2EB48EA6D21C8CFC02CB6406CB86C7DFE2697C2D5F2BDEB07EAAD4006B57D216F263457A690FED836FFE83FAE9304B6419EC02B688DDC5FEC2A3F8127E403C2076893715A6FC0CFEF690173E5A415B6937FD9A5EA5034C45FF85AC965DCEAE663F620FB27EEEE747F8978AAEDCA47CAD0CA8D9C1FEE0D7A119A12FF0EE9D4EDFA135B40EBE7D84BA6817BD46BFA5BFD05FE93873B1F16C297B88F9593F3BC2ED7C189FC95BF866BC453F296688BBC4B3CA58A542F99EF2AAF28E7A8BBA516BD28227B705EF0E3E197C3DF44CE875C44E0CFACFA66A78F40644C556DA4F6FA0F7B7E9F7F427193FE87F129BCFBE8B5196B35BD93DEC49F6027B9D7D82595AFF0C3A469CC42B31EAD5FC1AF8E9467E37BF07A31F90DF78F077F8EFF9A7FC0BA18A61629C58261E127ED12D0E8A0F149792AD8C52462B3395F94A082B53A49EAFCE511F5777A8CFA99FDB4A6D4B6C2DB68FB41BB59BF55F0FE40DFC2148C1A5417FB00BB1AB2392D6C0133FA58711F7BBB006AFC0A3AFC1E27E3A86554867592C07764F60D5AC864D6717B185AC99DDC836B01FB2FBD803EC61F614668039700DB6FB78399FC39B7833BF996FE0B7F35DF8F4F297F95BFC103F0ACB538447F8C468314DCC170BC45598C30AB156DC0CCFDE25B68B03E20DF1A1F8481CC5AAA528439595CA1AE57EE5316597F2BAFA1DF54A7C1E56F7AB7DEAEBEA49F5A48DDBD26D436C05B6CB6D8FDBFEA4D9B4715AAD769BF6A6F657BD850D6179B0DC38F3A78C3C0D7B7028DFCE139575EC282A32F1F6118B99FBB00E73B02BFE4A652288758991EDB02D89A7290912693315BFFCEE82EDA1B1EC055A67E342FE0700FD1460EFF27EE5797E1EFD9635B234E5317195FA0ACFA21D388DDAF95EBE8755D02E5ECAE7F19F086287F1743C8C78BF96EE61DF63CB69073BCA26B21FB012B68EDEE4C9620EBB994A430F7385D9D934F639C102BA415942DFFDC73F3D6513E85DFA38F853255AF93ECEA76EDA8C157D82FEC87E4627981A3A82D34DE0346AC229B309F1BE9EE4A9D7807DB60EFB310D27C815B603B44BFE645C2BB14D56D6D0E7F43FE863B51711558193F4C3E065CA4F95F74225A17CEC30EC327A1CFB6E299D8F1D731851B20F65595A889DEEC05952845D5D4BF36909FD00A7DE5D217FE827A19B42D785AEA65F017B828D6427580776443710A5F4123E77D2DB6C23F6E1F9FFFB9F149F8B824BA88F3E61A9CCCB8AB01F8EAAABD47675BBBA4BFDB9FAAA6D34BC7D333D8088FE13A2D981192CA6D7E913FA92E9589B341A49C5B0773C6CAFA32B78BDD84753583AB560CFE6E21CAF189CC972F47223BCF713ECE77DD81B9FE39C58483FA7438CB314CC6831C6D7D14F0DFC7C31B4B761056F625DA85982533B8F3EC5BC63D878BC988F24133D6DC6A9D5079BDEA50FE0ED9065D7489C0B956C1EFAFA922EA22518611CD5B24EACC06E9A8093B552FC1AFE1ECE5C54C186B147816BC40E8DA14C9AA0BEC7388D0CCE088DE797897D78C68450DF81A757069DC796C18A58CC638092D84C1A1B9C0D1BDE6042F1B3DF5856DCCF9B431BC4EAE015F42BFA19D6C454566995CA35CA7AE56BEB6730A4E28308D2A8621767419BD6CDCBCC045295A02087A60419A5E93635C8C55E964D761C9CA994EA731D2F1D289DE13A563A7DA094CA90779D4432BA302B2E2BCE8B046F5C74D2107D274D95BE2643E9937F13A31BB1FC119ED92AD9E9FA5E3E869CBCC8F4395433CD5D1CABBA55AECED7C7DB0427BBCD71A79339D352D2853DDBA6676B4A3613D9DCD6CBEFC1E5EA1E338ACB47C19D4CB03487B39BE95D591FECC01BD38C630DA5D3DF7FDF7534FC99E1AA6AAEFCA001E695954E770D7CD0E01B5DC8AA2BAB2B99809542260CFBB070EABBD8256BF847AC2EF8F8406AF0169616FC10D6B6884ED16C59EBA4EF99C51BD40DCEE3EA71A762536DCE66B5D9B94A5DE5B4912A98CDE9D035153316CE63BA2E48375C8E0247994338BAD9F5A643186EEBC9255837DFDC15B5758AF45EC3D181860158E63A1A973281C5C54F982019F65DB32C418CCD4A1263AC74EB585634EA984C44278BFBEAABE067E154BEC0DE8DE4099686951B6E26F1F1E4E0D9B1788536A810BE4F532E5D95EAC302354CC730D38F8E2E1C83E9DE2D1FF7985CF86FC5E0A4EDC5AA3B58790F69A143A6BD6442B12D1789266F9BF6DCB1C53613094A87CCDAAC1CB4211941794A9E9AEB28881A4F256A59D4E574396F1697A84BF54B1D1F89D80B6C8CEB76261C76BBA2D9190E042D11E78ECDAE28866A4B54559BEE30D333273BE410CEF4CC6287970B6153E4F732668C4DE3AA820B961E9592924EDDBCC974BA99E5BC56CB7DC34DBBDBCE0AEDAD766EEFE5C3498186DD50999AE6FCEEE253D34D3BDEB0EC58C3B2D4811972F9E1E352970C80A3707041E980CF57BA411DE5DBF0835F6C18952A85E62A2DDDF08B5F74DAE44F1F77D98BEDD1C5E4ABC74AD4F89DB8FA0FC5D5BF87442818D015476F28084F9DECB429E325D5B3650DE15B6B5696C087652508A1EE0FFEBC7560F775C117F9243621EF9517D9F46097DA7BB28D1B03FD729F6D86E717C1F30958AA9174C82C5B9DC796C65C9BF781725C51EC5949765BEEC82C6F72BC3B6966122F4CDA99C49392123DC3BCF109BA91E865C433725A6CAD7838D6E4E6EC8C6251F215C1EE2C8EEAE69BCCACC251E6A8DA518DA35A46B58E6A1FD5314A3746158EE2A312871964241426F0846EBEB12B7FF49CB0B3E4EE9DEE6A5876DCB76CFAD1630D47AD9D2C396E4241C332F9DE4049A1D640E684240C124897A2B5336102265C0F2519B6043EEDAB58F99AE430E097066A48C82A1ACA93126D5A7232529B6653B358DC98A29271E3C61667E7647BB0FD060BD99ECDFC82A7766C987FF5C5B7B4373CB4EA82E0E16034CB7DEEC9BCEF5C5473C1C8D7B7B3F80E5FC51CF3BA57D4DECC85F75F7CE913BE9CBDEB96EC5B16AD73E5C5E093AAFDA2F32B2FB4AB033DC16BED510D332A16E6C9FDD114FA50FDAEFA06EE826F99336EB1DF96785BF216BACFF64BFB9BE24DE717C2EEB5E746E5468F481C91BC525D69BF45D5B5042D252521256504CF135E55CB55EF577F647F59BCE054CBD84C3C0866BB88F5E358C6410697C7A5165BD28178E966F3CD94D47C458F3163E28B636A2E8E65336359AC99945A1CDBCD72CD61F1F90E11FB59CC3CFA8CACAED20B87B02149391D1A8BD5DC5AA12670E86EEACA583BB82E588D19AE86E30D5814ACC9C0315FC3B2F77D52CA4CC3E8426A600D0D0D4CB5291E83E25C9465A424A7A870E4305B9C2B794CD138A58CB92B82AF1E09BE1BBC95AD61C52CFAF12545C1FF48DFBAEA915FBDD4B16A3BCF58F0F9C73840E7B3ABD8BD5BBEEBAFBEE6E64F8227829F1CD92CCF867B10A14D8850178E9375E6985C6CF7F3539A95E628352F6542CAD4E4FAE4A5C9EA849471191B32EE57373B55779C0CCB84786FAC4B4FCBD9A9316D3026E5ACCC84D62C66641566F1ACB87844A1ABD0C55D320A8D7346E1E91094B35CC66418A52427C72725E2FE878F271C4493B98C1B44D13D3CF399C61BBA1BF34B2E997ED3A24707DE60B9BFFF7EC9D48B4B4BAF9833F969B57748F673C10F5F7BFAA68EC535796EE5B9936363E2E7BDB07DFBEE4BE263648CDC8B5BDEE798A993DACDF37455D174AF2DDEADB24275279E46AA5D285ECEB8C3EE7592AED96A049FEA203C98D28DE8C268335A442B7683C90317218119459D39236B014BA71F2B3D567A8E6DA5623F654E50B19FB0ADD4B3B69550712259E77552D620DFAB949DFC98F70F18628CDAFB5570CF97C1655FC2FA1FC1FA9B61BD9DAE31CB60BD4DF56A865EA8EFD7FFA82B057ABBCE759DC253B0C3FE32DB4C9C1AB3059EFA3CDD70163AB9F36CFB1DE7B2BFA1D47A800E94C64BE3CF65DF8FC4D181497CC9C04FA46D5BBF1AB84B7A761176DF3EEC3E03275CF5F8A13543E769ABF45551EBF59BA3D6A7DC9C61B7A5D832E253E23372E3725373D37387EA539D0B94B9F6F9CECB95EB9535A92BD277C7EC76FD32FA45D7EF5C1FBA62C4109B21779BE94E9FE046EF98124B1E926FB3C7CB0D175F33338125C8DD9620775B5E727E2C6EE3CC48BB18D539F1F3B8DB3004A63CAC70181F9696D3E160B10EB7A3503EA0B1EBB2D66E396BD7C9C9BB8E1D5D663D2FC2BB0F9BEF689C7C7A2CF3955A079EB501D9D8AC38ECC061C3118CF125E3C618CAE01E4C72C5630F968C15657C6D4370CBD31F04B73FD1D773FB6F581C1B3332F88E7B47EB73873FDADBB0670ACFF872A07BFE6DCFB24BDF38CC965C3CEDF02B2557FCE0F85F825F07BF9E56DC8B79CA67459E159F8F985EBBA23A04B73BBC4AFC4EC184209BAA6229355D4774AABA613B20771EDF680E33A36BA31BA3454B746B3497A1DA11DD17AD44736778B1FBF0100A87EBCAB337E035C71B06EF73D62313895C732B5E8515AF22FC1890E26FE2F554489CFE6C66B9BC92E5060F0DEC557B07F6F3F213D5FC86817598D32684C72ECC49D0D5D63EE82A2A2E56E581E1F15AD22C4B4C2926D5546BD556B55FC5BDB0516D513F579556152727C7FD8A8BB7716FF5E3762CFAE4792C2775102585AE52469F5ACC6B06A75206C3188AB056DAB789E5AABD27AA61C783D83D5BD5A770BF3BCF4CAFD564DF0ACE7DD215355DE3E2CC8D611BDD73E6C608CA7EA70F0C766DCD3AE941CCB75F7DEAEB695FCAE8C716B0A5618E513CD5743A45B69EED140AD60C1BDDB40F9958EC30264E2AB67787FABB06A5F9E89051A84562B3EB8EF7EC471CB80B381C097C88E2B2BB1D1E3E5231EC058E4BF952A5D97EB96335BF5679D4BEDDF1B4BDD771DC7EC291BC4569B76F71BC687FD9F13B7E4879CBFEB6E343FE9172D8FE89237AB5FD5AC74D7C9372937D93A39D6B75CE667EB972A97DA96315BF4ED12A798D5269AF715CA45F64AF7368A98E8298623E5129B64F7294C56882472936BBDD91C4D39514BB16BE24996E38CA6157A334ADC8161355844B8D4B70BD568F2E76CAC49A658C33BA583763728A9D3241D54F4C97CC3875BC5A2B885A07E932D0CAB0A15226846F510DACE0A8EBCDA3B222A33B34C9CCC72886A2DBED4542491442E14E87A348706439BA11510AE7510EDC3435DD1DC362BA597497FCCBC2BDB80BCBB05AD0100EA79439738BD522CDD4D6E94CDFB70EABB0CF6938A378371F6FC6238E4C289209252A72CBEB14BA89963BC3756CD9519FCF55FA6757697A9A6B60D9C0B2D2F454172E90A870BDBF4C5EDEAD6D026BCFBE510EDE1E13E660DFE8A1FE4EA721AF8A0D165971E823DF3219368CC99DC2F048BB8BEDC13BA2C6F6068F067F1F7C2FF8075C1853C54727AA951BBF5E2B1931751FCE028F3CEDD96B668C5DD8F43491A22BF1D80DF02E75C53BCBE4BE94D396D2CCC38C4491A6276A9A2E74CE356187BFE02BA1C8192B72C64A91ED006ECFF2CC48339DB5CE46A76871B63A7987B3CFC9C34F08DD3ED8A99466CC9C39C5F6A2B34E11C719A7082ED738474E1D242859FBCF7ABD21F0865172F2F050388EE4A9D26FDA1115BA118E91BE67ECFF93B12F818FAABAFF3DE7DCFDCE9D3BDB9D3D93CC92CC249984C932210402B94808FB0E914146224A20A840A816B015A2228B5A7105442CA9B5EE954D24C152A9B52EED73796E155B2BB6286A9B4AFB788095DCBCDFB93301B49FFE5F13E69E7BEEDC997BCFEFFC96EFF7F73B3750AD312138F52ED55563CCB3BA9EB3D4895D963A7360230343D2E22CD8708C87A96174866D616E8560D72DEE138F33FC4BCC9BE28722136652629A19214E13EF617689DDCC6E710FF38268C9519BDABA34D16B4D6A734CB7A66AD2244C3782560747B6E95264489ACC868D79764B61187AB0118920F808E3152A484218416A85A94417E6935641D248509842C60A3B84A784DF91A3E4737242F89A5812A4549828AC1636094F139EFAA095178A1483AA9041A626501F821DDB7198CCC52EE3F7FD7B41012A9977FED5C2FCE25C33C5641988A727209EDA80F33FACCFD9C66D13B72BDB5556C4822ADA045FC2B75A5AE514563956BB37B09BC5CDCA06F556E7666D937B9377936F4340119CA00901B733A0057CEE80E0AAB44AFE4A81F12476CB18C976399C8B867AB82AA487DA422B425DA1EE101F0E9D0C91903DD18D30E59655E69CDFB1BF60EDAFCF874C13B9654DE4D6D7D4471D62B613D07F1AB03D8D8939788AB04643228036088F9931353F5FBC793F6EC6B71A6B8DC346AFB116577FB677EF5F3E3A78F01879F7D8F615FB92C38D65C60EE321633980D4255F1B030303E7CE7E43E54011DB59B0022A87557A09CFF56ABD3E661C871773EF73C4E928B1AA2A0ADA29E6B121D1F36F68D45314AACA8F8F0BD96D177BF9826F03D2F378340F7E2E6052983000DC795A138BF9090C2DCF6AEEC77FC0EACCB54F2EDC3675E96BBF7A78F7F7C75C3EBEAE9B3BE4897CB47B634F87C3DDFF7BF645A36DC8C2D1D3975865735EAFE50B615EDDA81408C38D1B421B233BD00E6DA767A7975F6DBFD1BB2ABC41DEA06EB26FD23607453E249504825A488BF84BAEF6DE80C4EB10CE084B40C5D604D614AE09DF266C766C0E6C083F20ECB06C753C213CE779D9F3BEC7511F9CEBE8103AE41BD01A8167F064341F5D83D8624F349128F60888E149BC002053A2874C3E109F16AD94089598CD91263D78966E63DE95A478BCC89F2093769763675E9ACE9CB694EBE56DE52BCABBCABBCBF970F9C972525E94E856B04D2952AA148692D2FD65DFD51690EBF17EC053A8E9545FD2DE6F80DE60EAF4512E07823A015BC12B5BE2F10A20D4043FC87290036840C9D0BC1EB929D5A98F27EA3D5CF5B55DD78ED1D58377ED369E316EC25D78026EC16BEB4A8D430D0DC70E1CF8E493A7F58679D959F71C9A3AE47F6B31E1074DF84EBC042FC65B8C4EE3815FDEB54C1FF3CB1F18DF9CEB0745738F883C5143358D622FC02E3033117456BFB9C136C176A9B0D4B25479527A4CED8E3DA77E20C9BCC8CB5ED1230F555BD4169B20DA2587A66A36CD3E541D6A1B67BB5E5D637F47B6AC9656FBBF1FDA246DF26F08F1924793149B3A4BBD5E5DAFDEA7FE54E5D4B055D1AC56C5A6B8AD5E4F89CBAEE136AD5B239A86C211AAC8A0D26E24AA3445924056BB9558DF0D26BAF93DFC11FE2D9EE537AE88E170AC2A466211F7C5FA1CADBEF2823E9B569AE7F866D8BA00E84DFF0CBE39ABDE687F093BF29C1E997300AA5E636A3AD078AF2BC20C21B198C37141DF81BA2FFFEB7B5D2FFEAAEDC6A5FB8D1FBFBF72F6E5ED8D7F786F69E3B4F1C5CF9EE00E4DFBEDCD3FFB7DC1B00D4F197FC64D4F6522FD3B99A9C5732F997899C2519C3471E033F69FA0FD15F82D7D64AFA327F45CE9CB152C1071371071B72FB9885B547A1DBFDA7A5DE951E5FD989291E7A873A299D812A5DDB938D251BAB862556843686B4471C628962A2C4AD3565FE40FA4674467C47E15FD558CED8C76C66E8ADE14FB24FA498C4FCAE5D6E26871ACC19A8E4D9227599BA363624BAD8B626BAC3744375B6F8B3E2A3F667D3CEA9264C9CA47F9985FF65B3D51211A93AD2CF6B6FA747F38BDDC8797FB76F988EF10598482101F14A024411CACD418341ED3803121104E57611D4FC76DF82EDC8DF7E02358C47F67F540839DC56C65B9E4FB6AC08BBDBACB9BF64E1212F1C010B019FB1EE0C593F0578EDC04FA2BDFCE7BA349B3E6EE45FAB08C99A1996A3F0D6D72254D0B74264F6593C773EDCAE47130A05C5031017B14E4110C8D0279BC956FFFB2CFD51005F14003BDD7F63969EF2DDDE66CB0869D0DB2F9B2D1639FEBAA02C7AC0DB28FBE5C0DDFAA0D67F220D03D5C1E6EAD8BD6811C2758C7445B628FCA4F446594CD0C12F7128F27E7F213E66F5D7AE8058A24F06ECDEB614DCDA2398C89381CD8B571CBDD2327A77BFFDEB671DD574F600D7B05E303D78D37DE342155310CEF79F3FA3B06D00BC697C6FBF8A382BB37AD99919E10740E19D1BAE69915BF6EFFE76FAD9D57D6451BD225A9F66B0FDFBEF68F5763FA8022AA8068D16B663957EAB19454C55671D3A5155297749724F09823252C4304244A5E6F805D479110AED4655E08E32A441756D3AE8351A79315A48BDC4558E217FB9FCECFCA8CB97B09CC8AC990FB1B61337651F3F17CB46834890184F43ACA8FF1C7C614F647C654F6C5B367BFA1CBBAEF85585E0C77E547B7E9C3045190043B3811699C384E122E955AED5BEDDB1CDBDD0F7A1EB31FF4FCDEFD297F9AB7581505232294B824C512B6BE49E1AE49F482D3836D416645B02B48C2C1AA6077F048900D626044617F95FF889FF1534710F88F44AFCF7406264172451C30251ED3B4018DD855128BD2144BDDBDB8D4E2DAF2C3B55D015C5A75D307CFBC7D74AD160278F2D9E161F3AE5DBCF5192679CE30CE7EB83573C58373D69E46F43F6206CF391BC6C763753F62B048B31CCE069316CC0E0C4F1F11DFC7EF93A3EC518EA3146435B70D6F250FB0DBB95D347B6EE15322A5396DE22A2CF891872F43717E021AC75F0AB3C81012C64883C9E599F31965A6872CD42D3C706016102E26DC2172055DDF4E55DBC2E2756C17FB317B8C65D91E6CD1E5754C17F331730CE818D8EA01380308C1216C4184E692AB30C67EE1A25C325858F654369BF4F59DC7FB7DDF46FB17B0EC91FDF61C8A3D00007636D09CAC0961CD50869218305F0453CC8F89A5FF141E8DBF07016878FFFFE10E7DF36B76245052D00C0121E176CA1BF180EE4C32493E6CA9B5B020488B0E82E34182FBA1652E6AF7F9EB00999FD0259A4BF7C34619EC21DAE3A83FCC784269360C1B01A81CAF04905B2A432592F0857C4239237D2D9F51B857B8D7E457940FD1BBC01CDF57BE449F4AD253EC4FB9A7E49F29CFB3FBB9E7E503CAABAC34848D722939AC3CC8DECB3D28DFAF88F9ACB988552B5D8CB25F8DE4C887043B40FC22F49677EECF71C29DBA9B32C4AB68CFC233080BAC9997326DE622166886A3E0B32F5A582EDC3350B59F0712D83350A3CF679012BE4803649EE36A2CB266B1C8122F086151D24451622D8A92A78B7011464104B30AC3C9164112795110B8BC9298C411822A587E0A78610FAED2E5307FD872584F519E0E5D254C0B0F04FBAD83FA10F04FE9CF067CFDFD017F7FD637585EC869853DFF6BDE3D2DE7985BE4A0E470CAC5FAF2ED26C7724C72D899670674D34955C505AAE23255062F321EC6A98FB00211057F82CB8D9DC6CBC61F8D8FC00A1DCC57E7108B80298EFFA6076CAF1F6C6F2E6890887ED30B46F04B7D94A5EE888C5986E51881E55886CBED8709D6400EE691302F50288B59015825CC0A43802B224E16712B60E6C5605B206A20DD0489F2F3C40BDFCD13EF01E09561042CDA7B109F071DEDFB252A2C3BF817BFFD38B0E55C037E312FA1D3C7A9809C0D0E53348E3C7716017840EB33770045356E14ED2F51B1A0A4C98F2945269EFE13F8329CC133F19CFE4F490733A3FF17A4F9DCCFFB1F802B4F18F89C1DC28E423154833BF52542402CE0429EC0C4E0F88209257FB07FEC9086FA5BFC97C6DBFD8BE31BE2F7F8EF0D3C1AE80DBE127835A8F0BCD5EDE1FD9E045FE6CEF857910DE451FE00FF32AFBC903E6A27A1E29A6A4785B5584F0E4917EBD152D8F843E9E5C5E78A49714B88AA7A956A4B8F0C6114B287F684BE0EB1A15005AE453A1CA58C89A03911BDC0D114D18376D8F802E9480FB9EE002B2856B9825A0CBC67B6F0B6D9C219157086AE6B96C2EAB85826955A3345CA2E8514814F50B0A2AB9EB4129896C6E936F017775287555B1659E0C51F7BF134EF02EF722FE3F5D7768C1ECC82015AE8ECCBD2BC6632D73B6EFA7DD031303BA0E826863091603267CCFB5221DC99E91B746BC540CA83A1F4ECE2AB8A493699A1F52E984046B5E7825C679606FB0484760A1319CDE38D98889D87E041237EFDD0FA1C58C7942BB9358AD8E1601D5E34907CFBCD5FF44C628225C69716BBC08C7F24FBC8E1D607EFF9CDE4E9CB27CDC6970FFDB2B87E6EF3E4B1B5760BF9F3901DF765361F347AEEB8757241BD5F6C69D9B769DE8F261594840B668C1D61BCEDACF1251A47B4D6C4EB8B1781C8378236DC6772C402F4502F720E9CD5AB2D0DF5C17141E26CE55BE5564FAB2F537046E0EBD811D611AEBAE058769275926B6CF03EE101495654307A14A00BF13841A373E1B2586C48F646C4C08A425C682F234CDC4617AA2B7805EAA2582DD494937767E394BEFEC6CFA60277CC31C73E1A614D4683B363E6EA9676BE5D6EF7B4FB3A0AB82C307F332309A27302BB018125DC2E08C1E779F246ECBF79DF8B86D1DF7BD95EDD999EB0267BCBFAC58B367087FA4FDE679C30BE364E1A1F5E96D949CA7F366DC5AEA79EFBC9433482CC81B1378125F8D127FA8CB9B68C33E35962EB7076786EF4ADF16F23DB9497ED2FFB7E6F7FDFF705FF85F885EB0BF759DE35CC35CC3DD139D1D3E2CB281D8A30DC59EFA9F731ABB855B68DDC06DB66FFE3CEC73CBDCEE73C926A6A6830AD9AA1534BABB5567AC45F98B6E619A3F51066910C32733A2C488753910EE7A1DABB404F0F81D366E1ADB057C0F4288EA09495EE5823D300D004824244F307E6E6444973F1B40096048A4893F0D9E3C95C050CDA1CC20499E6D3ED54AB86D67354E9284F045564AB8DBFAA574EEBB871DDD5D3DBDD584B9E7AFD0BE3AFD8D3F7E2A7E46F35B366DFFDE4E19D972D4FFDF2451CC72C1670C96394F1CD06D95D91D79BBBF44A6786CFC819674E5BB6836A9C95A415855D856438935686BBD3FE894CB332D1DDEC7F409234535D2C546B74D522A836980AD95BA65AE3986A8ACD86025BA8EE44447F686EE3F911769ECE698C190373F913937781AE583BF80EB9C399D3163E9B8944EAF20374D6D6781D117CB1AAB05718DF8CDE3BEFA0F18DF1E2BE9BB1BFDF996ABEE18A4DEB175FB571E765199C00FEA162FF7DC47E6EC5939397FDEC91833FD905E31D0DE34D80AE68A800FFB417D9C14E5A2C0D0F483BAC5BED8F738FC9CF4BCF5B7B02A2A8E1F1641CDF224F2B7CDCFA1CFF5CE015F955E57DF903E5AC70C66A2DB015B875F0106E5D75A46DEE17DC6FBA19B7A90D854D66AB7AA1253FD281F43AA7AB6D2A517D4ECA939EF307D3B8D669165143E15C31355A966B9395B9D65760B6BA0DDC69375DB46F87DB5EE074D2D5B2ACC5E9A3E22EB608288253EE9C12A50A17142E2FDC55C816DA22A26EB5A541E0796F98FC5655B58FAED6D57C7AA9D6E4D30B6DB00117ECA3BEDA64394DFD268D72C24DC01966D2034E72E65D356DF70D9E7A2A1FBACD0F2078C3D9406F7A9F97367BF64BF228B33B3AD26406F7CC71EA41B3E6E5551DA4A4D28BAAF4F2AA0EC2CAA53ECDA50A40E60050D49AF81CBC05A62A1E06484E751C311113ADBB727CCA4BFE857D43BFD86DFCF5D60EACBDD3879D7CBFCEDC7CC525F312CCEAD6F98D8D18CF4CEDF8C981BB3F025D481AAF18876FBC7D3CBEE6867563C67C8FFA0D1F18C067C0C43DA847AF19CAE272366C0F3B326C978F13D9177CC4ED7110CDE971A82E1BB2AB2EFA2C852689360B5E6019B0100B9D0899C70E9B070F78B087760BEDF0BD27E913182E4D966A9BC469E27491114BED29C7020771F46056B7AAAE38D116A06ECF110FF1509D9094B4C7EF5DDD4B3A506ECEC0A5D29545E7B240B1FCC7910FCC84262DE0D5049B861A1BFCE4E390ABD6E498355EC1F40AEE5A770CDC6BCCB7B3E181EB577F2F3E66D4C8BAB7DF364EEC64E3D337AC9F55FC92BD61C6A48FCE1D642698B66FCC60DB4C0491C253F585AB421B43C4A95857546FB07655B3611C2331A60AD7925A46C763C818E6325B46CB94B496B5C2545D6D3BEB38EB728EB0D67A4694D6564CB2367B269536579C54FABDF29D10B32D8AD552AE5813AAC7EBAEB42A407C7DC5D4020E9816602ABAEA309564BF45C9B5A5E539038895E4DAEA74CE102477D00CFC0B38EA708A6C09DAA8722515B8C52DF8FC7C7999251EF051A723F9FD81C0966A5C0D2EA84797516D71C4E9AF3AEF7D4EE5FD8FBDCFDE7F7C3058F59FCAE7A807E33F326FCEBCF83E981C537D2F24EBE88BE2B57C88EB34FD96AD43EB28595CD69EEC48F134CA79398F7730EED7810BCB2BB0B70E1827B0CC3000059776C197ADC1A3C55069EBB2FA129775ED91F76F5C88F10BBFE9C2C2A815CF6F31FEF9E773B7B42DBE73D39245B7B42486B90B239EEAD8E50F3E7D60CB7BD882033FBFFFDCB85F1C5ADAD87BA74A6E79E2A19FFCF867DD0F81B0EE4188CD805FF7A07D7AD2868B70039D48FB25F812C79FF0D75812380F574CE63A9638388C894B73385D8C46B08D0A35C408922C6B6ED98390458E8B921E2E4EEF96F080842510334C89275A9CBECBD7ED232B7C277DE42B1FF6212DEE719B6E0BCEED76E3936EECF67B9B7282EF5C99CC97D761EF74BE97E340C023FA40A65E135E89262D87684001422171832AA7CD70C7D35DFCD4A6C357EC9C16324E84678C6C59566B9C0058F0E9AEF12B366DE9BF9B543F36AFAE79F386FEBFC1A041B7CD956266C55540AB7A91446BAC0EB94997A64BA44BDA231D91DE92BE92B822A94D5A2775C3018EE10504CC00A2986E56561994054CC473BCC0CA44809869EA62A438CDFAC5FCB82E8CA3C934CF0B656130CE954917BDE9DC1234E304F6B3CF61D638F7CD4436FECD87836BD9CC3B9C65D684F5327A7FDC748E74717BB823DC5BDC57B942F03AAE1B0E7070330CC00C268ED1E09D203FFB6F7792BF767EE95BBEEEBB16217E3B587A028FE84565F0E92C5C0B3CABE2E63D4A9A498B695F3AD64CC68A637DCD3125CCA4CA66496D655D65BBCA1EE11F131E550EF007943D656F951D2B535159AA6C3ABCF142D9C7657C991E28483741BFCB7C931322AC10085157B84F1622A6476405BBC391081614C4133288D3668F3B1DFABCBA36075E0EC2E9212DBA2D108C870AE0D8F202DC56800BE0D8B325F17882A2887D0825CCC02A35D1561F0AF79D805313FA687835C2AB38914EE8C347A6538937131F27185BA228D1956050229CA84A0C24D884BFF42F8D83C4209FCECBD97FE3698861E0664F77666933A88E26B5CD65E707577AAD4C52578B93AE889B627EAF89FCBD1E533D13E7D5F382A6AEC5CCED47DAB756B53C3CFFFA874B415F43891923960C314E14360D1DBDA4D238C1C6EF7E62F69C39B317CC6FDEDE9F210B7E3CA471FCED5B0D425A1E9C57D1B2FE81FE73B97A3A9B8139F3A05DBA4F70795DF3C42522DBC362982D7BB3D86CFBC2CEF1A6B93A04D5CA2B160BC02F82E31E649A2BF062F892FF64AEB225AEA854BE56AB72DE6A157C123CF7B7ADD694D4BF19AE49FFCF23B7C8B7CCD41412182F9B314E14CF6898705D12949FBBFD9DEC8E6945A4F0E945C3A6AFDF6714B1F19DCF8E59B2FE07D456670226DB0123B50282DFA68FFF1C9F10CFB8CEB8D957C8E71C71FA39BF4432F65657AB27E3DB46B6F3DBC56D4A8FF41EF903F747E93DE5047782FFDC6A7F4CFC1DF95FFCAFC59715EE7A7133BF5E641CA6165ABC54441A2B680D42A02DB82248826A047D0B72E7884B0E880E7A74A9C3DE0E38B4C3C762EACE71D69576C2B0905B03D2521C2FB9C877CFBCAD7FE73F70DA78ED6FF718676EC3E1ADCB96DD7FFFB2655B49F40ECCDF66BCF2D53F8C5FAF1F78FCC78F3FDEBDF3F1C7E9786F37AE61B7C178ED80B977E84386B9C6BB8833CD34581B5CE9603333C13AC1D51CFC3A2851DE3688C54F0B5F0745B09F8B399AC762B1DBD4418EE62853555BDC6E37C1B7E5BB2C6D4A5F234CA4FDF8BFF134D3DFD2184679DA45D89BAE6674534D4779A246E1F78551DF8EF9DA6796F662629CEB9DBB651A4CB1E7CEF685376FB872F12698DAE957197F32FA8DD3C6D19639FD5F30BDFB9F7A68FF630F53FC7D198C7D218CDD8142E821BDDED948D2D6B4D6583091345B9BB58905E28A221C12DDDE7486CBC8975A5B5D196F26D01A7A547EB4E0AC74DA7A46531C480D5221B016778EA80A363BEF039251E82C03B61577384CA22A6DB1637BA02817FA4F5F34FE53DF197EB2332F800EAE436E7775783BFCED21100076F066E0CEB12B1AB971FA02F56226D43FB2E0C0F5B761E6C8D2071B31639CBCF5AAF6CDEBAFB8E21EE31AE219376BD32E6CC70817CDBBECA17FB530CFFE74D7C37B763FF80C459D1B1162EACDD97F5C2FDDC66149C5B3B876EE7A8E4939E7AA4BD4154E5696682D916C510614D2A44C5388D24356E965820016CE105E2E45925DAA925648AC1458E7DCE5240B9CEB9CBB9D6F3959A71DC5692A0F3480902EDC4D73798EA65E5C8006C9FA79833E9DF54FC9814B1006D877434D4E193AD1A43DDE59F41145BAB2B566186842C4B4EAF3309377E06E6AD363AE6E6ECB5C3A6EE488992936BEEDEAE6BAFF3B64F493C63F608C5560D17618633979513FC23BF89898F03ABCB1EDCEEDDAB6C4FDE592A0B568C4F9BCB5577D25F269ECACF574942FB3CEB12EB2DE6FD9E67C2CDAAB08A3637A71737C71F4AAF846E7466D43F49662A93E3E966FB14CB44EB3B5442E890AD1E244BC5EA98BD07A4C5DB1C0CB9C438AF8AC09251A8DC684E2A85EF13D65B5B6C6FDFDB2EBCB37B9D797EF70DF5FFE6CF4D998B50B6FF1DEE17BA0FC89F23D15BC37E2D123B1B4472F284A1779F0C700E46BC5C8F4922D25A444F785D225810A73410DC49DE915B8AA02A72A704561A40A94AB16C87C3E36E556C7CA4DB9C84CD772F893AB7BA8C8CF41BC31F351791F6AAE3AA691A80FE58B4A753CC63CF6E0787468A425321B67BC57E10EEF692C632F6103912829755915521A58C062B6A5D4323D80032D2E019800FCA3A074F095ED0CD212D8EF288E8EF4E4DAA859222CA6FD63FB8B8A737D7FC0ECEB41D8B9DA8A87465BA2DBADF7455F8ABE1BE52351C5CAB2019447EAA89662F6FDDECA269CA775663F5A9236AB7E2188FE08E7EA7E6C1BEEC227318340EF69159035CF7479E04C8CF52988C50BD8932CA143F0E8F0D59E5AAF0EDFEBD5E14BBD7A5D7DDA4BF38D5EBDA40C36F0BD366F9199DA63BD73023AC42F5B004F0F0C04487EF06621D0FCA1AB84B39D74BDF0CA5C37278C7CE52EC7933AE1279B5BD5573CF09A2E599C4DB652D8801CFEF69CB541D19406BABB4FA1B5C02FF75A1A4C428AE95295CE7C550F803C04FB44B159D5A30EE1E2A21EFD038E34FD578503CE65575E5B5FA2B927184F5FB6F6C34F3F7CB7D438E35830777955B8208E7F95997BEAABA3FD38959C39A7B42015766B8E49A35A1FB8ED1777DE5E3DEA92224FACD05DD03E71D2867BDEDE83E81FAAFA9CDCCD3D0451F175BD2C8C8090C965B6E1EA44356313FC6EE4633C6EE475BA34EC75120DFB18499005C547C56D43DE6EEF1E2FD306CD112FE305E2B9CF8D69D0D88FDCF46997EB7455B14829398580FB2D002F41A969A98F897B9D73DC4DDA2E6DB7C6B4695DDA5DDA5BDA498D439A5D0B6B551AABF903ABBB07E1D4A43DF5E02746984F0B6803476861F05CAE2E683F65F2D63EF3291938F5380029476D9EB766319054CD94A997CF17DC1CB1BADABA1207B9E18825519098E85BF8C3C9373458A49B6EC201367ECC987D73B220F86179ED8CB1D5F7E3378FBDF388B119E4F323F032B3D83820A49DBAF752C762C7568E91783FDF481A1D93C824C70922987CC6C15A3C48766B40C98197C7DD6E441DA4EA3171528EBCFF0F384912CF0324119F14B1F89F694D2EC87C071F657349AC789C9618B50BD54666EAF0C31D573F3919FB8B66368D5F598EFDBBE62CBCFCC9ADA4DBF01D5B3462DAF5C7F111200A304E0B20C179304E0B0EEA6EAE34904A0B74C3D38D48374CCFC007FBA135294A38303CBD83C53C63114559B1000F234E262005E428AAB4BC6251C0B64FEA9E50382D23CEA221BFA504955BD268B8652392F2B52D195B15F3BB2C9237CD6224611EC9B49E01D398AF55E94E0B92598B2C4984601EF6A5069A0FD57D05A5698BB5C85C2BCE5ABDDE805D6E92A7990BADAA740B4B1A2C6C133B8D65D843A40A206A976E53EA100E830B61B05F790974CB4F952BE99BD297854895F59B2527B36F2274BBB94217C32D98A69DCCD21C51EE79141C717969F2DD15C1F8A0311B275E1DEEE555FB6F71C400E9F5FFF9C0584F652529CCC9540246340C64AAE08FF46A90AC8C78220B9C14441E52C83AB880A04985B24351CC9264CCD2C034F0E399F1FC76663B6FE684F55515E340841696E558C922B34A1005580FA7497ED9AD283154CA26B84AA9544E28D5A89E1B25B5A071641C375E9820AD42ABD955DC6A69B5BC4AD98836B11BB94DD22679A372141D65DFE3DE938ECAEF295FA22FD9E3DC71E94BF9B8F235FA9A3DCD9D154E4B5FCBA795CAEFD61FA57CFDD12DD1FA23ED0D561A7989CEDA4595C66F9719A7E4CB8C93F51A5A66FC9F4A877CAE7428A7D42695D0FAA1385AC22A0A83D0AE451678E988C1EAB361ECB7BED48B0339B0414B87F9CA61AE7098FD2F2A8783C5C1CE24A2FEFA598B6E6D80619EDD67A5C5F4B3E0AC2DBA428F9C0467CDE41A9EAEF0B0D0DEB141D76DFA7E8A66A856B8E83F1C61189C31F660C72B07B16DEFEFB0DB78CAF8E7C1674133C6931EFAFAE643F254FF1CD00DD598C1CE04DD70E1F4B3CE520EBB68B4F429B6B4E8B1DAD202DDF074C379E018C92DD11F9E063ACD5A2D2A6F27C8C5B32EC2C2F56822B00DA0420FDE0D0663B3A6D452147657B9DBDC0C4D9098B1349E36F326CE82C2B49BAEC96860749F3FBDCEACC8267489983D8209ED397103D20B86A6F3EB65B497F2BE38992BDB53BBC93D02964C76AE9C623F751C784D36959337CE55209D39790BAA99C1CADB4E76D21E3BB8F2E1E0CAF7B1767468E024D8E6C9BD8C1D9BCF7CE51FDFF85C57AD8E2697DDE5878DD3D7C481F8F74387B6FBA09FFBAE4C4EDC82CA007A4E98650A15278DB338666C1E5332E6D275D3674CF55F52B7F0723F885E25FF3C477AB30B47461D7FB47E2F73FE193F903E83C6EB319A04C9E7439836684891990E614025FFDB64486E45174D86988917B8C2EBEC6BF813EE1DB84252F7338874810342778140FF8E11438E62B49B7DFDA9FCF39E54809DE67A119ACD791D6BF059D9380DE239844BF0565207DFE23B8C186619C07A015E2BF77238653F85CC75A17485EB56A318FF11CEB5E73EC37EF6FFFF0CFBD9BFDEE52A2E7C06A3FFE23AC838845B2E7C46FC2F3E23A23387C4C1CF3C8F4BECFFC567ECE8ABE7ED63CDCFD8513B9AC75EC64E450202C4818A5002A5503D6A42E3D03474295A8016A3E568155A875ED5AF5C72CDF4D9B3E7CF5DFDC3618D2BAE2BAD68BBAA78F278456CD65924C26F41B8B8B1A2B8B8A291995B90AED2EC765FC1D489DF5FB972617BCB256B6F185AB36CA9D333B395F0C347B5C26FF4F279858179372C9D376FE90D4C7B5456CB870C8947DB51EA4FAF37A45E7FEB75EAEE52A994FDADD7EDAF836B81BDD7E9EEC52FF33C9CCAB5F63772E77FE7E47F3B1F24A0C5A2F46F7927F2AD2BDF7AF3EDE0FBC277FADF6DBFFBFE77FB25DFF9FEC1EB31EF56A5D355F7D1CD99DAEADAEA62BA67D4D7C0CFCF6BABAB6BC94CBAED0FD003E496F3E7F63F5395AEA9314FC6AFD2F78CF9747B869E7C1FDD63B6C2A60A7AC6EF6B6BAB3F860EDE063BADF4CB7E001B7CB82655D73F1EF6EEAFAA4A9370FE2443809DCFE9C78EA6ABD24360E7C29FA2377FAA69BE63FAC047DC95606F55680C9AA6271D9A66B784E363C6148EAD4A20D490B0151615924254158F5556A7D3C951959A5F7288C94A8EA16999A6DA3E6743AAB6BFE68D1A9CCAF6D5A6CCA75A6BFB6A6A6995C8358AC9A58AB542E28D0096A46E6708A94B8F227435F610E8A944A095789571C339B535A348DD3AF7DC7BDFBDF7A637EE9E426CE122E315D52E16CF5D79FF158B9EFCE1D886F51FEC5AB3A7096B23AE99D7BC68529D93CC987264F18C85431DB191B36BA6DC79CD68B6E8EA9F2E1B56775DCF7A63E59AFD7774D60F991C4FB40C0D0FBF76E7150B1FFAFE2CBF2BEC9871DDC49877E8FCB1C627DE214EB56AD4F8F890F1D581E894B5D9FCBAF69B401E05288E2ED7470A25DE1222867D6122F8BC3E92000B22285150A025C2857781600A4BDDA14495886D6211FD735F0585256E371BAD549840252B99892B4743AACF944EB6AF86AE6BA042CA5657D1E725E96AED304D6294D0AC1CEB76473CB9CA04A68B16A870B8D6EA4777FED9E839F8046EB8E78D15BDF75CDD123BE7906A936DBBBE98DCBF88EC0BCCCFAE1B77FDBC91F8EEB797777CFC069E81DF78697EC392BBF7FEEEDA7197DE59BBF2137CCF4BD96C45D67C068EAE209E02630BA13A3D149770288CB15A64B72BE1B05A05D8C121547A181B0180899A5E6A6AEAABA5735A93A2536AC2659A4B1C42E87DE57289E6F4B26E6E8AF141E5948EC6F9374E891A1F6067D1CCAB6F9D597FDDF28593FE5F7B5F02DFC671DE3BB3BB00160071F1A604920391047880244888A22E8B004950A4C44B20298A96690924401112053000289AF2211FF2215B566447B6E42B6993BACE553B4E9DF888D33A2EE3B8496DAB899BABB19D5FD2E4D9AEE5BEFA881D4B84DE37B3BB20A8C33F3FFF7EE94B5FA191806F6767BFF9BEFF77CCCC626755C35F13BAB197ACDFF3B96D679E563DF5E355C397D8721BFC577E6D5A9246FC3C48B312B579CA419AE52B0976902A4CE5318264B8BE763921B24C55F49D732DF34C2A37381848F62B10CDFCAB53E6538D17958D2B9045B42C9E55D5257F5EDD15681ED9BF8950694BFA27AFEB7145F68C55948DC40E0FAD9B8BEEDC5895FC794D57708D7F5F77F90534C86BBA6CE3AA6D1B644DCE5C2A3569DA71E316BA9BECECEBAA36D5770063B7C75AA9056D8C242BAB9423A4D855CC155375B466D180B9348829BEEE7AAA057DE8518E03AA45130B18A1E930AE5400C695C9B7D300567DE7CCF58A807CFB47BE9FA4410CD2AC8310FF57B65FAF02E627A24ECD0944A7535588A25EA8A0322CCCC35F5CBFF0CABCF9957988D8261BACFFDC79B626B7651DF7174F3FBDB0F369FA98E899A60F3EE07F24EDFBD8A1AE66FB032AD00D9EEE5C1BCE2BC69A62BC6C392E309AF24DBB60C146CAC1A52B2A4A8BCCC464D2395C459EA2A3457C51A9C3256DDBE0507E7E454579C18ADA1C93C96CB61873B4D65A0D4B286E6ADD7AB06963237CB3A8613EC8F2CAD537CFCFE3C253A3664AC84FA9A56FECD0A835D8C69ECEAF28509EC9A7FB3C9A71DA168FEF895A985EDE7BD7DC31BAD1839F3E7239DDE6F1FB476BAB9367976EF6F847514C3EF3CD6AFCD9AF3E78E0F5331F9E5EF863F2AC8857A69ECC1036A01C1855377996FB96431213EC253C4F4A5C259E12BEA4A42AD7E632615311AC711FD7E8F42A1DAF2EA3774639188F5B1A2173B63027A6B61FA50A53FB8F62F623A4B42695F224AFB883ECBE5C2E7D9C2279BAF591EDDBBF38D7E1BBE2AF5ACB3D5BDDAEA1968AF296AD8D8D439E7261C3B1AB4EFFF2FEED23DD9F3D79F096176FEB58782B78CB6079D5C095FED11BFCF6CABE59EA19D79FFD3D37CB7613D4782C7A1DB237E462E94E029FABA337211ED31B606D8BA89C2C7B2DBC48EF41C222597A2897DD1E70D4F14D167C9FA012EDB596CA42C76477A2C7D150AC573D7526AB75D8505822A8DE5D565FB86EF4D65D8220FDAADDA9A2F757ED682D1AF458579415D9D50E87BAA080A85D6A8F9A57ABD737D85C466C5C514A1F4B2BAB3015A8E9E367DFCCD1ACA25F6AAD1E8140D2C8D3B8889F05205CF8272A204894069F7C737889D0BC92096468F967A9C8CD5FDA39FE97B10D1DFB1FBC9CDD334ED769BEBC65A8A1719BA7A2FC9241976BB8BD32395BE81BBFF9D2DD9DFEA1E327AFBCEE87B7755DBAFD81335C4A65FEE75BE6FA2B1DFE6B47B65DDD5F51337C1D45DC0400785475108BB51E3387F5765143542E9837F32A1547B5D5EB44B54097F22FCCD3981C85AF17A89B4B8F0D34D18932E7B92DF9FBC387D98D97334FF11DBFC662F243E07D2BAC8AE8DD9695A8D7636D223EC2D9EDE55A6D7979DEAA95C8D6D05068A72B1B2E8FA7EEE8345514A8D1CA620AA8D6A8A380BED808D9E8943C84BBD9180E3E091EA9A2B881FB4999887348374A0AA4DA6676AF84FE66CEE05ED98CBFA21DBEB46564CDB2E2DECB422B9B02032D39765C64320DB494B7AEAAD4E7E1A2FACFFCDD9103DF8AAFC2BBBCEEE20DE31D9FAB6E771515D6B5D60C1FE36E4836FDDAED5E9B57D158BCF677F84B67361E7FF1C0EAC6E12B3A3416DDD9B34A2EE3D486FD08C1B1ECC1707C2D3B967FB3E5D4A81BC96F14114E0A3188B73C74C4E3D1E8306F346409598260A7CF69AB552AF536F52D6A6EAD7A939AAB52C368CC99CC166CC1D84E5F1202F3EB610DD6E459B27893466DA437AB1EE3785E503FC13FFC187DBB8A8E8E47F32D801598CB3C4FDF9B523FDA587F730D7D78D438AF9A9FB7603764288BBB30BD923D896F73D83474D56BE4351A1B44914338997CBE2B59D9917C09BF8A35B7A8F4C61CD3665CDA67CA31EAD58F3F2EC4922F5A6B6A9BECFFFCB38AA69AEA65F4BD1D2740BFA3A09F112D436E8826E230ADB08962B58DE4BBF23DF947E97606771336D989DBE5E6DC0EEA637F6B3219D96F6F6E9DF1292E8196F37FC326297404A2E22FCC5B94398A85FEBA9A478346DE5B632FE3F3E4F765C0E404DBE8CFACF979607D8DFC05F3381B7EE2AA96C16CE7BAFADA9CB1DEF077AEB0D957F7394F24BD9C6AFABEA655BE82EA75E5E16875F76E6FF1ADD1640B7FF8871CA75EE570B8551C97EC7B472DAE77FAAD46EE786159F9BE2EC766EF4A73E91DE31BA2C3CD1A5EC0E0E7979D7D5BB84EB811D9D0A51EA7D966B120DB376CD86BDB62BBC3F69736417AAD83ADACC8465F3B00F3319B996DFE2EC97D1A9435F00FA3122EF128AF972766B09EB0C044554923A34C6FD09A6EA257F287BC41444917AB9A85EBD624CFCEEFFFE19D5BB6DC75F2C07730D7907C7559B46FF50E9FDDDE3EBAAA7786E0991F3CB3E5F84F0F1E7EF5DE2D8F3E5E77597759FFC19DA14303E5C1BDD42FA9DD3E0776A3EFF96BF614686DC4EAB27AAC47AD82D56ACFB1936C573697CD9EDFCBD6E5502321D9488A9C20620E45BF84A7FBA02030D93B285838AEA4216A2F3B81E73B130EFF81ADB5DBBB9777EE98DD94ACC7E4CEAED135242BBFA0D65B5DB0DD27C474FA82B1CF3EB9F7F8AF3A9755975AF8430B3B2D65ABCADB0E6C9BD964D7AA54D20E5F612D48AAA75945A3D1F1BCB23353870C901F117BB90F8FE82FDD7F2B8A48A0286390560B28D3DB5BF2F477D1B158A696DFD5209713FCE185639C77E1EFB9EB85D81BCFBCF1C11B52CFFCBF41CF5AD4E9298510E11B788EEDEA0611F4D07383F4EC1D81CEE983478F69345A9DF094DC3B742B75AAF43ABAA44FCB09BE7BE165FC5AD206FD9D7C33D920FBD573E0575568DCE3A0D3F02A8C4B38FB5F54E12D55775471A4CA55E5A9E2ABAA6A4A6CF4FD059C212F9F85134C618BBE0BDD66836B55A232B0192FB211AA9169BEF062639A73C1974572301892169742E7F91858B289BB977356250E1DDFF4D9DF7C7EB0F7C46B77FC14068CE46F975DB1AD7DBACFE9EC8FB6DABA3B3DF9F8DED7924E7B6B63F1F003BFB8FEAA7F79E0D2BF79C4DD3D5439706078F4D088D350487276C976DCCFECE8F114A8ED82560BB1A0B3B31B5516F63FA721363068B59CA8D7C16044419C6F99CF966194719C3FB5F4950A2730C15FC424F9EBE4E5909F06F1D74F1FC1AF24CB90D4237E027AE4D1328F96937A42942F738B16CC9CD82DF11062A78FC8D7F07F846B54B03A29DA2960AFB045E088E0123841D0F00A8FA740363EE55E8BE8CAA2E5D12DCB5E217666F60D99A78AE6C82274BDA72F3F6F551EB74680C1136709A828CFA036E935F63935DEADC6EBD5DD6AAE568DAD300EE874CBF7E5E0500E76E7B4E5702B72700EFC35421EB5B82C9CA5284FD01B5566750E68F398214B6B96C781F96C3600C0CC956DACA74328234EB9D9463810106FE09B73287065180A9536A7842FE00B058DCEA87F02DF99FC48388B7E9B3C2B243FC2773EA533EA4415DEB1BCD6D55CC1B59C3EC2379DF911FD27C416BE5BDE5C5F5B24EB27249865B77A9AF68B78B38845B110329FC6CEDF2100B61E404FBB8FC3EDF4B531E961C39F67EB35D21A7514C6308898536E0554CC8005814F60337E92C7E6E49BC91E1EC4E8E21E3F7D84FBFAC220CD6A3482DE8608A233E2014FEDEA8ACE0AAED9B6D1C6ADCEEECCE6BA78BC96C73ADB96129C3E43966F95D25C67D297D1F8554120A5E73AEA27A3D23C9F460A7D839334DDA83867627CD996E33FBFF9A65FDC333070CFCF0EDEFC8B7BFCD851DBBB7BC386708FB37AF31E4FCB9E1E27E7BEFD9513FDFE7B7E79CBA15F1CDFB2E5F8CF6E1F39385C53337CE3F6911B86AA2AB71E54B2B30710CD452B605D6AD5D9CC5602B999B75A51797E4E3A82F449AAC7B2B3737579174D3C9293CBA99A8D90D2EEECC521F504BE237C624D837F2D71F78FBB9C57F65D357EB0CA5E73497D6EFF7A21A6C9CDDE3038B17AE89A11B74EAB4906F9C3C93F98CD1E7B43BBC80B12EA475404505F8E56A12F783A3B5CB8B91477E4625F0EEED461E8A0D60AF27614E1E6226C2FC24542BEAD7A7B19EE2AC3ABC105FB6B8FD672DE5A4C6A5DB55C6DED6AAB8D64B9B2B8AC46AA90857FD8A3070EAAEABC6AAEBACCC61632F40DE282866638BA4EA3CB34F09617D2CC354ADDC62D0501ACE0D84C52B66085C62E6DC450D29EF23A2ECC4CD96CA73BA7E9035C8A495564C61F75AE3FDC47CDA998B7DD533D72E66E67EF9E0DB515A59BEA76AE0FBA8AAC8A85D73F5CD653652D06D3DEA498FAEAE73797AEC2FF6BFB4D2335BA82DABC63059794D5C437290697EC7D0AEC4D503DDAEBA92FC8CBB3E766E7E6669BB34B73737536ECB03838870335D4974A1908230B5C55909D5B6A36991828A5A575B979445797E605F32C75C2D4C2228795E20F8DF5746B339D0C4A9E51C22973A83CB69F19F086D960599925277DDE5596778213028702ADD6E5CBF32E895EDA1C763F95FCEA97DCFE65C6E5C4B12CE7E8C6ADCB9C55EE1AF3A0F71E21665AD15C5979B9BB76E77057819017EC49FEEEC3DE11B3A85571C935DC43BCA0D950E95CADE6B8DFB0FDCEA70407F84F333AE4E98A39B06345AD4D5C6EB35AEF37E2DD463C022B31249A45227A44411473D6205B73F30A9BF4E6B6660A858DFE9F9046DEB8B274799D155BAD8E5247211D4BBEB9525F4A012994E3D9B2461AFFE96FCD8C48BB5D384AD323D0666845D3A4BCE460BAB3BFCA4A4ED95EC1505380A33FDF3A70B070EFB6CACE55A4DA957B69E7F6A3F6C4DAD843532FBF6D49BE6619ECEB1FCE5B39DCBAF5DAEAADBB4AD70EAD0ADFF7DAFB367CFBE53B8CA50D2B6095AEC9B7E4AF236387DBAF1871FFF523595E8FAB3AA778599129B72ACF79626FC38EA1F6FCEAEF3D076855C108F50E5B51D83DA697042CA8ED51C8AB48A35363AA2C4FADBF300FA3D28BA30B2F8CB2B74F4A3B6EAF497E8DFFC7E4D7F9436FBC716616381D856C791970AA402E4F4E8EDD6C76C02059E1AAE07085A582AB10E9DCA2586FC172766639E594741B2E27B59C657751E5159846599FD99B8E62C20BFA497F6D6B4DA1A0526122E65714176FBC2CB671FF97239798F45990BAEF6DDD9EBB6663766965C1B2ED1E2EB6F0F5E08D3BDA5794B85664D76E0EAC74DDB98D6E1781C8B81164B4405CB80D7A9DD6A0D5DB75DA5C9D56A7EBD462AD45506BC02BD476FA4E1751B47C01564B1A44600585B47A8D5A07B27F53D4EAD8E8420302167FA36E580BC182E8E61A33FADECD2A0803BA4462EB23A542192631FD711086476E8B4A6BC8363E8F1B92EDC9D3C90EDCFC9231DB088047D87A886B3A7D04F4F9BEBC2AC2F4FFB957AF67C8DEEF19DF5A34517477113F921FCEBF279FDFA53DAEE5368AB813E32F237C0FC293086F2CC14D25D85E824B2A6C081594DBA4171714769AF15A33AE3263B3CEA6D5EA85425B81DE569FD502D99114B80AB8027389C06BCBB20AA89648D1529A02BC3A0AAEBC864E7CA9639BE150A1E54C087F6C3C387619AC98D85B1AC19BDD4C6BAAB17B15FB995C109E34997881CF317C2BF94EF2656C8B588AD41CCE321955C771D99D82C9A487B5539125828B9327B9234D6B2CA6AEFA0598E62D7C387083DDB2AE65AD99AB5FF867F3DA967516FB0D039C28CDB244B0EA7D808F082BC64AB6DBD24E775B6AD4F4296A9EC3027DB129CE05B7A65BF9B006A9551C9F9AB83143521D5F59B4182E342FC0A1C88C97DA1E899F4976E20E2C620EB781D55EE58E2547F0430BBB93E574ADCEE6876A81B31BEE60FF47EE2F7FDC80F23D3A58556B30E7C15878927F04C2AD06D734C1327E955C6E47AF5CA49CF924053FC9EDE575FC01FE55C129BCA45AA3BA9A95AFA9FF45F3B2B84D7C467BBBAE451FD53F95559DF503C3EB86D78DE34B8B69B7E975F34DE664B6907D302796F34E6E1B2B73790379CFC382FBEF0A5A0A1E2D1A2CFAB765DB967356339497FEA79562942A659992299992299FA05CF22729C39992297F86E533C5B7153F98299992299992299992299992299992299992299FA4947C2353FE6CCB1399922999F2694AA9A7F4E1D2F7C94EF21039494EDA066C8FB1F21F2BF6AEB8AFCCC04A5E59715945D95DE5A6F2CF943F57C157ACABF86AC56F2B1668B13BECC7EDBF72781CC72B57573E5ED55B15AFFA7E35A9FE069477FFAB4B8D2E53322553322553322553FEFF2908A101FE4D4477A0D06D36CBD856624AD337DC2D93690E89DCFD32CDA30DDC35322DA05CEEA84CAB5021F7B44CAB817E59A6352898E2232217F7914C6BD1AD2A9D4C1B8C82EA98B29B191B724EC83446AADC07659A4342EEEF649A47A5B93F956901E9725F936915CACA7D5FA6D5282B0FCBB40635A4F888A830E70B32AD45BE3C834C1B345C9E1F38638187BE8CD69D322DA065D64146ABA05E67DD2FD302CAB74618AD867AB5F5A84C0B28DB7A90D11A8A9BF58B320D5859EF66B408F559D66FCBB4800AAD5F65B416942CE1DE9269097F8996F09768097F8996F09768097F8996F097680D1AB33E2BD312FE122DE12FD106636E7139A3E9FF1965AC699769D0BD6635A3F5509F5D73B94C0BA8A446C22A8BCA5673954C833C35D38C3642BDB9E65E991690B5E608A3CD8CCF55324DF948ED73288635DF9669C0B046C22497C9F3BC4C5379241DF3A03EB7E637322D2052F35346E7D3F64E4EA669FB3F30BA88B6775A651ADA3BCD8C5E4E6DEA5C2FD36053A78BD1C5CCA65F94696A53C976A5ACBD5FA669FB0E4697539B3A27651A6CEABC8CD1D5141FE7B5320DF838138CAE657C8EC934E5730BA5C534FCC534FCC534BDC434BDB2D2DA67A5B5CF4AB34B966297AF20821A910BFE35013588265108BE7B501445E05F02CDA16956D3064731A0E96700EAC3AC451D9CF1A2292804F9A16E175C9F4071761482EF10B4DE079F41D6D200A5138EC6A0368466A1A68F718F40BF4A3FDDC07D0E78CF001F027CA3C0338CC6811E077A1ACEC552FD9094F42EE406CA9E3A6A464E264300384C435B02FD06A01FCA631CED91DB6E82A349A8A5676740C6784A278A4398E93175517926181604B5C2F1189CA1B50186C4521D253E515953C27A9981B3E34C5F7A3401BC67E1DA18AB99815641861C817AC51E5D20134527CCAE8B306CD7B1EB43AC4508ED853E29D241F649648994B684D5C7A186E2379DB2E0A21EF47C02A408C3957140C1CB5A4A1A295A04984CD40382AC472AF31EA6DDC4A7F29E735BAE5DD26B2B9C9962BA5442CB30933D9A42AC0A6D6528C5539A34034717F8F1228FDA148F1E90EEBFD6D775EC5FC6DFFFBBF8FBF97EB068A576E609B3D0360278503B4E4009CB3AD532ECA3204F98F5D0CBCE4C32CF0B006F6A9B7EE649317626CCE268003E1775A79835A035683558F47C5FA77ACF802CD34C4B49DF09266F82D96F84614C5844CE314C250C1229BB2AAD695D947917459FCA1462F20559BB69D9FE4E16EB11D6CF34935ABA765CE612928F038CF734D3602FB44AB073F4AA31268762CF736D9390AF903C25765ECD444A0767EA78D137CE47679A1D07E19A713876CA7E42E351EAD799EAE75C0D248BCD329CC659E45C08B35959D3308BA929163D4AA49F8B3DBD668A5195D0BE6A89AF5E98BB24C3A7C5363D1214FF8C31DF57FC4DF1FD0B69A0F47EBE5CEBD27C806A22E99260FD29B931C6A2678EF90F7DD35484658CC04535957C2FB0C4ABA4C88FCA9F9256124D73D0B49C89A8B48A35153EB425CD771FE7A352D68EC89659E4AE4448584639C6726398C57042B62D9DAF28A3C4048BE629A6A582F252AF7632CB04181D94FDE0FC8C766E2454B2CC4EF55C8BEAA1845846A67DEC61792BC4AC1A803A8AD02E68A19CAB9779EE38274B56C9D1BB982DE229C41469FE6FC6A14F98F789F51C1EDD0A0F529CF2E6DD5027D949F19A101B33A7E4F162D1BB3F6E2C53BCF2E2E319B55C7F2A72E2697304C9DE921784E4BE76315F8EC87677329D63F23823E51E9A19020C7FC9CE8A1F4B7E352D6770A9073A0E48E34A24E52901B4389E9F9BCFFE04B648211460BA47E53147C91F41563303D84831B238C7216C549B927DA65291F1E2B645741C5B32A283B5ABD2300AB251666A499E395FC78FE1C7B26F985DA7B4BE7076739E93DD14ECCFBD9AA226E5D374BD15B916675B8B51B33812293674B27C1F65BD4CA48E43691E42F39664A138705B1C6125A9C7982C2179A49A49D9323D974836AC972D1E67513295924189EBA5BEF4C9514D1FE1252DD3479AA53EBD88C42CC371EFA7B4A3321AD0D960444626942641907DD23E1771D90D2DC6D3C68EC4C7E46329F3079906CA88B77649160F00C728CB38179E5F4BF33F659459C44719C916314ACF294BAF8AB35C21D96A4CD6FBC2636EE022168DA5B48F332F8D30EE521449236FFA88FE693D4019DF3A918F9DED431D70340CA3A59FD574411D9DB7FAE1CC56386A87DA76A871408B01F9BC83596A988D439DD06E888D71120F3F7CF6C2F108CB711D88B0637AB419DAF7022F7AAD0F6D637DF880DB006BE967BC7BA0B61BBE7D723B7A451BD40CC131A537B22C28F5D70B5749AB852E794C94241D847A92D270A9545DAC4745B21E38F203FF4EF9AC177877317E547EDA7F07A37B537276C8927A19469433E5D9061275B3235A3B04DFFDD06E80F5EF653A4BD2F6321D3AE0BCA48B8F49407BAE937595DA517CB6CA67A88DA87CDD5016B5F2320C3A99348BF8B5C1773F484EF96F84B3836C84E8832BDB99A6030C3D9F8C19D5B69B1D2D6A2559AA8D694351A518B403DD03FF36A6B0F3B34F49167F1AB7A5D80DB3F38BAD24FDBCF2671B43AE8F1D49D668634783CC56F4AC53B6A59FE9716EAFC3CC137DAC9597693C90F2900EE6BD92F48A774A7DF4A54922F5476D9B2E8BE2D5E4636244E2A29C1F922D7D3E2E14752FC384CA3590EAF9629CEBBE421A5D8D4D647032447AA29168626E3A44DAA2B1E9682C9008472375C43B3545FCE15D938938F187E2A1D8BE50B08E180C9DA1B1586896F44D872283F49AEEC05C742641A6A2BBC2E3643C3A3D17A3D710CADEE52676FAD5EC24FEC0D4F424E90C44C6A3E37BA076537432423A678271DAD3E064384EA6D2F94C4463A4353C36151E0F4C11B9476813854E493C3A131B0FC1D7446236100B91994830142309AA47D720E90E8F8722F1D03A120F854868EF5828180C05C994544B82A1F8782C3C4D15647D04438940782A5EE78D85A123E8214012B14030B43710DB43A213174747A95C2B5DD91A9D0A92CA9EF0782C4AE5AADA1A8AC5691FCD75AE26D6A296B6E8194CF162D0B5C702B3E1C82ED2373101F2915AE28F8E8523A4373C3E199D0AC49DA43F908885C7C3013210605AC649C39AD58DA96E487C667A7A2A0CFA4D4423893A32129D217B03736406344D504C69354944C9782C1448849C24188E4F03CE4E128804C9742C0C67C7A14908BE0371321D8AED0D2712C06E6C8EE1A9A0968013007E4C2126680F4EFACD504F89331D8B0667C6134E42BD05AE75D26B940E40B1D949D02C4DB259E8341C199F9A0952D752A48F46A6E64865B84AB25E5A73E0F071D24AC6A678C642718A1B35D46207F4F214AF750C81CA30F49208EDA5568D85A1D760743632150D0497A21790A002270375A2D0157CCE24A6C1598321AA266D33199A9A5E8A280450644E6E4E0D020C019FC9F0581864AE3318A86B4D44A7A6A2CC0564A89D642C100759A39194432B46A89C4C24A6D7D6D7872275B3E13DE1E950301CA88BC676D5D3A37A68B94376FD2A302F738B38158CB2B970AC5E28C67E2CB7E8A62D7E4261DE1D059D2834A17DA129883F06F7D268A6502E896783A19F1A27CE4200F406084270D5AE580090093AC9440C6213BC677C3210DB053A538C012BB0285C4EA2631093110A4A80E513C5CF3EB91654A0403C1E85C8A1FE118C8ECFEC058B04A4B00F4F01329594E3126DC9809C507E52C5240A86684690EC70C17664369C98A4D569EEE694DD8D4AAF9C9E0A839F4A7D535E3129A5420F2C88A8864EB2371A0C4FD0EF1003647A06148A4FB28005D663333478E3B452F612D0B01E148F87204703076A6B19A50B8A2A053C7429058D8C3413627632BAF76374A46130138B803021C6201885C4CB64D91D1A4F280EB6E8C7E0FCC1300BBCB5928B07C6A2FB4269E302E43F1A324C1E1A64D38B9E229F8A4F0640ABB1D092C80DA4291AA3DDC713E04C34F542F04A81FE7100D078EBF49181BE8EC161AFDF47BA0648BFBF6F6B57BBAF9D38BC0370EC7092E1AEC1CEBEA141022DFCDEDEC111D2D741BCBD236473576FBB93F8B6F5FB7D0303A4CF4FBA7AFABBBB7C50D7D5DBD63DD4DED5BB91B4C275BD7D30FC74412402D3C13E423B945975F90628B31E9FBFAD130EBDAD5DDD5D83234ED2D135D84B797600532FE9F7FA07BBDA86BABD7ED23FE4EFEF1BF041F7EDC0B6B7ABB7C30FBDF87A7CBD8375D02BD411DF563820039DDEEE6ED6957708A4F733F9DAFAFA47FC5D1B3B0749675F77BB0F2A5B7D2099B7B5DB2775054AB5757BBB7A9CA4DDDBE3DDE86357F501173F6B264B37DCE96355D09F17FEB60D76F5F55235DAFA7A07FD70E8042DFD83A94B87BB067C4EE2F5770D50403AFC7DC09EC20957F43126705DAF4FE242A1264B2C024DE8F1D0806F5196769FB71B780DD08BD31B2FFDE5A817561ABBD87A83AE64D2CF24D00C36C01AE68D25B5136C85945ED3C1AE4DA4D7F1B7F0DFE5E7F9BF87CF4797B4FD53FD4A95B91F9FB91F9FB91FFFFFFE7EBCF49B6AE69EFC7FCF7BF292F532F7E533F7E533F7E533F7E5CFCDE6997BF34BEFCD2BE864EECF67EECF67EECFFF99DD9FBFE01A377CDE1A97CE0269C6D9C7E658B0E25D7276239BDFC4D91892607974E9BAF70DF8DE83FE0057BF01F5E9E7B6B22BD26B3AD9F73EB67E5E7AA69FE59918CB5952669ABBA8F44B24104A850DC23AA14D5825AC163CC225C26661CD922B072FB882DF4CBF7103D42FADA5796D1AF459D207B6A0DFF06590B597A2169567D8BCF4F4FF5907FA19BAF01F2C7F57D2DD00C1A9C82E99CE8F4BF406F8B7C21BDB1B7192B6B9D894936C8C85F63849772011F1C602634E72FE397A9F526AC1B86701E39BB82388038910771861EE76EE1EC473F772F7027D1F771FD0F773F703FD00F779A0BFC0FD6FA0FF93FB10E83FF21684F96C3E1BF17C0EDF01F4467E33D0DDFC35401FE00F208EBF967F0FE8F7F933402FF049A0CFF267112F20218EB090101240CF087340EF17F6037DA57007D0770A9F03FA98700CE8BB84BB80BE5BD588B0CAAD5A89785593AA19E8D5AA7540AF57B723ACF6A9A15F75B7BA07E85EF500D083EA21A0B7AA8781DEA6DE06F4887A3BD097A91340CFA86780DEA79E05FA0AF58D8853DFA4BE19E85BD48780BE55F357086B1ED43C8878CD5F6BBE05F4B7452FE2C456F12AC48B578BA09D7840BC1FE807C4B781FE0FF13DA0DFD7422FDA11ED2CE2B557E8B508EB757A03E2F5467D25D0557A37D02BF50F01FD65FD23407F43FF3DA09FD5CF03FD7DFD8F80FE27FD0B88D3BFA87F03E837F5A7A0FE6DFDBB40BFA7FF03D01FE83F00FA433D20AFFFA3FE23A04F83F1F82C9CF50F0867CD67FD00E8E7B3DE01FADDACF71097F5BEC18CB0C1622842BC6199612BD0C386CB81DE61847E8DCF1A9F459CF11F4C85089B8A4C36C4995698EC8837394C1BA0A6C5D402B4C7F412D0274D6F02FDEFA6B7A0CD29D37F42CD3BA677A1E63D33FDDFB805B38078B3CAAC429C596DDE0F35579AAF849AABCC603BF35D66B09DF96ECB8D085B6EB2804D2DC72C506FB9CB7237E22CC72DF49DD482ECE71CB2317F903C41F201D9FA80BC1F701E14C19AE2361170162F15411731208EC3E784380D9FFBC439F8DC0F36A2D6B90E3EAF17AF879A1BC41B803E28DE04F4CDE221A06F156F03FA285890DAEE1DD9521CD8A80668A7BE1E1076E95DCC0AFF0EF45BFAB718C2DF87CFE7B29E039C7F0068536CF3E1B3C05000A8161A0049431145FBFF00D10634840D0A656E6473747265616D0D0A656E646F626A0D0A3131302030206F626A0D0A5B203237382030203020302030203020302030203020302030203020302033333320302030203020302030203020302030203020302030203020302030203020302030203020302036363720302037323220373232203020302030203020323738203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302035353620302035303020353536203535362030203535362030203232322030203020323232203833332035353620353536203535362030203333332035303020323738203535362030203020353030203530305D200D0A656E646F626A0D0A3131312030206F626A0D0A3C3C2F46696C7465722F466C6174654465636F64652F4C656E6774682032303830342F4C656E677468312035343937363E3E0D0A73747265616D0D0A789CEC7C797C54D5F5F839F76DB365E6CD64B6AC6F864942C8242424210B0432900524EC9B49201276509084C5026EB8158C56E252AD2B5810716592200E888215EB6E6DB575AB85AF05B50A522DA05533F33BF7CDB0F9EDF7FBE9AFFFF4F3F936E771F773DF3DF7DCB3DD671C4000B0522642DB842985C57F8B6DB9060017516FEBDCA5B3DBA6A4953E0E501406601FCFBD6CA56FD4B8FC3D00A15F00480B16B42D5CFADD92817F0528B903401EBC70C99A05A3CA8AD602D4D3F49AED8BE6CF9E772A5236991A4729952DA20EEBA8A443F4FE2C6A672D5ABA72754951DA65D47E1960E0274B96CD9D7DDB89EB6F04B8713B404A74E9ECD56DAA51A1368E267CDFD2F92B67BF567DE94B00EFACA676F3A5B397CEBFF78D1D46802D845FF464DBB2152B639970278D3772FCB6E5F3DBEE9853F12240E5EB44DF6BC0F7AA58DEF8ED9013A9B36C55270D2906E0B065F9AFF6F1F2C8B4F405DF7FD4BBD07450F91E1818757C0E542AC3A3E3A1C6F4E8F71F7D37D97410FCA0C039605AC5712C5158072A58682EA3B210A613D73A695D46A382B0013B410283748F54029998A697CDC26F6101731824669645C698918987C01A03583D23BE2EC0D471353EAAF9B25F97DE8E5E8825CA70EC0E01EE3BF80D1D5A8EB487EF144439412CAB3C9356B077D1053F025C8FE28FFBF4798FC2AC7FD4FFAF82343DF6AE5EBE047B28CD38DD2F57C24B093A579DEE1357C064F951684E8C3F234D87C6C4DC56AA778A7F86D88FDEBD8FFA8FFF6FEBD33BF5F7D16657507D09A58B13FD8379892FC1B0D3B8542FA3F56B68AC96D23C7145EC0B9DC647A90D309EF392FAD79D7937C47AFF2113FBE0FF14D0B95FF9DFFA1EC55BFE1DB4F4411FF4411FF4411FF4411FF4411FF4411FF4411FF4411FF4411FF4411FF4411FF4411FF4411FF4411FFC2780F83C2CF877D3D0077DF0AF02DEF3EFA6A00FFAA00FFE93407A11E6C916785AFA161A8DD3E1422A7B04163B7A7A9CFFCDDCE93A33C132BD9C0857537FCEE97E8ECFC7F8DFD289EDB1DDFABC17E04AF15398202E83F1FA3A85B09697F879BCADCFDB0B13A49760BC7814C64B83E07271697C4CFC90FA964299A8C263E24770ED195A96C5EE1497C07FCCDF5D9DCBAB3EE8833EE8833E38034222A527FEE4FD076A518D3110E110B54BF9DFC38313FA417F288011500BA3E002180713612A34C16C980F0B6131B4C12A58039BE1091CC4DEF7197D85D9AFC7F85F99FB12B36AF4596361024C86469A35579FB50496C3EA1FCF8AFDF99F78E6D2B3358A9F7DF2D9FE8F579CF93F0BFE3F016538FB3F25D08681FD188158234ABC66D2DBEA3F784916E4F407C8837C80C222282E81C165E5D43DB42A315E0BF5A346C318DA3B4C983869F2149836FDC246801933FF359AFF6710FE79D4DFF3EC8378FDFFFC2987464E9B1AAA1E3EAC6AE890CA8AF2C1A525C5838A0A0716E407F306E4F6CFC9CE0AF4F3FBB4CC8CF4B4D414AFC7ED72263BECAACD9A64319B8C064596448121E4D705EA5B7DE19CD6B09813183DBA80B703B3A963F6391DAD611F75D59F8F13F6B5EA68BEF3314384B9E04798A13866E80C26AABE2AA82AC8F7D5057CE1376A03BE08364F6AA4FACF6A034DBEF031BD3E4EAF8B397A23891A7E3FCDF0D57917D5FAC2D8EAAB0BD75FB6A8A3AEB596DED76536D5046AE69B0AF2A1CB64A6AA996A614FA0AD0B3DC351AF304FDD902E068624A22A9C1AA8AD0BA7046A39096121BB6EF6BCF0C4498D75B5697E7F53417E186BE606E6842130326C0BEA2850A32F13966BC28ABE8C6F31DF0EDCE4EBCADFDF7173448539AD41CBBCC0BCD9331BC3C2EC26BE863D48EBD6863D6B0F7BCF36E9E58E9AC6F5E78EA6091D75DEC53EDEECE858EF0B6F9ED478EEA89FE74D4DF40E9ACBB2EB5B3BEA69E99B3917BD854408279F6F25BEA9F9813ADED37AB12F6C0C8C0C2CEAB8B8950E24B5230C93D7F8BB535343BB638720B5CED731B531E00F57A7059A66D7A67739A163F29A9E94902FE5FC9182FC2ED51EE76697D596A85892CEADCC3F33A6D774745E6B987C869DC8290A5C406210F6CDF511258D01DA4805CFE65740C7DC0A422368429A159E47C7B0386CAC69ED5087F07E3E3F2C65AB015FC749A0630F1C3B7A7ECFEC448F9CAD9E045EE5C27146C068FC743D1C0C86F3F2B85C2835749044E370BD3DB820FFB2082B0BB4A93E2A887D30B191A6350D29249EFBFDFC546F8A84600E35C2EB2635C6DB3E9893D60DA1C2605398B5F291FDA7475CD3F8C8BAD32367A6B706487C77EABAEE0A1B72CEFCB3A9EEE4BA4543C2E8FE5F86E7C7C71BA6041A263537FAEA3A5A13BC6D987A5E2B3E5E71662C510B27D7340A692C516369823E4A9238F30C326F345AC26236FD9375499E17510C248A7A0FFAEAC36AEBE878DE64F2FBFFC94991D85FF92CBD383B2D41667848F0FCF6D0F3DAE79167E91088603187354C6DEEE8309D37564F76A7A3A33EE0ABEF68ED981D89AD9B13F0A9818EDDEC21F650475B5DEBE9138DC4F6DC9416AEBFB98936B1088790B43218D915C00D93BA42B8614A73E36E952CFE86A98DDD0C594DEBC8A6AE2C1A6BDCED2353ABF732DECB3B79C3C71BD08024E8DDCCA0E3A7ED0E01ACD34745BD436FCF8D20E87D86D37D0873232CDEA7C617CAD1170A919F9E1B11E323A1D3D822F519E27DEBE2D8B9096C038DA87C640F301ED9F0C13870535133B5F15C79D095ACA980E46B8405A6B26EFEE01790011AEB6261A8A232DC23676845CFB04789C210DBDE5D59128AB0ED3DAAAB9897DD0A6F3ED26371145F3DC2CEB6C10E4AFB281DA7244211E51328CDA224D0F46DDD1B39FEB6EE597AD1337E52F13A5E8E1D57ACB743A3E3A529295E1A87C4CBA2128EB7B5A76E356F6FED291E126FE70D8AB7B3B26979956D251A8FEBB98DF2424AD594AEA624D2E25B7B5C19F16946279FB6A52735ADD8B68F6D218C2D346F8B4EE2969089861D13E4090A3B3EA29CB881B049CFAFD6F3597A5EADE7857A6E4B8C7ECE57D7F37D7ABE43CF0BF5BC5ACF27E8F9323DD7F1F1183D47E9F9829ECFF1F39003F2113454C91B6A18CAC79086BBD188E6EE52EDD6089A43E5A5DA405F8D564CA9C4374ACBA752A37479DE68AD80923FAF562B477A2F1891DC1A783C74B40EBB2114C1C79F8EAE4FEA5D9F04C6085677E78DD546187108EC11F9726594EEA12476E72DD79EA3D93EBD4982CF1EEBD6BE2F88E0F46EED3B2D62C06EEDEF5A84612859FB563BAC7DA33DA39DD4C668AFE43DA6ED26AC7BBAB5881611096B735E843D16B26937699389B8C3DA6A6D8976A94F1F5AE2A72264D6E6D2A4E6BC66AD912C2CAD32DEA7AF324AA3D7ECD2EA68B0362F82B84B0B69376A2505FAD4623E759736485BAE0DD4F4E5F2E3CB0D88D396CB8B5D5A7F5AAC9FBE4A9D362DC998642CEFFCA3D2B95DE9DCA6745EA5748E503A872A9D654AE760A5B348E92C543A834A67B6D299A1380D0E836AB01A2C0693C160900DA28119C0E08CC40E85823C3E76CA2A2F6491E7A25E5719CF7928CD950D0D8C82DF70B2D0C01AA68CC486F0FEB9D030C7173E3525104113992F293012C38E0668983AD21BAE08364494D8E47079B021AC4C9CD1D885784B13F586D906320F531B2398C2BB6E48E3E1C16E3AD5941B7E96C6CBD80D3F6B6A02F765D5DE6AC7707B657DED3FC85A1379F02C7883E741C3C435BBE9941B7B146D9842CD29D4ECE4CD4EDEF46684EF6C98D2187E34A3295CCC2BB18CA686F0ED537C331B77E393F8785DED6E7C82174D8DBB857C7CB26E32EF17F26B9B9A1AE868743C12FB2739DE93BC203CC31FA09AE341B5E10F3A9E8871BC808E476217C773FB20A0E305DCBEF3F032F1098E97C70BC2F31C824C1D2FD373E81CBCAE3D81BADAAE40E0F4BBF6E8387BE2EF0A57E9289A46287E4D472155D174140D998E527F16A5208132F00CCA407D2501CFE268719C24DF699C24BE52F09F82F92383C1BAC55C5626367619606413394FBD74AB6DC3F5734F4A19FE50DA1EF89DF00598297E3051006A0E8C84EA6A6F50ADC242D91296A94BA1C4B187FABD57A5ED1101B7EBD816EA4E4A0C158C2818C187487AF9909547B28921EF5543FD697B707B6248A56E3BAD710E9D2B57AE22006FDDE2DA33FF56246055A25C090DE1BC290DE16A722F5D8A5247C15D6D13F5159DEE339BEB22B1FDF1CE81D459C53B05E10CE2993EA3318148DCD835211F2768584E243405571029B4D0B91C5CB942CF39B13A794190F6408A9EB641AA98035E80D8A7943EE3657471EC4B3E165D16FB987D4C6AFB5422C5612FEC839BA107B6D1D3052A8A308FEE8037D1F33C7C0E1DF04BB81577C20A580B5BA9FE0C3ECBDAA019D681876E8B2F40110AB1B7E071B81293400607BC026FC074B835B61193C10C2974635C0EBB85978577635F623D5E4A66238DEE9E936197F025BC87221B2679A515B10290C008BF8637D858A2DB0E2E28A77BE6789849343D4CB4BE081F62AE5413E3BF24108229B4F21AB805B6C0ABB891CD67ABD856E165695AEC9E18ADC27F330072A05EBFCDAE809FC03DB48FE368C2647C1E8F085EF1BEE8D7D1BFC7B6D2CEFBD3AD7804D4D19D771D1C80D7E07D3802DFE2345CC0826CAAD0264AE2C2983BB69368CE8062327263E8BE3C0D5AE10AB89A38763F74B12DC2CDD103D16FF8EF15D053405497C310DA7F33F1EA0DF800ED9882D9D81F47E3145C8C9BF17BA6B04A760DDBCABE112421979E32618BF094F0917050F84A1C2DAE163F91CDB1DC58436C516C756C536C5FECBF88A71AE4D29DBB99B87111DDB9DB684FD7C075B0814EEB3E7AEE874DF010EC820890C2C3DB7010FE0BBE866FD08AC53814AB70012EC1D5648F9EC2A7F137F83BD6C266B35FB2378480D04C6B6F25E5A815278A2BC4DF45215A11BD39DA157D33668D75C75E8A1D8DF5123735E2793671B4806EFCF369E51BE056B89B567C0C7640989E3DF021FC11FE429C33D2A3A2133D988503B0000BB10C27E2246CC685B812D7E0B5780B76E2DD781F86B187A8790E5FC40FF033FC2B7E4D9CE13F03616636A6B17E2C9F15B0816C3C5BC8D6B34EF6387B8AEDA5E72DF60E7B8F7DC88EB0AFD8DF05BBE0A4A79F90238C16C608338565C26A618D7095F018F1F335E19028D2F9D9C45C315FBC5E7C48DC21FE46FC42FCBB64966E916E977E211D918EC820ABF23079A2BC48FEB91C91DF57046592B240B94AB95AB956D9455E3060781CBA493BBA68A7E7009B090FC2DBF81CFC09B7094EF6184E640FE39D6815BC7089702FFE566A801B59150BE338E616FE8697E165E0121EC1137002765140FC1E06C5877133EC254DBA995DC2568B36BC507C44ECC595E2EF44811D866DEC4BBE8EEC141FA6D5F8EF7D2CC5E1545B084BE101E684D728BABB01DAE157F0806C649D74EE1B21878D86C178013F1B761CBE20EDB063355C4C7AD28B5BA495EC415C2B7CC62C301D7BD9411C2AAD8405E4D9AFC11E365E780D0F93E6ED257969C045AC12E7402F7C82BFC44FD83418C7AE832DE242E91DFC0883385E5A44F207E221E10261014B66CFFCB78F313B602769C21B3056781966E26DA4FD6FB0205CC096C1FDC2B3F817D88957880B854544E56A26E275A40B8F438F305A34C348D829EC84E770BBF0070CC20E71355E8AB7C7EA7A5BE0A4BC4D7C52E892CAC4F4D8ABD13FE243F8566C0FFB0ACA63AF0AD3A20BF13E3185F4F20AD2DEE5C421333C46F3EF238BB10D0C54CB267DBC85E4D545B6CD485A5E4F966B2C5C845F93C65C475C2AC35C18CFFAC1256C84E2939D004A7F7834C635F95218801F88DBC93EEC11DBC5EBC453FCF0F9CD54A28776A9C0982E86CF90A3944161E5DD2089111CB8530093C22B4F21A41864898F3310B0A6C738E3397260A7AA7AABC6AB27AAC6F5564135D5D51F281B54E4B7FBEDD9945194053FF884FD3F8424F81E7CE27EFED572056597920DE7567256C8AFA1C6344113C50A921C2633A3200A14FD1AEA641018C82629827F0BB949828476631D6B2F9427C8B364414E310DD9E00DD2DA2DE30EF71E7654161E23975A55A81E4347A5DD51A928838AB0A5258D9598597989726459F587B5EFFC39F87A10970BE9981F7DE687DEE82D6FBC01B118BA841E81D39303263BA00226E45F3B5D3D883244B0E1E9D1FDF5EFAD0320883C8A4451E8610E9DFEF6505508B64AAC4D42494411A55C86582B0A4E511424649483880A136F15B093E582F48E20E412F776299022CFB89E537F789C7A18AA8355A0F65605D5C3EA3120DA2BD1EEF054AEB70E0C4A57AA078276BDA392EFA71D936933028A96D237072F167AD071F264F44BFD5613614FB0A5748EBE908A9703DB21DC23E10E48112F1BA97369DC61F5D461283C36A828B9DCAFCCCA61B9D918798A1C27E3BFD5221EA7FD286085CDA17A832C33D9605024A3C922CA06ABC5A2C8069B64542D775990F9486432158B53512CCC228A9902730A0243C546CA2EA896EFE9966D34F8253982CF84AC8A422C10C06079C476DDB5DE608A7A02BCD5552A7F4E909C54571D43BBA792F6B77E6070FD9507D60FF406F50D130BE8DF7AD57A403A7060BD9E2B6AD57AF5C0A0A20096240704BF807E21A7BFAC0C10AA3FFDFAB951BD3BBEC06A3C52E93714B74A7BBEABC76DD166360CDB3EBCEDAA27883B7B629F4AEF496F93B7DED473A70193E942D063B397EA1703ABD55EAAFA547BA9DD97642FF5F2AE41667BA9E8757A598EB35AAD1756ABA26A75BA5D29AAC35669BDCD8C959DFCB2203A0ACC424A816884CB89F9B3434EDBE556775E9182850A2AA5E9D69A8CD21ACEFA4F4844DBC71D538F9D20093D567D8C44B5E5B0DA7BC24E7B24598D1F6C8B1E0A410B7A6408F8C0AE2697F98B458F929313F029B2DDE92E292E13DFFED5CCE8E60FA327A32F7DF90E0EFD0BFA3D4F673CB531FAB76D9D7FEAFEC52926A645A33F505C528437A3F0E9776FDB37DD7FFCCDE8918FBFFC35D7BA19A4E9DD74CA36F0C16DA1311E1F6D329D67E0F4398B9C6127596E9B8FD15D355DC3B474CD5788853E6594843E55CD042453829ACF8F98CB5872A5EACFB5812135CF30A99F1A412564B74121AD51EF6F434415EA27798385C1AA16D4D5F3D878F5D438DA7B55B0170E93ACABBD5025D1895FC9CF93B6DCD2D21E0C96A0BFD893C95C4E26CB8A1CC82E292E2FE34FD9E0D29CFE3901FF0C32E87B364D5DFDE8F44B9E78F69A391BA3EF7E76FFDAB165A3868C9D7145EBA83BA3BDD21E8FB6E9CB3BBAA21F7D7465A6675B8623503066CEF79BBBF7691E3AAD97629FCA7E92001FBC4EB70D3A633B1DFB280D33F3A874F9ACFAC97FD6C379C225600455CCCE34A7337DA8AB5E9500FBA50A1A64E4FA342D21F15A6672A5E336AB2F17FC2C972C85BBC02A6414C8C6E43C0733325588E0F090A75F6A5E91090B4D682A15FCB9D42BF84DA5C41B3DF00F92C2EFC7F171E138C55BEFE01909218BD0AB5B85C386F5A7CD40DC3054EAF21297962096FB05590CF8FAE7D855475649B1DBAD8B4C3F91184922539E2C8C0AB06BAF5C137DF5CEE8FE076EF80BCE7DFFBE6FAFCFD8AFBD70F7A6E8D1873ED8BFEF8F23D9C86DBD8F8D6D7D7E0B021AB0EB37EDCFFEC275D7834F44B7FCE9A38FAFC2A1FC62BC8A04E812921D01EE0819558922A36A894914E1F7E4E495EAA537A097A1FE4E5729138484C0106798900B0646465DD80C46249F157204AA0138AE3DB55FA94A6F7F40A4480B3C0FDCC5EFB755185C3B5EFD2B6DCD5BC85B85C1B5E3D4AF7883EABAA5A4B45E4A480F4D20F129C1125C85252F44DFE4BA4F6F9C4CDA59AC5BE85521EFF9E4887410FC87B87E454E6D40284DD149BB5C272D2EC3502FEBE4D4EFC601700E454442CB8FE9E1827D382ED855E792C509F22B93B1F8409482BB005175741BE7633379B1EF882E2F1B17AADE948A6542B9526E2C534729A38CF5EA058E2661866389B0545C6CB8C4B8D8B23869996371F2B2D4358EAB536F146EB077381E71BCE738989AB629F5602AEB92F9C7C09D26484D91B8E85A92F809BC154A2559B6AAE6F452578832C9651500CD0E3018E8965C4D26B78AFB162E3EBA2CA5ED065BEC50B7D527EF8DED07899248271310444962B26230489624ABD56C53ED766BB2D3E572B83D5EAF6B83D560F44562F37B2487DD17C1DCD0641739062649990E97D321191C2E03D5ED56A75D6276ABD164CA345B9D6633FFA5B94CAFCB496F90D0EB6A6646EBE5865C120E645E47AEC36E379B4D269216A3D164344470D55312FF0EC6223834442A08977B8D2E97D1EBBD5D325AAD5CE606044BF5D295AD97A12AAB5A6A2D346F32EF300BCBCC579B0F9A0573616A752A4B7DD544445C6E349B6F37FAA44E89B592BF965252AD669757357BBC9EFAC7F54F2BDC31618A9D1BE8F6E05A7EE2C1B5FFC573F5EBF6B56A4BFBF39C6B29D4A9C6C7F6C71B1C25453DCC95FA9C0A975395349832EA806ABD3C5615F7F009494938BCF5062AA5732BB410F77E07FEC70C2A2A2AB0A2A2896C417BCB7292B764B7A7AC9CC42E905C962C2B18D0BDA3D08CC55FDD91611CB691B193D1379FBF7BF0DCEA96DE3F3D7BBBD398E27D41DAF3C398671EBFA357B8F9BB7AF6CA3758B2F1A11F46088F5FF3F8F3ED3F3491263C43367320D94C956E4D778652FBB35C335B937CBD9379B9DB38EB4074776A564B33B9E5CCA40E39D998EE4E4E4B177371B4F7C264B28B82E02A4832A6E6C9FCBCB22A4AF532AD9F5E863C6E4FE93A19E5497E7B5E1190962394FAB8991C1FF79CA465DCDE8D8B1BC7B3DEB2055A9255F093B7742ABAD3E897C5CA9D6EEE2ACB1C834B59A01F5DF05FC41A7460D385237EDD7EE7F670F4E0CF9FBFE49D55EDAF3FD87272E727D1CD6C016EC023D17BA3EFFCE1E91B5F2A1BBD1D0B365FF3DEDA4BF6A167FD8728467FC23D672379CE9FEB9E3315EE0D556C171F4E66F9C943925727DFE810AD6AAA2D59B5AAAEB464664FB5D912A6C6AEFA4971202595CC3E321B49756A04F785FAB9F20AE56ABAA5B5CA6DF23A59961793B35D890CD584035D4C8EB325EE394FB58CEBFD246EF174034362493153C2717221D215D85EA95455719E400B77A16EB7CB6965C40BBF90EC2FD6BD2739CF462C61F3366D5A34A67DE5C89F75466FBD6213D6EC0D5F5CB1E0D6E80669CF055D97CED8BB76B8CDDFFB04FBFBA46D2DA36704899456DAF5BBB46B0F64C1F1D0357E1E2265F82CF6D20BCDC86D82EA70D8DCDE2C4F9AD79D6C94B4EC647796C793D8BD83F860353B09CB61330BD9D61CCDECF0187FEA4E6BF5FA89421704B274BE786CB936E292212BCBE8F19C36C264259ECA366A793EB98802D19A1C6E8C37D6C42D317185048274EEEBB3E6F81CEF7046D74EF38BFCA77A24E13779483D3068E56A26C5F50E1CF1489B38C8958AA7B86F3DCD4959729370267365223606384BCB87B3384F5B89A70B77EDBDE4F3E8F71307CCAC68FB7071E505C58B561DDEF008DAF6562EBB65FC908BDAA3FDA43DC3B6AFEB391A185A794D47F428DAEF58D250D8BB4AC893CCE3AF1F1B9AD58F7B854E8A4E67919E95C3FBBB219F7489E2D03CAE4B5EAA5838CB570EBC76002B13CB0C157EC15886221F2CA5413F0F59159E65179615DC61166C49E6BCFC81B27B7046653A546246861B7170A0C02DC805838D742DE0B634A97F9ECF51E46036479B833922ACA4A7C29837882BA289961AF452465E6A6B3A6FAAFD724B7DE945E9AC30FDADF443E9427A84DDD453F9321D857A920CE489DE13410A5C5ADACF096CED9585748939CC999A8852482E79915CAEC435737069FF1CFEE40C2E2D2B2BD1B9AC28A5FD0792B62A32052D1EFDE1BC17499F3BF7B3F13BAF08EF1E547CF089EAB9175D71FCCE9E53CBF059B373EAED333637D5565C50FAC2035513A7DF1A8387FE1E7D113F70944CFBD9B87BE6D65556B436E48EB87B4EFBAED6D52FCF30BA6CC303C3A6968C2E9F51366D40C6F4FADCC177B5FEE4954BDFE7DC8F919C6FD56F3F9B4265690C7DE053CA28C0138C069405962B2B4A42AA25E6A74B8E42BA2CCB4645E1F2AA210F69B831F3F72BD5831A4B7A666921144198FF854B045FDC65D0A3898DFC23F5E9682221BD41AEE7E70B70307E8B4EB887F343BE163FFAE9EA4621F86FD116D502E2B5816820FA9594FCF0C3DF1D23F262FB28BAE84F3B71E192D010D167AEF48935491D28549A86982B2DA3CDA32DB5D61ADB74F3744BC4FC2D9C749E707DEDB60A420E945936986FB46C4F3A65568C668C071621939579DC0E2FC510060A2F423CA240479241E4DFB51805FF7A30118F25E291446805850B4693D90CA2C4430793D52AA87687C369B3B1648743A5F0C1425267711904AB99186F66B624C1EAB2181C1EB7C1C15C668A0E5C168EC5B8F910C87C08492F200A16B3C098CB4676C2D50CB6666BC8DC6CF109CD2C64552D11FC75C842B716EE34EE737FF12A5D32C78F23B711F4BE938A29E328864E45AF7A2C358512952ABF8654F128A88A44F558C29826DC309C61B78D80AC4195E180952C03E5DCEBF2A24AB71455070C07B8E75DDE4ED21D0CA0EE7D75FF4B8713F7BC3882ED8DCE7EEFD90673AA36E65E1C89D03B146FFBFD97818165E3A30BD911F6FBE8CEEBDC836AE76DC129BD661A23F1BE6072742C97C8E3748E85748E1638129ABCC8B8C8C4148A896433E69A2D669325218DB2D9240BA64CA3ECA43119996C6499824C5713D9283341B4269965144C46621DCE242342526B562D97932C46F0E55D49546E7C55BFA421BF7B606F3CB0E67CF2EA2CF2243E420C0C1AE8662E71169DAD70D974E8F7F3037169D90D86D85B3DEEF45225122FE544C96587DB33255152FF67DD5426FED304E7628B3FF96CF822B0AACBA2C37EF7DEA89A31EBB0F1F3DEDA15AC5CB82E3AF5E6CD1B1EC41D3F5CDAFB1EF7C8CDB1CFC4327138F487C1F07C68D28C02CC36659B0396ECFC213806E54243A5E142FF42BF589A9F67160B737392041B6467067283427292A938353718CC3725394DA6247796E641CFE4642D55C931156B82D9D36873A33B822F84320B7D724E99CD97098D6AA02DC002B1CC90DD510A996AE6B24C21732F5B4D063B8772FD8EDF121C77AA85C48B7F69E9A51A3788D5C77A5B0EF3AF38D6D3C2755AC03867132692CC63B64CA18B6E0FCBCBB2CA750B19E8272BFDB97DE47FE2A50864183D819C640A72ACF18B5D5999A05EF4E4DCDB774EFAE9EC61386D8C6B60F59AE5B7FA9FAEF8DBEE175734A60C4D773F6D1B9673E18207AE1DB97876F3B6D6EB27353CB1BEE9C6290E8B3563CCA0EAACE2F92DEA03DB2FAA6F9BD616FDF6AA09C51795E22736D5680D5E543976CEAC47B914AE201EBB89C7697073C854292C762E4CBB4B16F5EF23D32814A834DD646733D316AB5718D7A8771B24D9E9760E30D660236B34C8B62CEB143366155110D1C9EDA0E8D0CC4A8A269AA1D1874514EEFCD5EAF62939E9B646B0AA56666DC8A868E06C3CA57F2C3841F7E1132DE77D2C39AC1BC096F8079238B7F4EBAE4BBFEDCA09A608FEA76ABFDFFCC4BB1D880F3DF67237AEB868E9E619AB1B1B1FC4EB925F7AFED02B4FE2C41DCF6FB2CC5FDE11FDF4DA0D1B7E4A92B48476F98A1EDB69B07D376490F7A5CD39F82E67D145CA28C856312345586C8924EDB22A6EAB33638012708DB25E68959D1E2C44BF29DF35DDB4C0240DC1625395AB01479AC6B864AFCD66319B9D460BA46946C566353935664E7ADDDA68795DB5CDB22DB36DB689B60866EDF2AB3E29C797B31BB321FE954E0F76F9074DBEFB2A4AFC36428A76A5FEA9A485827DF21BD9090E70F948A6901F75D7CA2587986165827AEF2377BDB2E9F8EA5FCF5FBD33FAE6C3D1A2FC8BC75C3EEFA7D7CF1B71C9E2D1F7741F7CE7573862F33E36F4BB7A7C76D9BA69EB1EFDEEAA5B86DCF407AE5917133F46D0A9A7403FD8BF1BFCC407233144E3D19F9B73A5917345CEED7793F7A614D19B322A9529F054CA8B29428E906FFE49EAFA5411382EA4A582E040BB2D03B2546C25E7872A4EA48A8853C4B4D47C7BA76333451F0ED1A759140F49060522B785D29C3E434E20C3670B797CA560536D6DB683C4A9E15939C3E3E2118CCB479C3DBA70F06FCEBD2DED8775BB4D3AF54A908B0A59667E57F3F02022E78CB03815BF1C9714F4C799250B13C339D1E3CF5EF6E2C207117EFEDC9FAD3F7C2DDE38B76567348B4DC50D97ACDC878B1DD71D5DFAD60D4FE2A84D475F1F3F594BF9F9FD6B716DBA65C3AD9B895F83A3178AD713BFFA410966EC869CB8FC0C8AC4CB62CEB16AE29838C8398889DE4AE3B49CF939EB064BD9C1A2C12CDB91EDAA862A4DA47027DFE3319952729372BD29290193876C9387FF4EBA4A4B44D82DA192A442CDA978733D72AE966492B50C9BD76B4C4969A46BADC7E8761B3D577B50F3147AD6797EE311677910C8AA4558F64E63C0C70DFE6F42E9CCB791E28717D59C6A1302FF2095EB514D1E53A9296796FE3D2AA87F8E6A69C74FC87A1D517B836BBF6E69695FAEDF70F7EBB75DF52DBDF8EACCD517BCFC10F49885C78187CF7EB0E61F6FAD2A7949FDFB9E2EB3418F472627A97FD62B3F477ECB4B042B8B1F52F2FF63EF4BC0E328AE75AB7A9999EED97A342D8D46CBACDA35D2481AED96ADF1A2CD96645BB62559B6B0B55B5E244BD6E2052F2CB600B319B32F31E112209000DE8D0818784A624200939DE406C8F748E0267102B924E1066BFC4E55F74823017979F9BEFBEEBBDF934AEA3E5D5D5D5DE7D439E73FA7BA6724DB688818A5EA71E959C6939C5BFF68B53F2DEA96635F7DFBA9DFEF7D6B20E9B19F78075F3B78E0B9751F443BFA97AC7D76DB912D8BAEDE52B4D1B2608125664DC9F9C6DB2EBD7D12FBEEFBCED39F5DF9FA0B9B16ED6FB033ABB615D5ADDC8B35A3D73D5075E47B44CFE7C32689AE6869B13F283ECE7E87FD80FD33CB092486ABF517E72F170E081705D629F88563C233C279E18AA0413CC76156A3056566D318ADD6CB6199D4743069186920E849E3448681D0B08F13244C42C3288E231DC6428707B88B1CC305F5E67C6E98C4849CAD7141C4F252E60059F15ABCBEF93417ACCB2EA79709E529E55C7041323D3AB92C45A9352D7443AD9C069B28AF722A3147D927F895BD4D6D2AC8A469622A3D3A617797CF7875612D89395B3FBFBE4696B2D0A5881854CB9795692525CD1CC81CC045012DB606585C91792A33B4E49DD3EF70975E7FFD332B97F2D9CF097214826C13A96C43C1351B79BC9C3FC05FE4591D76F27EFE18FF0C7F9EBFC26B1996F54E2DCB21360D897429AE0F09518AE8D079F426620EA08B305D413D20EF26659DB071C3541C0D521B54848682B151E5282C344484468F4C09457004C252D61D69A45EA4EC4148282C244484446B4148489536D99F5D484E7AA3664A6E4A745FBE32099222CB32B810E79D9E5A975C0C91DD01F01619B82638BFD2827D4141CC3FE67BDE7BDEF7A6ED55EF078CE63EDB7DDEA7639EF63CE37BDEA6A93035EAD6989AA2BA4DFB7D1A017B741E53812E60AAD4697C64E0CB8D523E9B9EC13019194492D825950C61C89E71A2C3E175BA6417A97061A7D3658E8AF25A6559261532B65AE564A7C6EE34184095D3B026C3E9B082F87DE7F00F8246D92C4435CB12B24A56C67A0E6F091A9D8992A319DC885372324E52E3448C94D18C25601A2D471B10871A3361625C925396AC44A9A944D43FB286033B128963858CA426B0F2F80B7E54DD23313A0499E03148D444C2CD9924505A1355C5CC561211B406AC012DCD246D744BC225AF55F5EE9A99F4E2774E27771D6BED3818BDF264C7C183B6DB4EDF615D54B6F28956EFD6D3774B0BF3EBBEBED9D3CBA53C33D0D87B5567C7BEC1DC81C9D5CC8B8DC9F965EDC7BE3639C9BC5EE3CC0FB63FF3484884B95C02614D09CCA50DFD31B822495BA065BC4C92AE90A9D435324D866E66976EA7E549CB79DDF396EFEB5EB598D8181BC3413E69B3D1B90A4A25DBE95C090683D728C912540C4AD86894AC4E18E9391C0A5A2072D7A4196C4623F86B241925E11C3E7BC2D02CC12E682C8710DEB8DCB8C1D86FE48CCF337B01B1193C7EC2D68CCFE1F1A035626E6291CDA8FA9AF0D352B2AE063BBAE049574DCA32CBCB905D7A1F3C3A68B02A71B24CA2489C2E5942B0AFAE3385253E43D65A76C93B8FA66E196FBBE668DCD8E95BA26B2A0EBF1DE8E1529EDBD679F3F0BCFD937B99AFB6FB0B165DF8F75014187427C4190D203D1372A19DCF210BE0E42AC0C978F2242655C01B3DDB3D8C868F8F961DEC5AB925BAD1D1E8EC8FDEE8D42CE6F1903422EF89DBED38C5F2094E4E0BA1A5DEEC42C12C7F3E4A71DB5D482B69B76B59ED0E4F4A57444C39BD7C8800E400DA8033AB54A4B0C1D030A18884060B98A938AAF3EC3D7F7EE9777786FE78CFD5AF6D397D7B7FE9607B45B4F348DF9A9B070AF0515CF4FD273EFAFED9D0B79FD8FCCA91BB1FF06FDC53D5B1EEF6632B1F7C933C53FD5DA897AB06FE2CC88DFE16F454381BB9ABCC2DD15BCC7C697481B382AB33D744F3C95CB63933BA882B33F3D2B92B1F05579AC88A2A6CD6C6EEC4BB626FC4F7A04FDD1A7B6C8AA11857E31E6953AC46E7C65116864DB431168BEA3E25C994E8542CD9E634E92D69C824B8E250DC863826EE1CE30E2621013CABC5D28C841BA86725CF5C50AD803C69C49D228FF8DA828810002B10DF3AC3C38543808F5A617F49315505F927218F569D9EAA257449BA953C9E6A6D65F194AA30246E4F6555900F637C340E3CEE6C3DDA70EF85BE871F6D3CDFBBF3B8C53EB8ECC197AED95831D2B528D4CBBF7067DBB25FBEF158E88F8FD5BF32799EAD19CD5EB8026F383B76B4E6C80F142B64D7819CCDE893E01E813D241CD51D11388D31C6F898EEBBDCBF717F6335294C1A578C0B996ABC0BDF88B52633C3EA19B359959E00E98A5E159F59012133A4254193944FD723A3C0B1A11C92C4402CB6116D0738FA08AC4AB12F16354A14935E7B0E97452CEF102981FF5F4C5E79440026B25B851A930DD0C418A3404C968DEE4F38547459ABAE67664E8B3C0C2B5475C3620E4B1994386C8A362D0D66C1041FCE6A78A8A170F9527FF1860B252D5CCADB7B46529FF0FC287429D448B0B91EEC8E0579F9D09F4EEB33CC10D99FBBF213F22C9C25A1AA1D88BB8C0FBA1FF4B023EC6EFBDDFABB0C9C9E28A48B04B4B07793564B8038C81E8E7D54FF9891AB6477E96FD0B3198624B7C75B6CE05C063D9B0848057B0EDB92621AAC2809E3F438A755CB3BD3F589E4F5046908FB48B82FE06697B2DE7F8E91835216C9C53FD2B950B294CC247F14439F1126A5E7A3182986790FD2F297B31B5F564C7A20B3EE93D6C9F75B811CBC04EE6C602A5B24C9A2852C5E28093652824FAC2E424EAF4126294B900437941C12526CBAF4182D53454D59733AE79AC69D3B939243BF4A5BBCE4C2A90B6F71C7B903C3576DCA72ECBD58D8D8F6DDB173D75C83B7E8EBFB2A372EF46764ECB1A7F757EF3BF5DC3D868DDB1BF3F252E20A5BF2578D2EBF77DDBA75349BFE037307FF048A43370433969ABBCD23E631F3BDA6FBAC8F0BCF26BC94F0A1152005B3C86E46517A9FC500E8CCEACD1F5900074E484351E33884AC4CFC49B959309C63E24F1887F4DF62E24159E3910042D227F9405925E1368115CE31B79D8C2F3E495ECD69CDFCE4FD4FC89B06B055F2C9C9B272F2D681F42AD19E642DE5B320BFC8EA2D0A588BD880D6CB2AF911FE9D63E1FCADC19CB86B6E4BBCADE8CD95271CC7F7D89233CA8EDE692948ABF0EE637A6FC6FCDED0BE9B274F6F8F717980BF03A057235C0AA05028386CD7D985BBF467B467C40FA27F1DAB15748270BDE150EC5DDABBC4A7D8AF6B74A96251EC8876441C320CC76A7CD82F95586A2C5CB43D16C031C62EC70016EE87E98EB11370E475B22E07C05187795E8774F6184107599019126A7BACC8C7A5C5D875BC646B8E21B0678E6D2EB763C9BEDCBEC1DE6FE7ECE798BD27E3C1C2096226185C393CBEC8BFC77FC4B37E9E3CC0B6DB781B1F2716BFACBABF7A62B475973E21CB0F64553B537978F71209892F65925531C5C51180A48FEB80A02B87A6A937195AD5DCBC08E26335D724AF31C09197B59FBFB0E71ECF81D3B746D554D51EE975C7246E3CFDCEE32FFDEC96EEC5FFC2744DAE5DE32F5BBC745F63D14DF83508A4F195498830EA40A6666C0ACA5192C5656152CD41CB0A4BB77997F63D8BC6420CA4266B5EBE4688112056D0800A311AAD96ACBF6AB482A0134516620C83C964D6EB1941104D66B3CE24683067D669B52CCB6844804E3312855A8DD8A127318760AAC5E60EA4EBD08E331EA461F427497643D40F63F9B484FA01BAC7F19B48C2ECF193F439C0FB20AD49F853B74879BD47D992F543B274A153564FCB94BDBA9C6A0202920AFA98A07580BA4ADD95BF9C482A309FBBF297B37109F93A3196D24121DA96AF15A36CF9456AF04D565CC15421BAC6DED49454CCE237427FBDD0929786F37E195A840D17367B3243134C3CA37F61731BBE61F283C97FFF594577682FC1BDD04A6E2FC85446F70657B96272F4414330664CE40583DE0869B498A12F366A743AC1683269118E4656AC63CD9214D09A64ADD66434895A8935EACC2693280A1A9DC8BAAC80169209C3AF496C16F03873078A06E1DC0CC279DF7FC90FEE892E052AF228515FE50A67CA449D94E778631237A12BA3D0692952B36496AC8A0293C41FE98B0B8A3CBEFCD2E32756C45AF02F5E985CD77E6F4779A8FB49C9EE5EB7894B9FFCE0D831B6E9B3BA67078997DF0B2188045CB2E80741DB6AA6137732037880E1114F0289D5F800CFF3EA430BBA4F74A86F71C4297B3946799B23C968CE9F91A76922F33440C7F788EF860B527DF9914F41488748ED90029F19F21C848A9504AEF8EE99AF55D0491DFCDFBEEB819587BE24FC64F792A493A49B18DFCA3DC73CC8DF0BBC2607455C81789B2D8EA9C0E3F8E788C3AB8E5F4F3CE1647D45D792DF207F1D797A4CB2D75BFDEFE670CFBDFB2E807A376AE1D671F5480B31840D39512A607B11A07B15E07B1344D03DA0F4A3683FBA10ECD8B475C5EAD5EB9B775E5D5CB67D28CDB7B133A9B6DAA05B12E410382694E04A2AF32525F9CAD8E684FC1C59926213EA978E0C0EB677572EDAB7BB30AF6F73544C4323A3295DD008C573558B23AE65F7E69696CDBBD96E8F68CAC8CE4EF17423FF3BAF97F85FBFF83A5922F6FBFDD2C5D7A5D7416B807A9D90917FB41DF62B7BE90DA5FDACC69F6B0F0290BD1EF2B9E254756F55F736751F3EAF9D753C7B3FFBFCECE3E459FD87EFC7FE28273F3FE74EB2F96B2037909B44A850511EFC7C33909B1B601AC876328E5430D74DB59D7C3A273F2F8F36C617C8B9D07AB2FD2B697C27A1D8BB61930347A19F0602B9EFC201BE078846D2D91ED8E017F2FC0593D540DD959393CFB8D446212D101F92CBDECECFC9CF0662FA63F6F42717D17CE597FC13FC0F51295A899E0AF6F42EC7D72FC5234BF1B007F778F0881BEF4AC49B127171024E8FC22512CE9030AACAC5B985858E15B1F2CA79B6D815BAD8EAD8E65836760500D98A15C6554919C9C955194E2336262701F2E5CA59F38241D19995C1AE28ACCDE245813C632B0F5CCACB2BBF04417660322FCF1278230FA2F24B01FF25B22E1CB04069DD3B36011E95A740845B03B939AD113F6E2F0123134B4169015754A8BC52471EB79A186DEA023690475EBA83ECCDC4025CC1566BE221EB626826C4BBDED1B339DBAE7FA4EB87BFB095B6DFF5FA8D2FFECF2C41EFA81A5CBDE1E8E06AD7F1CC91477E72F3D5C7070A2473B1EC900573474AFFF5476BD7EE6F2A4810DC15DB96AD3BF340BFEC5FE24A4AA92F4F7DFE9B6503DD2D3585165B40CA5AE12D695EE0F22E1B6EC8EC7F744BBE7FFDE175857BAB43FFB1E1D62DCB5DE915CC4F0C76BB5D6FF41507172D4CCC5E56E8C8EFBAE32A9889B3573EE0FF0433918A02682CD8D293379A3796C796662FCD666E48C2075D78C485535D78CC89479CB8290A375A70891197687117836F4DC5EB52F7A43235A9382D15A722649733D27D69718919E41D3D949AEE8E8BE3FD5966D693C50B34A2244F091599E7E5F9037443C43A53C8AD9808389B214B9A498A4041B86E8D664A90D85D18CE2AF99BB247EEFFF6D5D7FFE2A1E69D3FC4CE270EBE714B0D2B980D9FBDC0F3F3B6DEB36ECD8D032D2997CFB03772DC9993EB9E3C32801FDEF8C8F0A215F7BE73DB77F1CA3FDF5473D377F6DA0B17AF2E7296C6773DD05BE85FBB6F05EE7514C79D7E61DEE869A2BBE47D951FD3771D07820B1D2E97033132628A982A867C6B84C963D11B8C9264343A4C66D964AE36EF3433E9E61233633363B329CA6261B4590E1B2B99199711994007272626CA27882282B661CAFF187D6A0A30CE4F5840DD63A1724C71D26EEB14A35AD60BD95F2042C5B845278D510FDF73EDB9FDB5314FBE848BCF64EB32B65D73477DFBBF8C2C329ACEB04BCBB6CD1FDBD974E47CCFE577F9F19F069A1626676C786020B063D165F2E9D52684843CE06B3E3A1BEC2D32E0CCAC2C47768E9C9D93939D8D4C466B9499BC77225964C93262C1D5169C6EC1360BB64812723A9A1C630EC6316FFE7C451A9B18BC96C145E4DD1CE8795E4E5156A62329C92E5BAD8C9065B7438E9D958DCCD27C6283133F9A907E042200ABCBA326E70F104D00A5989205CE6B25276215ED50C443C21C0B267563E12541453AAAF1458AC7162926EF8C56EC67274D525245F7A2E1A7764E892D75EBBE5BAAEBAEED5864D0155E7DC39D75CD77F49498CC675E821C2DA9B27BF1F093A429BB74E1407E45DBFC8419127556F4AF58BCB5362D7DFD5DDB0A76575D8666C1E192C557CD8B579A110D3A79E5034D0E3F0E1A34185CB053BC4164C634A01B268751928D06BD453236197B8C8CD106B99CE4F0208671385C3251359311B998B00ED9CC12115FC0AFE80E5124AC4A43519B56EABD881EC54A6119B56256A344CE6037E4E95691376C5D10473395912A14BA304B85F8F1CB6754257A7113EBFE5B65A412B1240326DF72C63E0DBCE9516D3015E9F52266188897598E7308A20C517226B8020102648113DC1A1D2BBAC1E9944F4EC02F0C9EF8DCD6313A583AB5797EAA0F307037644F01AD1B32292FF6303727BF7FE9FDE4C9E1E45F5FFA0D3FFEF4678F3CFD347795FABC7104F26F1965A09B83EB4653F048ECA158A629B627963968C6A9667CD8807D062C1AB05E1FAF3FAC67D345AC17E345A611636B5494D722CB164494DCB241EE971949C6B2EC8B76495AACB5CA62944593E43469E3203BA2EE0BEC7682382FF2A4AC35B09798EC0C594FFF90BC85C87801A73C94F162D577A99AC8B1D2FD4FD65E7355417A4DC78E7DC1EF74259F7AF7F1508E35D0B864E9B56DC5DEF235B965EDF5252951F79F28E97B6473FBF1BB77AEC93AFFF8673FC70F676F6A2A6DBDFFDB9BCA3B2A9203ABB70E0D92CF505FF9139342DF2EAB08A60AA28849EA27437A2E2F85CC0FC918C992FC91CC42520E81A6C6298B46E088DA1DE568606A16F262A9F8559D292CA2CF87556D09E0529DE8CE8C4AB7E9335A124A96F9A2620CBF3A853BBC0B12DD193CFBA05E48CCAF4A2F1829E5480EBB1F80FE229F059AD118CC120541AFD3222DE88616212FD6C8186B766A30644F2C4B1EEE307A1FAFD5E878C8BA4444E4FCCB0989A8486BA48E48131312C0335515708E5E9A690748A68D734F4CBC9CF872F189E217135F64EF3F8C75A14F0F13DB4B0935D14C3A0FDD176C2ACDC14D0E5C09BF898D894C750C4E888BF3DA73654895515EAEBDC98EED7DB95882402357979FEE4A4B4ED6E98D46AF4E9421F9433A49C7E872B39C092E739C5D2F6AD2D38C16A70E31AA24DFC8A3AE1D28326AC52CE9486970D14A8D937CF6C2F4399D092BCB74964B964DC9D1B4A9DAC2F524EF9DDF559D4633DFEAEAD2BEAB96DA6C091B4FBF1DBDECEA937B961DEC28E5D8A736762C1C685914F5D2CF9217AD0D547C95A4C38DD9658B336A7BCB8B6F847CF8D3F6C77755B82B7AAAAC0E8B33BEACCEBD6CCFDAFF6A6BFE7F508BAF5C093FD96434E43B9C1043BE99914BE70620BF89463705179B4D5611223D2B67E5B800AF91790DCF6B6ED1E03D1ABC19B45BCBE804901824D8482BD3FF730D8E85657C90F28A564E131D0D3A7F8E397E8AC38817D5D000940592950955F9C3B1014FD10F9485C062642578FE12620BAC9B2020CB66B305E0E1213A487FA538243DF73A73F28DBC1C8DA0E138BD6C73C47C035786C6B981C91DD8975C909911979099559012FA39C972AFFC81FB3E771D4A47BB83D510CF757AF01A0FAEF4E0A6441C93D098C0EC8EC587A2F0410BDE65C45BE0D78065577434A05ABA94CEA4A7673A5D4894444644E972743A94A438A719983B99E4E4F56AF407B99485863D8A0F2591F7CCD86F2AF45BC05020D766B3745D3B1CF971FB523BAFFBDAA6FE53FB97749FFEF448CF3DDDF30CA784A4B2E6F99B9FB9BA22B36E4B70E1C086DA44DCB6F2C6F6A285579F183C3A39BE3977ED9EA5AEACFA1277C3EDDFDED1B867654A4A457B1928EE7298CB37612E0DC88EB6052BD7C7E09A18BC56C243C2F502932C7409CCB0EEA08EE9E1F021168FB2B893C51A97F228CF6A88B783673020D98090DF506E600C469F41B4FBD039E659CAECB41350B07906A3D8AD44271ACE0B461186052F5E88C776BD7CA8AAF978E8D36742C17FFDF54DAFEC29F1ADDEB3FC1237307FE7F1E1FBFEF2D4FAAF2C397066A07A67532E5D7F060E9E060EF4685D3013CC524F3E1F26E901ECB051D0F0222F8A5ECCC860C57E5C8E19ACF10902E67D0C0CF2A4E8239E560DCAA7463B3631154C04C2E6EB765BDD5A374BFFD8B72F0FFF89EDF34CD62E62C63C93BB96326F71030F875E7B3844BE6764F7953FF006D0A11440E3BA0A272E74E2CD31785D0CDE1C8D5BF4789388D78A3856C49B34782DFCF238392929D113E5B25ABD29000B1EAFECF17A91077B3C69892E498775D6149FD7CBC63A8DA048A73D2E276289C55F5272B8C937C28A14E16E95546EA6562593175722128A69B5226B4345EE223777EBA1D0678787BE75A8BAF705CC3ED0F7D5FE45A6670CBEAA9EAA91F1034BBEF195F167D2428F7918C3FD8D8D8B777F63F351CC9CEFCB691CAD4AF2D71626AE3EF24AFF435FEF1A7F549911FC1F30232C0A046359027544FC310CD64270AC4C024BC47F228C734ADC1B8EF7BDE09E74E31F838592EF47016FDC0E148FCA829048913C1ABC07C7CD9852DADB494E9DCC89D96AA74C5F00262E3869FE78FC4D30A181CB7E5577F89F40EFD1E80FC1DB6E94F11619A7C9F8A1282C474505940F5D1ED5E3437A3CAAC7B23E49CFF07A7C871103205247C76B76F237F0CC661E17F3D8CE6391C7F7717888C38D1CE62433CF819F1B8DC6D161113431A390306DA08FCC6CE485562F41141154422C17B0A0D5B04C9411225C215AD68BC0D2191D0F5E5150BC22F18B1313E01681BDBC708E00134D635EE5101C239C0FCFF89882B0F8F3474ADC80BD2C146BC01A13630B14927725B95F3FFD9266F2F7876FE5269EFEF83F86040D66A2F2BDF8F4DFD8C39787D9072F7782D38CC96F77397BCA9877C2B6F719B5BD13C1EE628C9BF43D7AE620C2A3087721AC277C8B10E58823E22191594450A0408B53B5385A0BB880C158030C9619065BF000799F0B7E7823436697C24815A087B2ACCEB03A811578BD48A0E2D9195001222929511DEA2CB18491B09542C66C11B4BAA904ACE4932E014E3C156AE7CE3CFBF109FC15EECC09B6E5F263A0238FB12D64A566CF954B7C0C587434CA44D706D76FCED89DC1ACCBC02DE99BD36F4A67D726E1D52EDCE51C761E74B2AB9D788DA3CBC14018D5188B3B655C2857CA8CCD84B788B844AC11995816C7D307CA8C569B6571F5A7DE96CA4864E1C0E9D11B9C3160E261CFA9C2C3AC750162C9790BB870324740C1AA2C0F7061D060F657EED9B4AAC499B56A74E9FA27AFADF735ECFCDDF6E70E2DF5AD1ABDEB78E7E8B7AEADEC3DFB97B1CCDA9ED16B17D6ED5993B5FC96FF315CB9BB259FBDBC64DFC9FEF5DFBCFFC0FA40CD7567FA8E7C7AA607B827737C13CCB10910A2399837A23BA463342EC97A3B810053BCC16C3712183021D98446C8B71B99CA4D8CC9EC3318EC4653041A1050A73EB6759693252CAA606062BC14C2F30A553008E2C7FB8F75E52CB8E6BB37863E5C378E8B2E3FF695D4CA0D251F720379CD3B2B1B6EEE290D35324B07B6E62F4A312175B43F84D1C62027DA172CDF65BFD1CEB024F6889651B4355A40C8EC92E2717CBCE8D6D99C825310BCA25E16F57ABF580EB81D8D6CBE28AB95C53A9DE8F4E989B2110354958D38DCA812D03520BE002D00CAC96B6A53A9B91702112F513137795AADD16AC1D08051BA9AE1E6F6FFF8685C5ED9B2DC477AC7FFC4185F78F567DFC3E58D29935FC3F38E3DD6B733F42C2E2AACCAB484246EE0F0750F7DD3CEC576D5E3FAEE9EEA2AF23E14C4290B40234BD0F3C1E1CA225C5484538AF01E3FBE29095FE7C6436EDCE8EE763343363C1C83C774F84616A7980BCD9566D62CCAAED41217429B7D58EF5BE7637C28554A65525373E7395D0E87E8EACFC557E5627F6E79EEF25C36B784BCC5CA80D07873A1C3E9F4F8EC3EECB3F3CE4212D4789CF67050D3AA2C1E96D0309F9862EBD492622B38242025D26A56A0331DD8D81C2C9D7D50E1D4A298987038900A911C0D83626CEC188E2F69092EE8ADF3252EDA5CD770537BD1E203E3A3079EED2BD09CE28F1DA9ECAF4B8B5FBCA3A9F5FA356975D73FD3FEDAAB3CEBCCAB2B888FF59525BBF37D495294AF6A536DFDA1B6E2C2AE5B9B0D7BF6BA0AAB53938BB392ADD6D2DA8DA52B7637647CF32990ED53A041876974BB3498AC09F22BC0FF8027A7DF90EA653919DCD3727603CB20566241B5381F714927189642198D5855C5A01138440FAD34FA276A0018DB1BDA73F1DCC5D07E0FFB22FBD6653FFBD6C3C48F5E0BF3F90BB8A71B7504B3AB13E84BFFEAF287C3E4B55A2C5EC9244B9249276169B9E93613A3BCE4EC765924B8F9598735CE69C2DAE94460421986EA00D505B529C5C4267E3A136023D614C10F2ED73BF3EB471EEDDB7D6C7D92497FDDB9837A537441F3E29EEB56FAA4C3DFC2EF16ECE8EF58E62B58B77B495E4F3EB369F2D69C96B4CCCA40426ECBDE5AE676923FDD0DF27B8962C2F5C17ABDC86A914E00F1F102077022B21A5C2DE0CF049C26140BD5C2BDC239E167C2878256604536C00980B8821670420480984A18382304895A51D028E6C872D3BE9F645CF47D66F2617F12FA109609D9DA3A403E7241B3024C3F4F413E0AF0F15B7F0C55BCC734847EFCBD37F15D3F9EFC0DFE61288B59CD2486D6E347277F0D33712BDCEEB7D4DBED0C2E24C06CD06934019E93790EB4C0603205C8932B88420E613C4A727655278AE9B7D3DCC041C4A033881CE6599306F1119A11C6EE3046B5B6E6A9490C0DD9548A9808C6A02B98C2324165EEB7930F768F77875E79E331D9255A4BF37015C0F0F69013FF8AB93D7424B3D69B58558CB7419E564FBE539FFF804911D3E877FBFEFCD47214131431E238860962CC3DC79C50BE73A200B2B052B55C8BEE9F2AEF4F1708ABFEB1B203CA9F992152582B942DB49CE54D50EED018A1BCA2BD46FB1BA5E8BE27AC9B59442394037A9DFE61FDC386AB0D571B3368396B7AC85C66FE86B411CAA796535149516F9062DD69FDDDFF6F456E9B2AD7CC95B93257E6CA5C992B7365AECC95B93257E6CA5C992BFF9D4AF4CD73E53FB5DC3957E6CA3F5362D6C6FCD6D618AB8FDD157B8E147B192D87A0BC1AB791966371FF16F771FC55507E9A509C7020E1402286924A4B63E25F1CBD8E0F9DE5504EB836BAEE77235A36B85FF82F293F9A2B7365AECC95B9325DE8875056B1BF45EA3F4D64E2680D4BFF658D488F08CD2003F30D14FE0F990DCC3E95E6502C7351A579A03F54690D4A60C3FD6851E7543F3A94C366A8B4806EE24B55DA68E2F889F02763B0D17A41A531E2E51FAB348334D1892ACDA2F4688D4A73C810ED57691EE8792AAD41A6E82A95D6A2DCA97E7428D6FAA64A0BA8227A8D4A1BB54CF4FDE43F7E722CDCCB94F0844A73282EE1414AF3B4FE159526F56728AD21F249F857950699245CA4B496D67FA2D2A4FE434AEB487DA2ACD2509FA8A3B4004C3AD8049556E4AFD08AFC155A91BF422BF2576845FE0AADC85FA1B5A83DD1A5D28AFC155A91BF421B4D72E2B594162378172378D743BDACF2A2877A97CA8B01EAA5CC47549A4309997753DA04F5BACC17559A4372E6094A932F1D3265FE40A5A1FFCCEF50DA4AEB7FAFD2A4FE3D4ACB1132942364184DDAFB342A4DDAFF8DD231B4DEA5D250EF53E46C27FDF84A551AFAF165533A9EB66F5069D2BE92D28911F74D8CB8AF93F6B355A5493F1B299D44FBB95EA5493F3B299D41EBBFA2D2A4FE0E4A67D17ECEA934E987CEAF2E42FEBA08F9EB22F8D245F06588686F88686F88981743785EBE8E5C280FE5C05F0150ABD126D405FB3AD48FFAE06F08ED42DB69CD62381A049A6CDBA0BE97B6C886330BD156282ED400753D70FD10DA418FBA60DF05AD4760DB495B1AA154C3513BD476A151A8594E7BEF83FB86EF530BBDEF82BE87A11F17F4DB4FFF476A07D01D4093FF5C3338751FD7D4E8735000A894A9A322E4A36368831EB6435B17DCB70DEE43FAE8405BD4B64BE16813D492B3C330C61D533C1139F4523EB67EE978BAA92C5C68111CB7C31952DB4625319347A59F7E955317BDCB309CEDA0FC92A36EE87B14AE1DA435C3D0AA934ACE05F5E1F9A8813111E9F4D2EBFAA86CE7D1EBBB688B2EB40DEE4924DD49B72E7544E1B62E5ABF036A06E9FFF609CFE0341FE4FC108C82FC47DA1D208585B4A5C251988B363A26A2019DF48E64CC5B2877DDFF94F6CC6E593AE3AE0DF4FFEA0ED3392023ACA1E3DBAACA3F0DAEEEA5FCF44F49317DC6F591ED1BA944774C715D0477CF019D9F6E9F35A37D1D70F37FD73644FA37671FFF5DECE3F37A303D4B4BA8268C42DB3E900799C76E28BD2A4F5954F6FD309E5E7A877A7A6613D41069EEA073B3826AD2203DD34BED6E156CA7792732CB4525A81866F4F37640F81E86B16CA75C2AFC76D3F10ED1F95B4B65ECA216BC8BCA5491C1D0D4BC865B93BA7EAA5D44FA644C5D747C9DB4DD7675FE7DD437F4D1FB6CA7A356AEED507BE9528FDB68DFDB2907DBA0D5103D47AE6AA7E308CFE7ECB91952AF503465F07335DD533CF8A68EA775E3F3D2D94E8F3BE19A0E38F6A97A42EC51B9AF6FEA3EB33950666C94CAA9835ACE17C96C54E5B497DAD4566A3D614B9F2D7B72CD564AA541FBF419BAFAC5BD2B63F867651B690961FD1CA4BA1FD6B7B0EE7F1107E1BB7F7E5CF322748070A2F03244EF17F68D83D47A7651FD21DF72D0473D46DB9772AAE85EDB0CAD522CBF5FDD2A5C2934F141DB554F44461B9ECD703FA425F1777F4F4715AFDDA7CECC74EF610BE955A53C487D632FB5E121756E497C1346896E6ACD5B29976129CFD46A1F9D99364A77AA7AF0798F36DB12D2A867277C96223F942EEA91C93DB650BFD54567B50DEA88847AA045F89C5FED73C32C2F99AE5AEFB4B7D83125B1F068FE4F70E81FF4FBAE84597DD486FB70254E69F366A853E629AC355D1433B7AA7831ADDD7F0FCBC25AF9E57846666EC594E5EC88881394F956B4A04BBD570FD5E53E75DE7D94E741156714DF433C431B95BF32CF613D56F46ABBEAC1953B101C5070A56F4A53DAD0349ECFF667FF09733125A136CA7BBF8A3961FFD1496B8641368A8D4CC7382E8A6A5B559D490B8FF1CBE716111C9B81E830DBE91132EAA428B375869FF93C8F7FA73FEA7D7BE975E1D65FECDD7CB3BC5B58F6B3AF265253FC6924DFE1714D475BD356338D44E139F4517FDF4FEFD23D75DC15A121C46F2933B4037A9B465865D4ED742C5D2A520D4FCD65A42F51E6D0AFCEF80E6A255BA7C610B6EB99BAF48F4B3512E1152E239166A64E4F4B6294CA71DB3F398F613420D1609F2A99AE881174D22DB9E7B45C36438B8E08EC18FA3BFE58F1FC9D948330E295CEF0E26DD0633FF5385F1C5F2BF15F1865A6E51346B2691945FA949957EDA0BE4299AB7695EF2FC6DCB62F99D1C129EE77502DEDA3BD2B56A4206F24A2FFB31A10C6B76A5441CF2E479570D40468D9406B6AA08EC4AD0D70A6118E9640ED12A8498516ABD4F3A974A69A280E5543BB3514E3943E1A605B0FC76BA98FAB442E7A4C8E96D1FF66BB845E5B819AE93D2AA0B755B46503EDBB0E6A6B615FA1B623572C869A35704CE82AEA0595FBD5C3554AB650A362A232D2D550EF9AE270E6A86AE81DC323AB83A306E8BF5A3DBB10FAAEA1FD91F193FB5752BA7E6A9C95EA48175219919E499F8B6144B5FFABBDABEB71DCACC24E1C0F89A6D32D375C2090CE05EDCE1437332CAABA6C25A827F14C4C337170323BEC0D9513BF49BCE3B183EDEC30FD0508B1DB5E2010EDF27185845468A14574A1CB4791F801DD3B8AC4D71D1F77DC2278CE6B27934C6757DC2040CACEC63EEFD739E779CE396FC66F365AD9E2DE7DDCDB98D791F60D8939F3B62531EC603CC3624A0FD87235C79ACD637EAEE6231C23F6AF899F535486E4A021BD39E5AF867B1B9EB3FE5D8C76E53B848D957589B423D93373CE186D53B64E516591AA4934CC2A735087BC87D7EE8C3B475E335F9C396D8BDC1DC8F1D359193E23BFD62473B66C65D1A8C95657C68A47F53C968EC471D6EA81CC4453CE3224E2CE2C437664F666DE4FB333B361CF7992D9E3D8CEFB32CD6A7A408D645AA6E3FB79A4DFCB0BB36E484ED8AFCECCF2FD3457BF4B97B62E3D49DD91A0BD288CD293B1A05A148FA3D84DFD28AC921104E4F8C3519A90231211DF105E95D6D61AA2178B63B2C722ECF29AA67B124D520AA2A1DFA77E343E89790DB1FAAD8FD3637C7B4A27C70DC6236AB8613FEA1FA2F7D3D128A4C6C44BD85277E42714CCEB1944316DFBBDC0EFBB01E516312782514AA249DC17B80DD263371634093D1153CA38AC2E35FDBE0813F13425429038EA09CF131E05592F7922E9C7FE98014A1B9E485D3F48AA46ECC3102CB894C6AE278EDCF890A2C1FDD999765EC9563A623809DC98ACD485295ADFF3FB71C41E6E64E359FF5511276CF9A9EAD693B2FF89AC7FAF3BB32129ADC7EEB11F0EC91E0CE0373D414ED4F3436AF9FD5114B8894E6D378DFDBEEF52C795E813FAD8272E5F9A19A564321E073E700FA230ADD2B5684247EE094DC040CA5C7337A511F563E1A64227CF4FC6E05F2737F4681CFB18ED638AC0DD4D682CE2233F4DA1AE7722799EB29962004189A7C2802DE87C97D198B9338E236FD24F75E22CC25A9DD74C0D00D8F108C8E63C3B86513FEC07138F536EEA7D140627B4EE6F64519D9B0E0D0FF2364B02E6331609F3C6013C35C0CB67BA9E960CACFBB0928A238E76ECC3AA171D8741E47A8BECB91955483EC089600AD7493A46127B8261F29C9108C68B8CA2B0C2937C3A07040AC1CFC8EFF9F0B9BAB6C6293788822092299053AD53CF4DE06B14CE127D1A84F5519A8EAF6C6E8AB07AEC1FFA63E1F96E358A879BDCDAC4CCE7F292D84078655A24EC18AB39BF86CFABBD77F2194D9E718F69BE1E011353236E88007529E95EAC72A672A1CED7D6DA1C9C4416017083028155C3D805339E4E8318358BECE98FDC7808CCCC31B84244B19CA21E6A3564525CB9CF4CF3ECDF47C10EB94912A172383FBCA83F394244DC6C3BF00330B3CE1A17D05227DF68EE6D488F3CC13B45168773E7D1B19F8EB87B2EDDF43CDDD8FBE970E0234F33DBAC2BCEB65A589045C408753A8A3C7FC0772109194F002819C98285EADE848B37E1CE3C4B807013C01381BD1B1A38D6394BE7BA9A153C4C664593332D9D381E45470FC0C8653089433823A4022FC2862C7DB92EFAE934C14EF318C9EFF9B2F0AE6429EEF6A21B62EEFD02FB1F978CF4878B6C7C9A29F950327281AA27162AD79D031AB3F9244532F1968BE2CD0AFD410470BD354CEAD83BDD03C331C9EA50DBB1AF5A75B34E178D0EDA17753AB0BA0D7BBF4B98E118ADEE35B277C8685DA367AD565D27F3B36DC7EC74C876C8DA6B372D137D56ABD6DCAF5BAD5DDAC6BA968DB7250B9508A55D9BD860AECA323BAC6CCF746A0D348D6DAB6975AFE9B463755BAC73074A0D6A1B4ED7AAED370D87DAFB4EDBEE98305F87DA96D5DA7160C5DC335BDD2AACA28FCCAB6850A761349BD294B10FEF1DE95FCD6E5F73ACDD46971A76B36EA273DB8467C676D3CC4C0154AD69587B3AD58D3D63D794AB6C6871E4B4DCBB838629BB60CFC0DF5AD7B25B0CA366B7BA0E9A3A503ADDD9D203AB63EA6438568709D9716CA8673AB1C2964AB0AE65665A986A5A8808A6707BBF639EFA52378D26747578F1FCE4C54FA06AF229909FA16EA0677EE4508E3CAFFCED3E23D99AF9FE67E7FA23F9F437991F57BFADFE547D457D5DBDA3FE6061DD7FEA33B0E5E9FDF2F47E797AFFDF3FBDCF3E815D9EE0FF7F9EE067D15B9EE22F4FF197A7F8CB53FCB3BBF9F2247FF1247FCACEF2347F799ABF3CCDFF1F3BCDBFCFBF62FC3C6A5B2C8CD50B9FC13D3DF3A41CCD3DDD9EFF0C2DB01F9CF7447C22F788B3D6FF90BF4F2D682B7DB0542B3D53324A974B97CED175CEF378616B86E47061455B890AAEFCBD303CE37128F7675FF9B394E6474CE87A5EEE906EF67D817FFE1DAF8BCA5795F3FF14F2FB3A7F6BC00BC2612E7F20C9E44FE2F521233E0A75AA9DC4814EBBB138D4A9E9A6E17B7BF904321BCB353F84DB56E1B25254B6A0FECB4AA178B3F875452DBE547C09F2CBC59721DF2EDE86FC8DE237217F4B7D9F5250CB6A5951D58ABA06F961F561C817D447213FA65E84BCAEAE43DE5037203FAEBE05F9AE7A17F2CF4ABF510AA5774BEF2A6AE9B7A5BF40FEAB76AC14B52F683F5454ED75ED0DA5A0FD48FB25E4B7B5B721FF4A7B07F2BD958F28859547571E57D4958FAEDC82FCC2CAF7207FBFFC29A5507EA65C53D472BDFC39C8CF957DC8D7CBBF83FCFBF21F21FFA952500A95624553D4CA4A6595FF0FC90ABCAD5CA85C80FC48E511C8EFAF7890456504D9AFBC0AF9B5CA9B90EFACDE540AABB7565F50D4D5171FFA07D82AE59C15950F4B0632EC19EA1C2FB07C119E7F49BB09F996066FB517B5AF40FE9A0656B5DBDA77707D457B15D7D7809AF1FE18D7373558D4EE687720FF447B0BF25DEDE7907F21D9F835786006D673BC45207521F7CA021807E581C4A8C2E752A524B170CFB03244CF08B8E0F3BF0020A23C5C0D0A656E6473747265616D0D0A656E646F626A0D0A3131322030206F626A0D0A3C3C2F547970652F4D657461646174612F537562747970652F584D4C2F4C656E67746820333138313E3E0D0A73747265616D0D0A3C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964223F3E3C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D22332E312D373031223E0A3C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E0A3C7264663A4465736372697074696F6E207264663A61626F75743D22222020786D6C6E733A7064663D22687474703A2F2F6E732E61646F62652E636F6D2F7064662F312E332F223E0A3C7064663A50726F64756365723E4D6963726F736F6674C2AE20576F726420323032343C2F7064663A50726F64756365723E3C2F7264663A4465736372697074696F6E3E0A3C7264663A4465736372697074696F6E207264663A61626F75743D22222020786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F223E0A3C64633A7469746C653E3C7264663A416C743E3C7264663A6C6920786D6C3A6C616E673D22782D64656661756C74223E46756E64616D656E74616C73206F6620436F6E74726F6C6C656420446F63756D656E74204D616E6167656D656E743C2F7264663A6C693E3C2F7264663A416C743E3C2F64633A7469746C653E3C64633A63726561746F723E3C7264663A5365713E3C7264663A6C693E47656E6572616C3C2F7264663A6C693E3C2F7264663A5365713E3C2F64633A63726561746F723E3C2F7264663A4465736372697074696F6E3E0A3C7264663A4465736372697074696F6E207264663A61626F75743D22222020786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F223E0A3C786D703A43726561746F72546F6F6C3E4D6963726F736F6674C2AE20576F726420323032343C2F786D703A43726561746F72546F6F6C3E3C786D703A437265617465446174653E323032362D30332D30385431373A30383A30382B31303A30303C2F786D703A437265617465446174653E3C786D703A4D6F64696679446174653E323032362D30332D30385431373A30383A30382B31303A30303C2F786D703A4D6F64696679446174653E3C2F7264663A4465736372697074696F6E3E0A3C7264663A4465736372697074696F6E207264663A61626F75743D22222020786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F223E0A3C786D704D4D3A446F63756D656E7449443E757569643A45383446344238352D303832382D343546442D384635452D4332434637313536413234433C2F786D704D4D3A446F63756D656E7449443E3C786D704D4D3A496E7374616E636549443E757569643A45383446344238352D303832382D343546442D384635452D4332434637313536413234433C2F786D704D4D3A496E7374616E636549443E3C2F7264663A4465736372697074696F6E3E0A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A3C2F7264663A5244463E3C2F783A786D706D6574613E3C3F787061636B657420656E643D2277223F3E0D0A656E6473747265616D0D0A656E646F626A0D0A3131332030206F626A0D0A3C3C2F446973706C6179446F635469746C6520747275653E3E0D0A656E646F626A0D0A3131342030206F626A0D0A3C3C2F547970652F585265662F53697A65203131342F575B2031203420325D202F526F6F742031203020522F496E666F203238203020522F49445B3C38353442344645383238303846443435384635454332434637313536413234433E3C38353442344645383238303846443435384635454332434637313536413234433E5D202F46696C7465722F466C6174654465636F64652F4C656E677468203330303E3E0D0A73747265616D0D0A789C35D2CB2E435114C6F17D5A4AA94BB5A737753F2E45EBB475A7377A7806B73040221112313536172F2021BC8B78001311891898980993DA67FD750FF62F3BF9D6CE4AD6524A9F5ACDD0775029973BF8113C96107A14C2E782790AB7F02C442E85E885104B0BF10CBC0A897721E9176C47C81E09D58AE0F0F5C60EBC099B0A6EE053D8FA10B6BF855D53F7AA63962A4209CA508102FC275774DD5EAAFE32C0035E6880844EEEBFD4934DD0083E688166F0431BB442003AA11D3A200441E8820884C18438442106DD90841EE8853E58857E18804118020B866104C66014AA908271988049484306A6C0862CE4C0813C4CC30CCCC21CCCC3022CC21A2CC1B29ED1414896E1B0E462D8EB4256D6D4C87D09F92B174FE144285E0BF767C2C3B1F01B70F1FA9E94FA03035A35330D0A656E6473747265616D0D0A656E646F626A0D0A787265660D0A30203131350D0A3030303030303030323920363535333520660D0A30303030303030303137203030303030206E0D0A30303030303030313635203030303030206E0D0A30303030303030323439203030303030206E0D0A30303030303030353438203030303030206E0D0A30303030303035303637203030303030206E0D0A30303030303035323336203030303030206E0D0A30303030303035343837203030303030206E0D0A30303030303035353430203030303030206E0D0A30303030303035353933203030303030206E0D0A30303030303035373637203030303030206E0D0A30303030303036303133203030303030206E0D0A30303030303036313839203030303030206E0D0A30303030303036343436203030303030206E0D0A30303030303036363234203030303030206E0D0A30303030303036383835203030303030206E0D0A30303030303037313737203030303030206E0D0A30303030303132333537203030303030206E0D0A30303030303132363439203030303030206E0D0A30303030303137343733203030303030206E0D0A30303030303137373735203030303030206E0D0A30303030303232383737203030303030206E0D0A30303030303233303130203030303030206E0D0A30303030303233303430203030303030206E0D0A30303030303233323031203030303030206E0D0A30303030303233323735203030303030206E0D0A30303030303233353237203030303030206E0D0A30303030303233373939203030303030206E0D0A30303030303234333431203030303030206E0D0A3030303030303030333020363535333520660D0A3030303030303030333120363535333520660D0A3030303030303030333220363535333520660D0A3030303030303030333320363535333520660D0A3030303030303030333420363535333520660D0A3030303030303030333520363535333520660D0A3030303030303030333620363535333520660D0A3030303030303030333720363535333520660D0A3030303030303030333820363535333520660D0A3030303030303030333920363535333520660D0A3030303030303030343020363535333520660D0A3030303030303030343120363535333520660D0A3030303030303030343320363535333520660D0A30303030303235383232203030303030206E0D0A3030303030303030343420363535333520660D0A3030303030303030343520363535333520660D0A3030303030303030343620363535333520660D0A3030303030303030343720363535333520660D0A3030303030303030343820363535333520660D0A3030303030303030343920363535333520660D0A3030303030303030353020363535333520660D0A3030303030303030353120363535333520660D0A3030303030303030353220363535333520660D0A3030303030303030353320363535333520660D0A3030303030303030353420363535333520660D0A3030303030303030353520363535333520660D0A3030303030303030353620363535333520660D0A3030303030303030353720363535333520660D0A3030303030303030353820363535333520660D0A3030303030303030353920363535333520660D0A3030303030303030363020363535333520660D0A3030303030303030363120363535333520660D0A3030303030303030363220363535333520660D0A3030303030303030363320363535333520660D0A3030303030303030363420363535333520660D0A3030303030303030363520363535333520660D0A3030303030303030363620363535333520660D0A3030303030303030363720363535333520660D0A3030303030303030363820363535333520660D0A3030303030303030363920363535333520660D0A3030303030303030373020363535333520660D0A3030303030303030373120363535333520660D0A3030303030303030373220363535333520660D0A3030303030303030373320363535333520660D0A3030303030303030373420363535333520660D0A3030303030303030373520363535333520660D0A3030303030303030373620363535333520660D0A3030303030303030373720363535333520660D0A3030303030303030373820363535333520660D0A3030303030303030373920363535333520660D0A3030303030303030383020363535333520660D0A3030303030303030383120363535333520660D0A3030303030303030383220363535333520660D0A3030303030303030383320363535333520660D0A3030303030303030383420363535333520660D0A3030303030303030383520363535333520660D0A3030303030303030383620363535333520660D0A3030303030303030383720363535333520660D0A3030303030303030383820363535333520660D0A3030303030303030383920363535333520660D0A3030303030303030393020363535333520660D0A3030303030303030393120363535333520660D0A3030303030303030393220363535333520660D0A3030303030303030393320363535333520660D0A3030303030303030393420363535333520660D0A3030303030303030393520363535333520660D0A3030303030303030393620363535333520660D0A3030303030303030393720363535333520660D0A3030303030303030393820363535333520660D0A3030303030303030393920363535333520660D0A3030303030303031303020363535333520660D0A3030303030303031303120363535333520660D0A3030303030303030303020363535333520660D0A30303030303235383735203030303030206E0D0A30303030303236313735203030303030206E0D0A30303030303737383935203030303030206E0D0A30303030303738323434203030303030206E0D0A30303030303738353736203030303030206E0D0A30303030303738373338203030303030206E0D0A30303030313436373938203030303030206E0D0A30303030313437303932203030303030206E0D0A30303030313733393338203030303030206E0D0A30303030313734313838203030303030206E0D0A30303030313935303834203030303030206E0D0A30303030313938333439203030303030206E0D0A30303030313938333935203030303030206E0D0A747261696C65720D0A3C3C2F53697A65203131352F526F6F742031203020522F496E666F203238203020522F49445B3C38353442344645383238303846443435384635454332434637313536413234433E3C38353442344645383238303846443435384635454332434637313536413234433E5D203E3E0D0A7374617274787265660D0A3139383839380D0A2525454F460D0A787265660D0A3020300D0A747261696C65720D0A3C3C2F53697A65203131352F526F6F742031203020522F496E666F203238203020522F49445B3C38353442344645383238303846443435384635454332434637313536413234433E3C38353442344645383238303846443435384635454332434637313536413234433E5D202F50726576203139383839382F5852656653746D203139383339353E3E0D0A7374617274787265660D0A3230313335380D0A2525454F46)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开猀琀漀爀愀最攀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀崀 ⠀嬀昀椀氀攀开椀搀崀Ⰰ 嬀琀栀甀洀戀渀愀椀氀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　Ⰰ 　砀㠀㤀㔀　㐀䔀㐀㜀　䐀　䄀㄀䄀　䄀　　　　　　　䐀㐀㤀㐀㠀㐀㐀㔀㈀　　　　　㄀㄀㠀　　　　　㄀㠀䈀　㠀　㘀　　　　　　㄀䌀㜀䌀㠀䐀㘀㄀　　　　　　　㤀㜀　㐀㠀㔀㤀㜀㌀　　　　　䔀䌀㐀　　　　　䔀䌀㐀　㄀㤀㔀㈀䈀　䔀㄀䈀　　　　㤀㌀䔀䘀㐀㤀㐀㐀㐀㄀㔀㐀㜀㠀㤀䌀䔀䌀㤀䐀　㤀䐀䌀㔀䐀㔀㔀㜀㔀䘀㘀㔀㜀　㠀㈀㄀　㤀㄀　㈀　㐀䌀㌀㈀㄀㌀㈀㘀㄀㄀㄀㤀㄀㔀㄀　㄀㐀㠀㐀㠀　㠀䄀㈀　　䔀㜀㔀䌀㈀䄀㤀㔀㘀䌀㐀㘀䄀䄀䐀㔀䄀䈀㔀㤀䘀㜀㔀㘀㠀䄀䐀㌀㔀㘀䄀　㜀㘀䐀㘀䐀䐀㔀㘀䄀㔀㔀䈀㐀䄀䐀㐀㠀㄀㔀䄀䈀䔀㈀㠀　㌀㠀䄀㌀㄀㠀㐀　　㐀㐀㐀㐀　㘀㐀㄀㘀㠀㄀㌀㜀䌀䌀㄀　　㠀㐀㌀　㠀㈀㐀㈀㄀䌀㌀㜀㜀䘀䔀䐀䘀㜀㤀䐀㘀㜀㜀䐀㘀䐀䐀䔀䘀㌀㤀䘀㜀䐀䔀㜀㜀䈀㠀䌀㤀䈀䐀䘀㜀䐀䐀䌀䘀䔀䘀㜀㜀㜀䔀䔀䘀㜀䐀䌀䘀䈀　䔀㜀䈀䐀䘀㘀䐀䔀䔀䈀䐀㤀㘀䈀䔀䐀　䐀㈀䐀㈀㌀㈀㌀㈀㌀䄀㌀㐀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䔀㠀㄀㜀　㄀䈀㌀䐀㘀㌀㈀㌀㈀㌀㈀㈀㘀㄀䈀䐀㌀䐀㘀㜀㜀　㈀䘀䄀㐀㔀䌀　䄀䌀䘀㜀㠀㈀䌀㠀䌀㠀䌀㠀㤀㠀㜀䌀䘀㐀㠀䈀㠀　䌀㤀䌀㠀䌀㠀㄀㠀㐀㈀㘀㐀　㄀㤀㌀㤀㄀㤀㄀䐀㄀㌀㌀㘀㐀　㄀㤀㌀㤀㄀㤀㄀䐀㄀㌀㌀㘀㐀　㄀㤀㌀㤀㄀㤀㄀䐀㄀㌀㌀㘀㐀　㄀㤀㌀㤀㄀㤀㄀䐀㄀㌀㌀㘀㐀　㄀㤀㌀㤀㄀㤀㄀䐀㄀㌀㌀㘀㐀　㄀㤀㌀㤀㄀㤀㄀䐀㄀㌀㌀㘀㐀　㄀㌀㌀䘀㠀䐀㠀䄀　䈀㠀䐀㘀䈀㐀㜀㤀㘀㘀㘀䐀㤀䔀㐀䘀㐀㘀㄀䌀㄀㌀㐀㔀㈀䘀䌀㌀㤀䔀㘀㠀㄀䄀䘀䄀㈀㄀㘀䐀　㌀㠀䐀㘀㄀㄀　㌀　䐀㌀㠀䈀䔀䈀㌀㌀䌀㔀䘀㔀㐀㈀䘀䐀䘀䘀㤀䐀䔀㈀䘀䄀㘀㔀㜀㄀䈀䐀䄀㈀䈀㠀䘀䔀䈀㐀䈀㠀㄀䔀㈀䄀䄀䔀䘀䘀㈀㠀䄀䔀㄀䈀㠀䈀䔀䈀㤀㘀䔀㈀䘀䄀㘀㠀㜀㄀㜀䐀䄀䔀䈀㠀㌀䔀㔀㔀㔀䌀䔀䘀㈀䈀䄀䔀㠀䐀㠀䄀䔀䈀䈀㐀䔀㈀䘀䄀㔀䄀㜀㄀䔀䐀㔀㐀㔀䌀㐀䈀㠀䈀䔀䈀䌀㜀䌀㔀䘀㔀䈀㄀䔀㈀䈀䄀䈀䈀䈀㠀䘀㘀䐀㄀䘀㌀䐀䘀㄀㜀䐀㜀㤀䘀㄀㜀䐀㜀㈀㌀䌀㔀䘀㔀䔀㈀䔀㈀䘀䄀䈀㜀䔀㈀䘀䄀㘀㤀㜀㄀䘀䐀㘀㔀㜀㄀㌀䐀䄀䄀䈀㠀䘀䔀䄀㘀䈀㠀㐀䔀㈀䘀䄀䔀㘀䈀㠀䄀䔀䈀㔀䘀䄀䐀㈀䌀䐀䘀㈀㔀㜀䄀䘀㘀䌀㜀䌀㔀㜀㔀㠀㐀䌀㈀㈀　㈀䐀㤀䘀㈀䐀䄀䔀䐀䘀㄀㘀䐀㜀㄀䈀㠀䈀㘀䈀㤀㘀䐀㈀䈀䔀䈀䌀䈀㠀䐀䔀㔀㘀㔀䌀䔀㜀㈀䄀㐀䘀　㜀㄀㔀䐀㜀㈀㤀䌀㔀䘀㔀䈀䈀䔀㈀㜀䄀㜀㤀㜀㄀䈀䐀㔀䄀㘀㄀䐀䐀㔀䘀㔀䌀㐀㜀㄀㘀䐀㜀䄀㜀㠀䈀㘀䈀㄀䈀䈀䐀䘀䘀㄀㘀䄀㔀　䐀䔀䌀㔀㄀㔀䌀㤀䘀㈀㠀䄀䔀䔀㜀㄀㐀䐀㜀䄀䄀䔀㈀䘀䄀㠀㘀䘀㈀㜀䄀㤀㐀䔀䔀㤀㌀䄀䔀㐀㔀㈀䄀䄀㌀㔀䈀䘀㔀䌀䐀䔀䔀㜀䄀䘀㘀䐀䌀䔀㈀䈀䄀䄀䈀䈀㠀䐀䔀㔀䌀㔀䌀䈀㌀㠀䈀䔀䈀㄀䘀㠀䄀㘀䈀㘀䘀䐀䐀䘀䈀䄀㜀䔀㈀㌀䄀㔀㔀㘀㔀䘀䐀䌀䘀㐀㤀㌀㤀㘀䔀㔀㔀㔀䌀　㜀㄀㜀䐀㜀㔀䔀　䄀㠀䘀䐀䐀䐀㤀䘀䘀㔀䈀㔀䌀㤀䈀㄀㐀䐀㜀　䈀㠀䄀㘀䈀䄀㔀䔀䄀䔀㔀㘀䘀㠀䈀㘀䈀䈀㄀䈀䔀䄀㄀㈀䌀㌀㘀㈀䘀䄀䔀䌀䈀㠀䈀䔀䈀㤀䐀㈀䄀䔀䘀㈀䘀㄀㘀䐀㜀㠀㜀䘀㐀䔀䔀䈀䌀䔀㐀䘀䘀㔀䐀㠀䈀䔀䈀䔀䈀䌀㔀䈀㔀㠀䈀㤀㔀㄀䐀䘀䘀䔀㌀䌀㔀㜀㔀㤀䈀䔀䄀　㈀㘀㄀㜀　㐀㜀㜀㄀䘀䐀㔀㜀㜀㄀㜀䐀㔀㤀䘀㄀㠀㄀㤀㜀㌀㘀㌀䌀䐀䘀䈀　㈀㄀　䐀㄀㜀㈀䈀㜀䘀䈀㐀㤀㌀㌀䐀㔀㔀䈀㘀䌀㐀䘀䘀㤀㄀䔀㈀㔀䄀㘀　㔀㔀䐀䈀㜀䄀䈀㤀䔀䔀㤀䘀䄀䄀䈀䌀㔀㈀㈀䘀䐀㜀㄀㔀䐀㜀　㄀㠀䄀䔀㌀㌀䔀䐀㔀䐀䐀䐀䘀㔀㤀䐀㔀㌀㘀㈀䘀㈀㤀䄀䔀䘀䘀䄀㤀㈀㤀䈀䈀㤀㤀䌀㔀䈀㔀㜀㄀㜀㄀䈀䐀䌀䄀䄀䄀㐀䐀䄀㜀䈀㐀㌀㜀䔀䄀䘀䈀㐀䔀㄀䈀㘀　　䌀㠀㌀㠀　䄀㄀㐀㈀㤀䔀㘀　䄀㔀㔀　䄀　㈀㄀䐀㄀䘀㤀䄀㠀䐀　㄀䐀䄀䐀䌀䌀㄀䘀　䐀㘀䈀㔀䈀㈀䈀㌀䈀䘀䄀㠀㌀䌀㔀㌀㔀䐀㜀䌀䄀䌀㘀㜀　㐀䔀㜀㄀㘀䐀㘀㤀㘀㔀䔀㜀䔀㘀㤀䄀㘀㌀㘀㔀㘀㜀䈀䘀䐀䐀䌀䄀㐀㘀㐀㌀㠀㌀㜀䄀㘀䈀㜀㄀㌀䐀㔀䈀䌀䘀㤀䔀㔀㘀㔀䌀䘀䈀㔀䄀䐀㤀㐀㠀　㠀㘀㌀㐀㘀㜀㄀䌀䐀㈀䘀䄀䔀䘀䐀㠀䄀䔀䈀　䘀㔀㘀㌀㘀㌀䄀㄀䄀䘀䐀䘀㘀　䄀㠀㌀䌀䔀㐀㈀䌀㜀䈀䄀㐀㜀䔀㤀㜀㠀㐀䘀㜀㄀㘀䐀㘀㜀䄀㔀㐀　㜀䄀㤀䘀䐀䔀䘀䈀㔀㘀㜀㄀㌀䐀䈀䘀䈀㠀䘀䔀䐀䔀䌀䄀㐀㘀䘀䄀　㄀㈀䈀㌀䈀㌀䔀㄀䐀䘀䄀㄀　㈀䈀㌀䈀䔀㜀　㤀㔀㘀　䄀㤀㠀㌀㤀㐀㤀㤀䔀䘀䔀㔀㠀䔀䘀㄀䔀䄀㄀䘀䌀㈀䐀㔀㜀㜀㤀䐀　㔀㠀㘀㤀䘀㠀㌀㐀䐀㠀㈀㜀㔀䈀㈀㤀㌀㐀㘀㤀䘀　䄀䘀㔀㔀䘀䔀㄀䘀㔀　䈀䔀㘀㠀䈀㠀㜀㜀㠀㐀㘀䘀㄀㘀㔀㠀㈀㤀䄀䌀㤀䔀㔀䄀㔀䌀㤀䈀㔀㤀䐀㤀㤀㤀䔀㤀㄀䌀㘀㜀㔀䄀䐀㤀㄀㄀䔀㠀㈀䌀㜀䘀㔀㔀㔀䌀䈀䘀㔀㘀䘀䔀䐀㌀㜀㈀㐀㐀㄀㠀䈀䐀㐀㄀䘀㤀㐀㄀㌀㠀䐀㄀㜀㄀䔀㤀㈀㐀　㠀㐀㄀　㐀䌀䐀㜀䘀㈀䈀䄀䌀㄀㌀䄀䐀㄀㐀㠀㐀䄀㐀䘀䘀㐀䘀㤀㐀㌀㜀㠀㐀䔀㤀　㜀䄀䐀㄀㐀㌀䔀㌀䈀㄀㐀䐀㜀䄀㘀㈀㄀㔀䐀䘀㄀㜀䘀䄀䘀㈀㜀䐀㈀䘀㈀㘀㌀䐀䐀㌀䈀㐀㔀㘀㔀䘀䌀㌀㈀㤀㔀　㔀㐀㈀㤀　㐀㄀䔀㔀㄀䈀㜀䄀䈀䔀㜀㤀䌀㌀䘀㌀㔀㤀　䐀㘀㤀䘀㠀㘀䈀㈀䈀㠀㔀䌀䈀㐀䘀㠀䄀䔀䈀㔀㠀㈀䈀䔀䈀㜀䐀㈀㌀㤀㔀䈀䐀䄀㜀㠀㌀䘀㈀䐀㤀㔀䔀䘀䘀㘀䘀䄀㤀㜀㐀㤀㈀䔀䘀㄀䈀䄀䌀㄀䌀㜀䌀㠀㠀㜀㌀㤀䄀䔀㈀㜀㠀㠀㈀䘀㈀䘀䘀㘀䔀㈀䈀䐀䈀䌀㜀㈀㤀㔀㘀䐀䘀　㘀㘀㤀　㌀㌀䘀䈀㐀㔀㈀䘀　㌀　㈀　㜀䔀㔀䘀䔀㤀㄀䔀㘀㠀　䌀㠀㌀㠀　㜀㄀䔀䌀㘀䌀㘀㔀㠀㌀䈀㠀䈀㐀䌀㌀㜀䈀㔀㜀㄀㔀䐀㜀㘀䄀㈀䈀㈀䈀㌀㠀䌀㔀㔀䄀㌀䐀䘀䘀㠀䄀㤀㔀㤀䐀㠀㔀㤀㄀䘀㈀䈀㠀䔀㈀䘀䄀㤀㈀㤀㔀㄀䐀㤀䐀㄀㤀䌀㄀㈀㔀㜀䄀㤀㜀㤀㄀䘀䘀䔀㄀䔀㈀㌀䄀㔀䔀䘀㜀䔀㠀㘀　㔀㜀㠀㐀䈀　䔀㠀㄀㠀㜀㐀㜀㐀㘀㘀㌀㌀㔀䘀㔀㘀䐀㠀㌀㐀㄀䄀㘀㘀㄀䔀㐀㜀䔀㤀㄀䐀㠀㐀　㈀㠀䐀㜀㈀䄀㤀䐀㈀㜀㐀㠀㌀䘀䔀㌀䔀䄀䈀䈀㠀㘀䔀㔀㘀㔀䄀㤀㠀㔀㄀㤀䌀㤀䄀䄀㐀㜀㌀㠀䐀㤀䔀㈀㄀䐀㐀㤀㠀　㤀㌀㄀䐀䈀㔀䄀䄀㔀㘀㜀㔀䈀㄀㜀䐀㜀䘀䔀㔀㘀㌀㘀㔀㐀㘀㘀㘀䌀㠀䌀䘀　䌀䌀㤀㐀㤀㠀㔀䐀䘀䌀䐀䌀䌀䄀㐀䔀㐀㄀㄀䄀㄀　㠀䄀㜀㜀㈀䄀㌀䔀　㐀䐀㐀㔀㌀䄀䌀㄀㐀㐀㐀䐀㜀㈀䄀㄀䌀㠀㐀㈀㄀㄀䐀㠀䈀㠀䔀㠀䄀㜀　䘀䔀㘀䔀㜀㄀䈀䐀䄀㤀䈀㠀㤀䔀䐀㠀㔀　㠀䔀㘀䈀㤀㐀㘀㘀㘀㘀㌀䄀㈀䈀䘀㔀䐀䈀㌀䈀　㠀䄀㌀䘀䄀䔀䈀䄀䌀㄀㐀㠀䌀　㠀㄀䐀㌀䄀䘀䈀䐀㔀㔀㘀䌀䔀　䔀㔀㘀㈀㠀㘀䌀㘀㘀㜀䘀㔀䈀㔀㠀㘀㜀䌀䌀㔀㐀㤀䌀㐀㜀㈀䄀䈀䐀　䔀䌀㈀㘀㄀䘀㘀䌀䄀㈀䌀䔀　㤀㤀㔀㘀　䄀䈀㌀㌀㔀　䐀䌀䘀㈀㤀䘀䘀㄀㤀　䐀㘀㤀㌀㠀䐀䌀䌀䄀　䔀㐀䘀㤀䐀㌀㄀㐀㠀㜀䌀䌀䘀䌀䄀㔀㤀㘀䌀㄀㌀䘀㠀䘀㘀㜀䌀㈀䈀䐀䈀䌀㄀㔀㤀䌀㔀㜀㔀䈀㐀㤀㔀䌀㈀䔀㤀䈀　䘀　　䔀䘀㄀㌀㄀䄀㌀㜀㔀䄀㄀㔀㠀䐀㜀　㘀䔀䘀㔀㄀䐀䔀㈀㠀㌀䈀䌀䄀䘀　㘀㘀㄀䈀　㈀　䌀㤀䈀㠀　䄀㄀㘀㄀㌀䐀䄀　䘀䘀䄀㜀㔀㤀䈀䐀㠀䐀㄀㌀䌀䈀㤀㤀䐀㌀䄀䌀㄀䌀㌀㄀䄀㠀䌀㐀㤀䈀㘀䄀䐀䔀㤀㤀䄀䔀䈀䘀䌀䌀㈀㐀㤀㠀㈀㘀㜀䘀䐀䈀䌀䄀䌀䔀㠀䄀䈀　䘀㤀䄀䌀㤀䔀䐀㄀㄀　㘀㠀㌀　㜀㐀㄀㘀㤀㘀　㔀　㠀㌀㘀㄀䄀䄀㘀䔀䈀㌀䐀㄀　㄀䔀䐀㜀䔀䈀㌀䈀䔀䘀䘀䌀䐀㜀㈀䈀䘀䔀㌀䘀䈀㌀䈀㈀䘀㌀䐀㘀㠀㄀䐀㄀㠀䘀䌀㘀㐀䄀㐀㜀䄀㜀䐀㄀䈀㄀㜀㐀㌀㤀䄀　䔀㘀㌀䐀㠀㐀䌀䔀䈀䐀㔀㘀㠀䔀䈀㠀䌀䌀㠀㐀㤀㠀䈀㔀㈀㄀㌀㐀㌀㘀䐀㐀䘀㔀䈀㠀䐀䔀㐀㌀䈀　䄀䐀䈀㘀䌀䄀䄀　㤀㐀㄀㤀䌀　䔀㄀㠀䄀䔀㜀㄀䌀䄀㔀㤀㌀䘀䌀䌀䔀䈀　㘀䄀㔀㤀㘀㄀䘀䄀㜀䘀㘀䐀㐀㠀䘀䈀䐀䄀㜀　㤀㤀㜀㔀㔀㜀㠀䔀　䔀㐀㘀㜀䌀㌀䄀㄀䔀䌀䈀㄀　䌀䄀䔀㤀䐀㔀　䄀㜀㜀䈀㔀㤀䔀䌀㜀䘀㐀㜀㔀　㈀㐀㈀㘀㌀䌀㐀㐀䄀㘀㄀䘀䌀㘀㠀䘀㈀㘀䌀　㌀䔀㔀䄀㔀㈀㤀㈀䌀㜀䘀　䔀㌀㘀㘀䄀㐀㠀　㌀䘀㤀㤀䔀㘀㘀㔀㔀䈀䔀㈀㌀䔀䄀䐀䄀㄀㌀䐀䘀䘀䌀䌀䄀䌀䄀㄀㤀䔀㜀㄀䈀㄀㐀㌀䔀　㌀㐀䐀㄀㐀㌀　㈀䌀㤀㜀䄀㠀㐀䘀䔀䄀㘀䈀㐀㜀㄀䈀㔀䈀䐀㤀　䐀㌀㐀㠀㘀㐀㤀䌀　㌀　䈀䐀䘀㐀㘀㤀㈀㠀㈀㌀㌀䈀㌀䄀　㄀㘀㘀㈀　㠀䌀　䄀　㠀㤀䘀　䈀䄀䌀㄀䄀䐀㄀䌀䔀䈀㌀㜀㈀㘀㘀㐀㄀㐀㜀䘀㘀㤀㄀㘀㈀㤀䄀䐀䔀㘀㔀䄀㐀㘀㜀䔀䄀䌀䌀䔀㠀㜀㘀䄀㠀㤀㔀㐀㈀㠀㌀㘀㤀㈀䘀䌀䈀㄀㔀㜀㐀㄀䈀　㜀䔀㤀㜀䐀㄀䄀䐀㘀㠀㔀㔀㘀䔀䄀㌀䔀㄀㠀䐀㔀㔀䘀㔀㌀㔀䌀㜀䘀㘀㐀㤀㔀㠀　㘀㄀䐀㐀㐀㜀䄀䘀䔀㌀㐀䈀㈀㐀㐀　㈀㌀㘀㘀䄀㤀䌀　㜀㐀㜀䄀䌀䈀㠀㘀㜀䌀䈀　　䌀㜀㌀㌀䐀䌀㘀㄀䔀䘀䄀䐀㘀䐀㌀㐀㤀䐀㠀䈀㌀㜀㔀㤀㄀㌀㜀㐀㘀㔀㜀㤀㘀㠀㐀㔀䘀䈀　㜀㈀䌀䄀䘀䔀　㜀䌀㔀䌀䈀㄀㈀㘀䐀䈀䔀㤀㔀㔀㌀䘀㌀䐀䐀䄀䌀㄀㐀㔀　䘀䘀䄀㤀㌀　㐀㜀䄀䌀㄀㐀㜀　㜀㄀䘀䄀㜀䐀䈀䘀䔀䔀㤀䘀䄀　㌀㐀㤀㌀䈀㜀㐀㜀㄀㔀㌀㜀䌀䈀㠀䄀㄀䈀㄀㔀㤀䔀䌀䘀㐀　　䔀㘀䌀㔀㌀㠀䔀㜀㔀㐀　㘀䘀䘀㄀㐀䐀㈀䈀䘀㔀　䘀㠀㐀㠀㌀䄀䔀䔀㈀䘀㔀㔀㘀㤀㘀䐀䈀䄀䐀䘀䄀㤀䔀㐀䔀䌀㘀䔀　㐀　㌀䐀䐀　䘀㤀㔀䐀㔀㠀䄀㜀䘀䘀㈀㌀㌀㠀㜀䘀㘀㘀䐀㔀㘀䌀䌀　㜀㐀㄀䘀䌀㄀㜀㤀㤀䌀䐀㈀㜀㘀㠀㘀䈀㔀䌀䔀㔀䔀䔀䄀㤀䔀䔀䘀䐀　㤀　㠀㘀䐀䘀䔀㤀䘀䐀䔀㌀㤀㐀㐀䔀　㐀䌀㈀㜀㐀㠀㔀䌀㜀㤀㈀䘀㌀㄀㜀㔀㘀㤀㘀㈀㜀䈀㌀䌀䔀㄀㔀　䄀㤀䘀䄀㔀㈀䄀　㈀　䘀䘀䐀䐀㤀䄀㜀㔀㔀㤀䔀㄀㄀　㠀㤀㜀䘀䘀㔀㈀㄀㠀㐀䘀㄀㤀㘀㌀䐀㤀　䐀㌀㐀㠀㘀㐀㔀䌀　䄀䌀䈀㈀䐀㘀㄀㄀㠀㜀㐀㘀㐀　㐀㌀㘀㄀㐀㤀㐀　䄀㔀㌀㈀㜀㈀㌀㈀㌀䐀㌀䔀㐀䄀䔀䘀䄀㄀　㌀䘀㠀䘀㜀䔀㈀㜀䄀䈀䄀㤀㔀㈀㌀㌀㠀䘀㜀䔀㠀䈀㐀䌀䌀㔀㐀㔀㠀䘀㘀䈀㠀㌀䔀䔀㜀㔀䘀䘀㐀㤀㜀㐀㘀䌀㌀䈀䄀㤀㤀㤀㤀　㈀䌀䈀㌀　㄀䄀㈀㈀䌀㈀㘀㈀䄀㐀䈀㠀㈀䔀䈀㈀㔀㈀㄀㤀䌀㤀㌀㈀　㐀䘀䐀㠀㈀㠀䘀䘀䄀㌀㐀䌀㘀䌀䈀䄀䌀䔀䌀㌀㐀㘀䘀　䔀㘀㤀㐀㐀㜀　䈀㄀　㐀㐀㌀　䘀䔀㈀㌀㌀㠀㘀䌀㜀䄀䐀䔀䄀㄀　䘀㌀㤀㔀㜀㘀㐀㘀䘀㤀䌀㜀㠀䄀䔀䈀䘀䐀㔀㘀㈀䔀㤀㌀㄀　㄀䄀㌀㐀䔀䌀㔀䈀䘀㐀㤀䌀㌀䌀㌀㄀㘀䈀䄀㄀䘀㄀㤀䘀䄀㔀㜀䈀㘀　䄀㤀䐀㈀䘀䐀㜀㤀㈀䈀㤀㜀㐀㜀㜀㐀㤀㘀㄀䘀㔀㠀䄀㤀㜀䌀㜀䔀䈀䔀䔀㈀㐀䄀㐀㜀㜀㠀䈀䔀㐀㄀㌀㜀㠀㄀䄀　䄀㈀䈀㌀䄀䌀㔀　䈀䌀㈀䌀　䐀㤀㤀䐀䄀㜀䘀㐀䌀䐀䘀㜀䌀㐀㐀䘀㤀䐀䌀䄀䘀䄀㄀㄀䌀㐀䐀䔀㔀䈀㈀㌀㈀䌀㐀䈀㄀㐀䄀㜀㄀㔀䔀䄀㔀㘀䘀㄀㄀䐀㘀㜀䘀䄀㌀䈀䄀䈀㠀㔀㠀䌀䘀㐀㤀㈀㜀㐀㈀䔀䘀㈀㄀䐀㔀䌀㌀㔀㤀　䄀䘀䈀㔀䐀㌀㔀䘀䘀䘀䈀䘀㈀㘀㔀䈀㤀䔀㈀㔀䔀䄀䌀㜀㈀㐀㄀㄀㠀䄀　㔀㌀㘀㈀㠀㘀䘀㤀㤀䐀㤀　䈀㜀㔀㔀　䐀䌀䘀䈀㜀㘀㠀㐀㠀䌀㌀㘀䘀䄀䌀㔀䌀㔀䔀䄀㈀　䘀㐀㌀㈀㜀䌀㐀㌀㈀䔀㤀㄀㔀㈀䄀䈀䘀䈀䘀䐀㔀䈀㔀䌀䌀䌀䄀䘀䄀㜀䈀㔀㠀䐀䘀㔀㈀㔀䔀㘀㜀㔀䈀㌀㤀㠀㌀㘀㘀䄀　㤀䈀䄀㌀㌀䌀㜀䈀䐀䔀㤀㤀䐀㤀㤀䌀㘀㐀䔀㔀䔀䌀䔀䐀䄀䌀㌀㘀㘀㔀䈀㜀㐀㘀㘀㔀䔀㜀䈀㌀䄀䄀㠀㄀䌀㜀㌀　　㠀㄀㠀㈀䄀䔀䈀䄀㐀䔀㐀㄀䔀㔀㌀䐀㄀㤀㜀㔀㠀䄀㤀㐀㜀䄀　　㌀䐀㈀䈀　䄀㠀㌀䌀㌀䄀䔀㜀㤀㜀䘀㔀䌀䔀㐀㈀㈀䈀㐀㜀㜀䐀䌀㜀㘀䔀㌀㔀㘀㄀㄀䘀㄀㜀㜀䔀㈀㌀㈀㠀㠀䔀　䐀䘀䘀㜀䘀㐀㤀㜀䘀㔀䘀㄀㜀䔀䔀䈀䐀㌀㌀䘀䌀㌀䔀㈀䐀　㤀䔀䈀䌀㈀䘀　䘀䈀㠀㌀䈀䄀㄀䌀㜀㄀㈀䐀䘀䔀㠀䘀䌀㤀㜀㜀㄀䘀䐀㄀　㔀㌀䔀㤀䈀㌀䌀㈀㌀㜀䘀䔀㐀䔀䈀䐀䔀䔀㐀㌀䔀㈀㌀㌀䌀　㈀㠀䔀㔀㄀㤀䄀䌀䔀䈀　㔀㠀䘀㜀䈀䘀㘀䌀㔀㔀䘀䔀㔀㌀㌀　䄀㈀䔀䔀䄀䘀㘀䘀䔀㠀㌀㠀㐀䈀㜀㐀䘀䘀㤀㌀㔀㘀㈀䄀㜀䘀䔀䘀㔀㄀㔀㠀㘀㤀㌀㠀　䈀䄀䐀䈀㔀㄀䌀䌀䘀䐀㐀䔀㔀㠀㠀㜀㔀䘀㌀䘀㈀䘀　䘀䈀　㔀㔀㘀䔀㤀㜀㤀䄀㠀㄀䘀䔀䘀㔀㐀㘀㤀㌀䐀㜀䌀䄀㄀䌀㌀䘀䘀䔀　㜀㐀㘀䈀䌀㘀䔀㤀　䐀䌀䘀㄀䘀㘀䐀㤀㌀　㘀㤀㐀䈀䌀㈀㠀㔀䄀䌀㤀㌀㜀㜀䄀㈀䄀　㐀　　　㈀㤀㈀㘀㔀䔀㤀㤀㘀䔀㄀㄀䔀㌀㠀㐀㐀㜀䘀㔀㤀㈀㘀㤀䐀㄀㄀䌀㈀䘀䘀㠀㄀䘀䔀䈀䔀䄀㈀㈀㘀䔀䔀䄀㘀䈀㈀㘀㌀㈀㘀㜀㔀䈀　　䐀㄀㄀㠀㘀㐀㄀䌀　㌀㐀㠀㄀㠀䔀㌀㜀䐀　㄀㐀㔀䘀㄀㜀䈀㠀䈀䈀䌀䐀㌀㌀㐀㘀䌀㈀㤀㄀㌀㄀㠀㘀㔀㜀䘀㜀䌀䐀㔀㈀㔀䐀䈀䐀䌀　䐀䐀䈀㘀䘀䔀䐀㄀㤀㐀㠀㘀䈀䄀㜀䌀㌀䘀䄀㠀㈀䈀䄀㌀㐀䈀　䌀䈀㌀㠀　䌀㤀䌀㠀䌀㠀㔀㠀䌀䘀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㘀㌀㈀䌀䌀㠀䈀㘀㌀㤀㄀㤀㘀㌀㐀㈀㄀㘀㌀　㠀㌀　㤀㤀㠀㌀㄀䈀㘀䔀䘀䈀㌀㘀䘀㘀㔀㠀㄀㤀㔀䘀䈀㐀䈀䐀㠀䄀㄀　䈀㤀䐀　䔀䔀䐀　㤀㈀䐀䈀䔀䐀　㐀㘀䐀䈀㔀㄀㌀䐀䄀㘀䔀䘀㔀㈀㤀䈀㈀㠀䐀㠀㤀㄀㜀㌀䄀䐀䐀䔀䔀䔀㠀䄀㜀䐀㈀　㌀　㔀䈀䐀　䌀䈀䈀㐀㄀㜀䐀㠀㤀㄀㜀㜀㔀㠀㐀㤀䔀㌀㐀㘀㄀䈀㄀䈀㄀㠀㌀㐀䘀㘀䐀䐀㌀㐀䐀㤀䔀㔀㐀　䔀䘀䌀㈀䌀䌀㐀㐀㌀䈀㈀㈀㈀㠀䘀㄀㘀䔀㘀䌀㤀䄀㘀　㘀㜀䐀䔀㘀䈀㔀㤀䈀㠀　䐀㄀䌀䈀㈀㠀　㄀㤀㐀䌀䈀　䘀㤀　䌀㌀䄀㄀㤀㔀䄀㤀㔀䘀䐀㌀㈀㘀䌀㜀㌀㘀㜀　㌀䄀　㘀䘀㜀㌀㤀䘀䄀䈀䘀㜀㔀㈀㌀䈀䄀䄀䌀䈀䘀㐀㔀䐀㘀䄀㄀㌀䈀㔀㘀㤀䌀㌀䘀䈀䔀䌀㐀㠀䘀䐀㜀　㜀㄀㌀䐀㐀㤀䌀䘀㐀㘀㠀䄀䔀䈀㄀㠀㈀䈀㜀㜀䈀䈀䄀㘀㌀㘀㌀㘀䔀䌀㜀䄀㘀䔀㘀㜀㤀㜀㌀㌀䌀㜀䔀䄀䔀䐀㠀㠀䈀䄀䈀㄀㘀㤀䈀䄀䐀㘀䈀㈀㜀　㄀㤀㐀㠀㘀㐀　㄀㌀㌀䐀㠀㘀　㤀㌀㄀㠀㤀䈀䐀䔀䐀㠀㄀䐀䌀䄀㈀㘀㌀䘀㌀㘀䐀䈀䔀䐀䄀䔀㘀㜀　㠀㠀䐀䐀㐀㠀䔀　䄀　㄀㔀㌀㘀㜀㄀㌀䐀㔀䘀㐀㌀䔀㄀㐀㈀䔀㔀䈀䐀䔀㤀㤀㘀䐀䈀　㤀㤀㠀䌀㜀䐀㈀䌀䌀䌀㘀䄀㜀䌀㌀䘀㐀䌀䈀㐀䈀㄀㄀㤀䈀㄀䌀䔀㜀㘀㌀㤀㜀㔀㜀㘀㐀㐀㘀㌀䈀㄀㘀㤀䌀䄀㄀㠀㌀　㘀㐀　㄀㌀㌀䐀㠀㘀　㘀㌀㄀㘀㌀㌀㄀㘀㈀䌀㠀㈀㔀㤀䐀䔀䈀　　㤀䔀䐀㈀䐀㜀䄀䌀㘀　䌀㈀㐀䈀㔀䄀㌀䘀㈀㐀䐀㘀䄀㜀㔀㌀㘀㔀㄀㜀㔀䔀䘀䈀㌀㈀䈀㤀㔀㌀㘀㠀㈀䔀　䌀　㔀㐀㠀㈀㐀䐀㘀㔀䘀㌀䄀䐀㌀㈀㠀㠀㠀䌀㌀㘀㌀㘀䄀　㤀㌀㔀䐀㐀䔀㤀䐀㄀䐀䐀㄀㤀㐀䈀㄀䌀䈀㤀㤀㠀䄀䌀㠀　㈀㘀㘀䈀　䌀㄀㌀㘀䘀㐀㄀䘀㔀㤀䈀㤀䔀㔀㤀䌀㤀㤀䌀　䔀㔀䔀㄀㄀㤀㌀㌀㤀　䐀㐀㠀䔀䌀䄀㘀䐀㠀㠀䔀䄀㘀䌀䄀㈀䔀䄀䐀䔀㜀㜀䘀䈀㈀㘀䘀㜀㐀㌀䌀㌀㌀㜀䐀㄀㠀㠀㈀䘀䐀䄀䐀㠀䔀䌀䄀䐀㜀䈀䔀䐀䔀䌀㜀㈀䔀䄀䔀䌀㠀㠀䌀　㤀㐀䈀　䌀䈀㤀㤀㠀䄀䌀㠀　㈀㘀㘀㜀　䔀㄀䈀㘀㈀䔀㄀㠀㜀㄀㘀㈀䄀㜀㠀㐀　䔀㠀㌀䌀䔀䌀䌀䈀㈀　㈀㐀㄀䌀㄀䘀㈀㈀㔀䈀㔀䄀㌀㐀㈀㜀䘀䈀㈀䐀䄀㐀㘀䐀䈀㐀㐀䌀䐀㘀㠀㜀㠀㄀䘀㠀㔀㌀㄀㈀㘀　䐀㈀㠀㘀㜀䐀䐀䘀䔀㠀䄀䈀㠀㤀㘀䐀㤀㘀㠀㄀䈀㤀䈀䘀㜀㔀㠀㜀䈀䈀䈀㄀䌀㐀䘀㔀㜀䈀㐀㈀㌀䈀䄀䌀䘀䈀䄀䈀㜀㘀㤀䌀䄀㄀㠀㐀　㘀㐀　㄀㌀㌀㤀㠀䄀　㔀㌀㐀㘀㄀䈀㤀㜀䔀㠀䄀䘀䔀㐀㤀㤀䘀䄀䘀䈀䈀㔀㜀　㈀䘀䈀㔀䄀㌀㜀㈀㐀㐀㤀䈀䄀㠀㘀䘀䈀㔀㜀㤀䘀䘀㄀㤀㔀㘀㈀䄀㠀㘀㄀㄀㐀㐀　㠀㤀㠀䐀㔀㔀㘀㘀䘀㘀㌀䐀㌀䌀㤀㈀䔀㘀㜀㠀䘀㤀䄀㘀䘀䈀䄀䈀㔀㘀㤀䌀䄀㄀㠀㐀　㘀㐀　㄀㤀㌀䐀㄀　䐀䄀㘀㠀㈀㔀䐀㔀㜀㐀㘀　䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀㤀　　㔀㐀䌀㐀㘀㐀㘀㐀㘀䌀䘀䐀　㈀䘀　㈀䔀㘀㠀㠀䔀㈀㌀䄀䌀㄀䌀䄀㐀㌀䐀㘀㄀㜀㔀㠀㜀㤀䈀㘀䘀㄀㤀㔀㔀㘀㄀䔀䄀䌀䈀䔀䄀㠀䈀㠀㤀㘀㄀㘀䐀㜀㌀㜀㠀䄀䔀䈀㘀䘀㠀䈀䔀䈀㄀㜀䌀㔀䘀㔀䌀䈀䔀㈀䘀䄀䔀䈀䔀㈀㤀䄀㔀䔀㔀䌀䘀䘀㔀㐀㔀䌀㘀䘀㈀䌀䄀䔀㤀㜀㄀㜀䐀㜀㌀㐀㈀䈀　䘀㐀䘀䘀䘀㤀　䌀㈀㌀㠀䈀䌀䈀㠀㤀䔀㔀㜀㔀䌀㌀䘀㈀䘀䄀䔀䘀㜀㔀䈀㜀㤀䄀㠀䘀䈀䔀㜀㠀䄀䔀䈀㌀㐀㈀䈀㠀䘀㐀㌀　㔀㌀䈀㈀㠀㠀䌀䘀䘀㈀䐀䄀䔀㄀䘀㠀㔀㌀㐀㘀䐀㔀䈀㔀䌀㜀䘀㘀㜀䔀㔀㠀㄀䔀䌀䔀㜀㄀㜀䐀㜀㐀㜀㠀䄀䔀䈀㠀㤀䌀㔀䘀㔀　㄀㈀䈀䌀䘀㘀㤀䘀䔀㠀䔀䌀㈀㜀㤀䄀䘀㤀㔀㘀㜀㈀䘀䘀䘀䄀䔀䈀㠀䐀䔀㔀㄀㔀䌀䈀㜀㈀㘀㘀㤀㈀㄀䐀䐀㈀䘀㈀䐀䄀䔀䐀㤀㔀㘀㤀䔀䘀㤀䘀䌀㐀㤀䄀㔀䔀䐀㄀㐀㈀䈀　䘀㠀䘀㜀䘀䐀㐀䌀䄀㐀㌀䔀㜀㌀㤀㤀䄀䘀㔀㈀㔀㐀䄀　䈀㠀㜀䌀㄀㄀䘀㤀䌀䘀䌀㜀䘀䄀㠀䘀㈀䈀㔀㠀㤀㤀㔀㘀㜀㐀㌀㜀䘀䈀㘀䈀㠀㤀䔀䄀㌀㌀㐀㌀䐀䄀　㜀䌀㤀䐀䄀㌀䈀㐀䘀䈀䈀䈀㄀䌀㌀㘀㜀䘀㐀㌀㜀㄀㜀䐀䈀㐀䈀㠀㄀䔀㔀㌀䐀䄀㌀㤀䈀䈀㤀䄀㠀㌀䔀䘀㌀䘀䄀㠀䈀㈀䘀㔀㜀㐀䐀䌀䄀㌀㌀䌀䘀㈀䔀䐀䘀䐀䌀㔀䘀㔀䐀䐀䔀㈀䘀䄀㤀䈀䔀㈀䈀䄀㔀㠀䔀㤀䈀㠀䄀㌀䈀㠀㌀䔀㔀䐀㔀䌀䘀䘀㔀　㔀䌀㐀䈀㤀㐀䘀䘀㌀㐀㌀䐀㐀㜀㜀㜀㈀㠀　䈀䄀䘀㤀㜀㠀䌀㈀㤀㠀㈀㜀䔀㄀㄀㌀　㜀㐀㄀　㠀㐀䌀㄀㘀䘀㠀䄀䔀䈀㔀㤀䌀㔀䈀㔀㜀㤀㜀㄀㘀䐀㔀䌀㔀䌀㔀䈀㔀䄀㈀㤀㐀㐀㜀㠀䈀䔀㠀㄀㤀㔀㠀㜀䈀䌀㔀䘀㔀㌀㔀䌀䈀䈀㄀㔀䐀㜀㠀䈀䘀㐀䔀䌀㤀䈀㔀㘀㄀䔀䄀　㌀䔀㘀㈀㘀㔀䄀㌀㜀䔀㘀㜀㜀㄀䐀䐀䄀䌀㜀　䈀㜀㈀䔀䄀䔀䘀䐀㠀䄀㘀䈀㤀䈀䔀㈀䈀䄀䄀㐀䈀㠀䈀䔀㔀䘀㔀䌀㈀䘀㈀䈀䄀䔀㈀䐀䄀䌀䔀䌀㈀㐀䄀㘀䘀㠀㠀䔀䈀㐀䈀㈀㈀䌀㄀　㔀䔀䌀䈀㄀㔀䐀㜀㔀䈀㠀䈀㘀䈀㘀㘀㜀㄀䈀䐀㔀　㘀㄀䐀㈀㜀㤀䐀䔀㔀㈀㔀䌀㔀䘀䈀㔀䘀㈀䄀　㜀㘀㌀䄀䐀㐀䌀㌀䌀㔀㜀㔀㤀㠀㤀㔀㤀䐀䘀㈀䘀䘀㄀㐀䐀㜀䈀䔀㔀㘀㜀㘀䐀㈀㤀㠀㤀㘀䐀䐀䄀䐀㄀㐀㘀㘀㜀䘀㘀㘀䄀㔀䌀　㜀䌀㤀㌀䌀㈀㜀䐀䄀䐀㤀㔀㠀㈀㤀㄀　㌀䐀䘀䔀㤀䘀㠀䘀䘀䄀㤀䔀䘀䈀䐀㐀䔀䈀㘀䄀㠀䘀㤀㤀䘀㜀　㄀　　㘀㠀䘀㈀㠀　䌀㜀䔀䘀䘀㠀䈀㤀䔀㈀㄀㐀　䄀䘀䈀㔀㔀㈀㄀　䘀㠀䈀䈀㜀䘀䄀㄀䘀㠀䐀䔀㘀䐀䄀㔀㤀　㐀㘀䌀㠀㌀䐀㔀㜀䘀㤀㐀　㜀㠀㜀䔀䄀㔀䈀㠀㔀䔀䄀㌀㜀　　䔀㔀㄀㔀㤀㘀䌀䄀䈀䈀㈀㤀䘀䄀䔀䘀㠀㘀䘀㈀㤀䄀䔀䘀䐀㠀䈀䔀䈀䌀㤀䌀㔀㜀㔀㔀㄀㜀㄀㌀䐀䐀䈀㐀䄀　㄀㔀㈀㤀㜀㤀䔀䘀㜀㜀㐀㈀㠀　䈀䄀䘀㤀㜀㠀䌀㈀㤀㠀㈀㜀䔀㄀㄀㌀　㠀䌀䐀䔀㜀㐀㠀　䔀㜀㔀䈀㌀㤀㔀䈀䐀㠀䄀䄀䈀㠀㠀䔀䈀㔀㜀㈀㐀㐀䐀䔀䐀㌀䌀䄀　㘀㜀䄀䈀㈀㤀㔀㌀㌀㤀　㌀㌀䄀䐀㘀䌀䔀㐀㤀㜀㔀䈀㌀㤀㌀㈀䐀㈀㘀㄀㌀䔀㘀㄀䄀㔀㄀　㔀䄀㔀㤀㔀䌀䘀㜀㄀㔀䐀㜀㠀䄀㄀　䘀㘀㔀䄀㜀䐀㐀㌀㘀㌀㜀䘀㘀㔀㜀㄀䘀䐀䈀㜀㤀㔀䈀㌀　㘀㐀　㐀㜀㌀䄀䐀䔀䌀䄀㔀㤀　㔀　㈀　䈀㘀㄀㠀㐀㤀　㜀㌀㘀㄀㠀㘀㐀　䄀㈀䌀㌀䐀㈀㐀㄀䔀㤀㘀　㌀㌀䄀䌀㄀㐀㈀䔀㠀䌀䌀䌀㜀㐀䈀㘀䈀䐀㄀㔀䐀䘀㐀㘀㔀㘀䌀䔀　㐀䘀㠀䔀䔀㤀㄀㈀㐀㈀䐀㌀䈀㄀㔀䐀㜀㠀㄀㔀㘀䌀䔀㤀　㐀㠀䔀䘀㌀䘀㔀䈀㈀㤀㜀㐀䘀䔀㘀　䄀㔀䈀　䈀䌀㐀䐀䔀䘀㘀䘀䐀㜀㐀㔀㌀㤀㌀䐀䌀㔀䌀䄀㄀㤀䌀㈀㠀㌀㔀㘀䌀䔀㐀　䔀㠀䔀　　㠀䌀䄀䐀䘀㈀䄀䘀䔀㄀䐀㤀㐀㔀䔀䘀　㜀㠀㜀㄀䐀䐀㘀䔀䔀㔀䔀䌀䔀䐀㐀䘀䘀㔀䔀䔀䐀㜀䄀䌀㤀䌀䄀㤀㔀　䄀䔀　㠀㌀㔀㠀㐀䌀　㔀䐀䌀㔀㜀㔀㤀䐀㤀㔀䈀㌀㤀䄀　䐀㤀㐀䈀䔀㔀㠀㜀㘀䄀㘀䘀㐀䌀䐀㔀　㄀㤀㤀㄀䘀㜀䔀㔀　䐀䔀㤀䔀㤀㔀㐀㄀㘀䈀㄀㔀䔀㌀㈀䄀㘀　　䘀䄀㐀㔀䌀　㌀　㄀㌀㄀㠀䈀㄀㔀㈀　　㌀　䐀㈀㌀㄀㘀䈀㘀　㘀㤀㠀㈀䔀　䐀㠀䄀㌀䈀㠀㌀䔀㘀㔀䔀㔀㌀㈀䔀㈀㜀䘀䄀䌀㄀䌀㠀㔀䘀䘀䌀㠀㐀䄀㘀㄀　　䔀㠀䔀㐀㔀䘀㘀䔀㄀㌀㌀㘀　䐀䘀䐀䄀　䔀㈀䘀䄀㈀䈀㈀䈀㄀䈀㌀㠀䐀㌀䘀䌀䈀㌀䄀䐀䔀䌀㔀　㠀㐀䌀㄀㤀㈀㠀㄀㔀㤀　㠀䈀㌀㈀㔀　㐀㄀䌀㠀㈀㠀䈀䌀䔀㠀㠀䐀　㜀䈀㤀㈀㤀㔀㐀䈀　　㤀㘀　䄀䈀䘀㔀㌀㔀㠀䈀䈀㔀㠀䐀㤀㈀㤀㄀㄀㄀㈀㈀䌀㌀㄀㜀㘀䈀㐀㜀㈀䘀㘀䌀㄀䘀㐀㜀䘀㔀㔀㐀㌀㄀䄀㄀　　　䄀㜀㔀䈀㌀㤀䈀㈀䐀䘀䄀㈀㘀䘀㤀㠀䈀㤀㌀　㔀㌀㘀㌀㤀㘀䈀㔀㤀㤀㤀㔀　㈀䈀㘀㄀㌀㜀䔀㘀䐀䄀㔀䄀　㜀䐀䄀㠀䈀㠀㤀䔀㄀　䔀䔀㈀㌀㤀　㘀㜀䔀㠀㜀䔀　䄀䔀㈀䄀㈀䄀㌀䈀㌀㐀㐀䄀㈀䄀䌀㤀㠀㤀㤀䔀䌀䄀㘀䘀䘀䔀䘀䐀　䈀㜀䄀㐀䔀㄀㈀㠀㈀䈀䌀䈀㄀䄀㘀㄀㌀　㐀㜀䔀㄀㘀䐀䄀㠀㌀䌀㈀㄀䄀䌀㐀㘀䄀䌀㄀㐀㌀　㈀䌀䘀㤀䈀㘀㘀㤀㐀㠀　䘀䐀䘀㜀㘀㈀䄀㠀䈀㠀䌀㈀㤀㠀㐀㜀䔀㄀㄀㌀　㜀㐀㘀㠀㘀㘀　䔀䔀㠀㘀㄀䔀㠀㠀䌀㠀䌀䌀㐀䔀㠀㄀㘀㐀㘀㘀䄀䐀䔀䄀㔀㜀㌀㤀　㘀䔀䄀㘀䔀㈀㌀㐀㘀㈀䄀㘀䘀㤀　㠀㠀㠀䈀䄀䌀䔀䔀㔀㘀㄀㌀㌀㘀㌀䘀㤀㤀㈀㤀㔀㈀㌀㈀䘀㌀䄀　㤀㐀㘀㜀㘀㠀㐀　㔀䘀䄀㄀㤀㘀㘀㌀㜀　㠀㤀䘀䘀㤀㔀㘀　䄀㄀㈀㤀㘀　㠀㜀㜀㄀㜀䐀㜀㘀㜀䄀䌀㄀㐀㘀䄀䄀㐀　㜀䔀㄀㠀㈀㠀䔀㠀㌀㘀㔀䌀㄀㄀㜀䄀䐀㄀㐀㔀㐀䈀㜀䔀㤀㄀䐀㠀㐀䐀㜀㠀䐀䌀㔀䘀㔀䘀㤀䔀㈀㜀䄀㜀䐀㐀㌀㄀䄀㐀㠀㈀㜀䈀㌀㠀㘀㔀䐀㄀㐀䌀㜀䐀䈀䄀䐀㄀㐀㘀㘀䔀㠀㤀㈀䔀㠀䘀　䌀䌀㘀䔀㔀㠀㌀䔀䈀　㐀䌀䈀㤀㐀㐀㜀㤀䘀㤀㤀䘀䔀㐀㜀䘀䘀㈀䘀㤀㌀㐀㈀䈀㌀䈀㌀㔀㌀䄀㠀䘀㔀㌀䄀䐀㄀㐀㠀䄀䌀䌀㐀䄀㄀䔀䐀㜀䘀䘀㌀㜀㠀㔀㌀㠀㜀㤀䘀㜀㔀㈀㈀䈀㠀㔀㌀㜀㐀㈀㜀䈀㤀㤀䐀㈀䘀㠀㄀㈀䌀㔀䌀㤀㜀㈀䔀㘀㌀䌀䄀㔀䘀䘀㌀䌀㌀䐀䔀㜀㄀䔀䈀㌀㄀㘀㜀㐀㘀㄀　㠀㜀㤀㘀㘀㈀㘀䐀㜀㈀䈀㌀䌀㜀㐀㘀㈀　㠀䘀䐀䐀䘀㔀䈀㈀㔀㘀　䐀㈀䘀㐀㔀㠀㄀㜀㘀㔀㤀㄀㌀㄀㠀㔀䐀　㈀䘀　㈀　㘀㜀䌀㔀㔀㄀㜀㐀　　㠀㜀䌀㐀㈀䈀䘀䐀䘀㄀䈀䐀䔀㜀㤀㐀㔀䌀䐀㜀㜀䌀䘀　䐀䈀䘀㤀䘀㤀䘀㌀䌀䘀䈀䈀䔀㈀䔀㐀　㠀㜀㘀㔀㐀㤀䌀㐀㔀㐀䐀䐀㄀㔀䈀䌀　䈀䌀㈀䈀䈀䔀㜀䔀䄀㜀㈀䈀　㠀㐀㜀㤀㘀㄀㄀㈀䐀䔀䄀㤀　䄀㘀㜀䐀㌀㄀　䌀䔀㄀䘀䔀㤀䐀㤀㔀㔀㔀㘀㜀㘀㐀䌀䘀　䄀䈀㤀　㤀㘀㜀㌀䄀䌀㔀㈀䈀䔀䘀䔀䄀䈀㈀䔀㐀　　㜀㐀㐀㐀　䐀　㌀㤀㔀䐀㌀㠀䔀䔀㤀㐀䌀㐀䘀㜀䔀㤀䔀㐀䘀䘀㜀䘀㐀䘀䘀䔀䘀䘀㤀㐀䐀㔀㠀㌀䘀㠀㜀㘀䄀䌀䈀㤀䘀䘀　䌀㈀䈀㘀㜀㈀䈀䈀䔀㘀䌀　㄀䔀䘀䐀㜀㄀㔀䌀㄀䐀㈀　㜀㘀㄀㐀䄀㄀䔀㄀㄀㠀䔀㔀䔀　䔀㤀䘀䐀㜀䐀䘀䌀䘀䔀㤀㘀䘀㄀䄀㠀㜀䄀㜀䄀㜀䄀㤀㈀䌀㌀㈀䄀㘀㄀㠀䘀䄀㐀㤀䌀　䘀㐀㄀䄀㠀䘀䔀㠀㤀䄀㈀㠀㄀䔀䈀㔀㐀䄀㠀㜀㌀㌀㔀㄀㈀䌀䈀㄀㜀㔀　䈀㠀㐀䐀㤀㌀䐀㔀䐀䈀䌀䌀㜀㐀䌀䔀䘀㘀䔀䌀䈀䌀㠀㤀㠀㈀　䄀㘀㤀㈀㠀　䌀㤀䌀㠀䌀㠀㔀㠀䌀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䔀㠀㄀㜀　㄀㠀㌀䌀㈀㄀㔀㔀䐀　㘀䄀䌀　䐀㐀䄀䌀㤀䐀㌀䄀䌀㜀䔀㌀㤀　㌀㜀㌀　㌀䐀㔀㜀䈀㔀㌀㜀㈀㄀䘀䔀㔀㈀㌀䌀䄀㔀䘀㄀㐀䈀㈀䐀㜀㈀㘀䔀㄀㌀䄀䘀㔀䘀䐀䄀　䔀䔀䄀㄀㌀㠀㐀㔀䘀䘀䘀　䈀䈀䌀㤀㐀㤀䘀䄀䘀䘀㔀㌀㜀㐀㐀㈀䘀㌀㐀㘀㄀㘀䔀㠀㜀　䘀䐀㜀䘀䌀䐀㌀㠀䌀㈀㠀㌀㔀䐀㠀㈀䐀㘀䘀䔀䘀㄀㄀㠀䈀䔀㠀㄀䘀㔀㠀㄀㐀㘀䈀䘀㈀㐀䈀㤀　䘀䄀䐀㌀䘀䄀䘀䈀㠀䄀䔀䐀　䘀䘀㤀㐀㄀䘀䈀䄀㤀㔀䈀㔀䔀㄀㔀䔀㔀䐀㔀㠀䘀䈀㈀㤀㄀䐀㌀䘀䈀㔀䐀㘀㜀䄀䄀㠀㠀䈀㠀㜀䘀㈀㤀䌀䄀㔀䐀䘀㈀㠀䐀䈀㔀㤀㠀㘀䄀㄀䈀　䘀䔀䐀䔀㄀㠀䐀㈀㐀䐀䐀䐀䌀　㘀䄀䐀䐀㄀䄀䐀㈀㔀㤀㔀㜀䌀䘀㤀㐀㌀㔀䘀䄀㈀㌀䐀㠀䄀䔀㘀䔀䌀䈀㠀㜀䈀䐀㐀㜀䌀䈀䈀䈀㐀䌀㐀䘀㤀䄀䈀㘀䄀㘀㜀㈀㐀㠀㔀㄀䐀㜀　㘀䌀㘀㄀䄀㄀㜀䘀䈀㤀㔀㘀　㌀㜀㜀䘀㘀䘀㐀㌀㠀㐀㜀䔀㄀㄀㌀　䘀㌀䄀䌀㔀㐀㄀㠀㜀䔀䌀䌀䌀䄀㜀䐀㈀䘀　㜀㔀㠀䐀㤀㐀㤀㄀㜀㔀䈀䄀㤀　䈀䄀　　㈀䔀䘀䈀㔀㤀㈀䘀䐀䄀　䐀㌀㐀　䄀㄀㈀㈀㈀　㜀㘀䐀㜀㌀䈀㔀㐀㌀䔀　䐀䔀㄀㈀䔀㜀䐀㐀㜀㠀㌀䈀䘀㐀䔀䔀㄀㈀　㜀㠀䐀㠀㠀䐀　䄀㈀㔀㐀䌀㘀㌀㠀㌀㤀䐀㐀㈀䔀　䄀　䘀　㘀㐀䌀䘀　㘀㐀㈀䔀　㈀　㠀㔀㠀䘀䔀　㠀㄀㄀㔀㘀㄀㘀㌀䐀㤀䌀䔀㔀㘀㔀㘀䘀䌀㈀䄀䐀䐀㐀㜀㔀㤀㠀㤀㈀　䄀㌀㠀㄀㘀䘀䄀㔀㌀㠀䄀　䈀䄀䐀㤀㤀䌀　㘀䌀㌀㠀㈀䘀㈀㄀㐀䌀㘀㠀㔀㜀䐀㈀㄀㌀䈀㈀㠀䌀䐀㌀　㈀䄀䐀　䐀䔀䔀䌀䔀㤀㠀㄀䔀㤀䈀㤀㔀䘀䘀䘀㤀㌀䄀㘀䔀䐀㄀㐀䌀㘀㔀㤀㔀㘀䐀㈀䌀㔀　㠀㐀㈀㌀䄀㄀䈀㤀䐀㘀䄀䈀䔀㤀㔀䘀䈀㜀　㜀䔀䄀䔀㜀㐀㘀䔀䄀䄀㜀㜀䘀㠀䔀㘀㄀㈀䄀㔀㠀㌀䌀㘀㜀䌀㤀䘀䌀䄀㠀䈀㜀䌀㌀䘀㔀㔀㘀㤀䐀䔀㔀㄀㜀㄀㈀　䄀㐀䔀㠀䈀㐀㈀䈀㔀㐀㈀㘀㈀㠀䄀㐀䄀㤀䔀䘀䌀䐀㔀㐀㜀㘀㌀䈀㈀䄀㌀䔀䘀㈀䈀　䄀䈀㤀䔀㜀䘀㔀㔀㘀㔀䘀䄀㐀䄀䔀㔀㄀䈀㔀䄀㄀䈀㈀㘀　䄀䄀䄀㄀䔀䔀㄀䘀䘀䄀　䘀䔀䄀㈀㠀㐀㔀䘀㄀䈀䌀䄀㤀㌀㌀㈀㜀䈀㠀㈀䐀䔀㔀䘀䄀䈀䈀㈀㌀䘀㐀㔀䘀㤀䄀㌀㜀䔀㔀　㔀䔀䐀䘀䄀䔀㜀㈀䈀㤀㔀䌀䔀㔀㐀䈀䐀㤀㈀䔀㔀㄀㄀䄀䐀㠀㐀㄀㠀䐀　㈀䘀䔀䔀㔀䌀䄀㄀㜀　㌀䌀㌀㘀䌀䘀䐀䐀䔀㐀㠀㘀㔀䘀㐀㤀　䐀㈀㜀㔀䈀䔀䌀䄀㜀䌀㄀䘀㤀㔀䘀䈀䈀䔀㈀䄀㔀㜀䔀㈀㠀㄀㔀㤀䘀㐀㔀䐀䌀㌀　㠀㠀㔀㄀㄀㤀㔀㄀㔀㔀䈀　㌀䘀䔀㔀㈀㘀㔀㜀㜀䈀㠀䐀䔀䘀㜀䌀䐀㤀䌀㔀䔀䈀䘀䄀㜀㈀䈀䔀䐀䄀䘀㔀㈀㤀䌀㜀㐀䘀㐀㄀㌀㐀㈀㌀㤀㔀䌀䄀㈀䘀䈀㜀䈀㈀䈀䐀䌀䘀䐀㤀㔀䄀䔀㔀䈀㤀㐀㈀䔀䈀㘀㈀䌀䘀䌀䌀㐀㐀䄀䄀㄀䈀㐀䈀㌀䘀㈀䘀　㄀䈀䔀㔀㘀㌀㘀䘀䐀㔀䔀䈀䌀䔀䄀㄀㤀䌀䄀㜀㠀㜀䈀㠀㘀㠀㈀㜀䈀䈀㔀㤀㌀㔀　㠀　䔀　䐀䘀䄀㐀㔀䌀　㔀　䌀㠀㌀㐀　䄀㈀䄀㤀㠀㠀㘀䌀㐀㄀㘀䘀㠀㄀䘀㔀䄀䈀㤀㐀㜀㘀㔀㔀䔀㜀㄀㔀䐀㘀　㘀㔀㐀㌀䄀㐀㐀㌀㌀㄀䌀㌀䄀㄀䌀㄀㘀䘀㄀䐀䐀䔀䘀㄀㄀㄀㤀㐀㤀㄀㠀䐀㠀䄀䄀㜀　㄀㄀䐀㘀㜀䔀㔀䘀䔀㤀㠀㘀㌀䘀㔀㠀䌀䔀䘀㄀㄀㈀㈀䈀㜀䔀䄀䈀䐀㌀䈀䘀㔀䐀䔀㠀䈀㠀䈀䔀䈀䈀䘀䄀䌀㄀㐀㘀㐀䄀䘀㔀㄀䐀㠀㜀㐀㄀㘀㜀㘀䄀㘀䈀㈀㤀㤀㘀䔀㜀䈀㠀㔀㜀䘀䄀㈀㤀㔀㠀䐀㘀㘀䄀䔀䐀㈀䌀㤀㔀㘀㜀䄀㄀䄀㈀䈀㠀䐀　㌀䄀㄀䘀㌀㈀㐀㌀䐀　㜀㈀䈀㤀㔀㌀㘀㌀䄀　㄀　䐀㤀㤀㐀㘀㐀䄀䌀㜀㘀㔀㜀㐀㠀㜀䘀㔀䄀㈀㘀㌀㈀㄀　　㄀㘀䔀䈀㌀䔀㜀㤀㐀㈀㔀　㜀䌀㔀㘀䘀䘀㄀㌀　㜀　䐀䐀㘀㄀䈀㈀㐀䈀㐀䘀　　䌀㤀㔀䌀㌀㔀㈀㠀㔀㜀㜀䄀　䐀㈀　䌀䐀䈀䈀㘀䄀㌀䈀䔀㘀㄀㈀䘀䌀䈀㘀䐀㈀䄀㠀㌀㄀㤀㐀䄀䘀䘀㤀㄀㐀䄀　㌀㘀㤀䄀㐀㌀㌀㘀䌀䄀㘀㜀　㘀㜀㈀㤀㌀䔀㠀㐀䐀㘀㈀㄀㜀䄀㘀䔀㈀䄀㘀㌀㠀㐀㈀䔀㐀㈀䔀䐀㄀䌀䔀㔀㤀㄀㜀䈀㜀㐀　㠀　㐀䌀㐀㜀㔀㔀㘀䔀䐀㘀　䘀㘀䘀㈀㤀䌀䄀䈀䔀㜀㤀㜀䄀䈀㘀䌀㘀㘀㠀㘀䘀䌀㈀㄀㐀㠀㄀　㘀㠀㘀䌀㘀㠀䈀䌀㔀䐀㘀㤀㤀䈀䄀㤀䘀㈀㜀㤀䄀䔀䌀㈀䐀䈀㐀㠀䘀㄀䄀䐀㔀㈀㤀㤀㔀䐀䄀㠀㌀䄀䐀㠀㌀䘀㤀㐀㄀㄀䘀㜀㄀　㘀䌀　㠀䐀㌀㈀䈀㔀㔀㌀䔀㈀䘀㔀　㔀䄀㌀㘀㔀㜀䘀䌀㤀㜀䄀䄀㤀䔀䄀䘀㔀㈀㄀䔀䌀㤀䌀㜀䈀㔀䄀䄀㠀䘀㔀䈀㔀㐀㐀㜀䌀㐀䌀䈀䄀䔀䔀䌀㘀䐀㤀㔀㌀䘀䄀䘀䐀䘀䈀㤀䘀䄀㐀䐀㤀㤀䐀㈀㈀䔀䘀㘀㐀㠀䌀䄀㘀㄀㜀䔀㜀㄀䔀䐀䄀㔀䘀㈀㌀䐀㐀　䔀䘀䘀㤀　䌀䘀㔀　㘀㤀㔀　㌀㠀㌀䌀㐀㄀䐀㠀䄀　䘀䄀㄀䘀㤀㌀㈀䄀㔀㠀㌀㘀㜀　㠀䌀㈀䐀㤀　䄀䐀䈀䘀㐀䈀䘀䌀㜀䈀㔀䈀䈀䌀䄀䔀㠀㌀䔀㄀䈀㌀㈀䘀㐀㠀䈀㠀　䘀㄀㐀㘀䌀䄀㠀䔀㔀㤀㈀䄀㤀㐀　㘀䌀㈀䔀㠀䌀㠀䔀㠀㐀䈀䌀㌀䄀　㘀㌀䐀㈀㜀　㘀㤀㠀　㌀㐀䄀　䐀䈀㜀㐀䘀㤀㌀䈀㌀㐀㌀㘀㌀䄀　䔀㄀㔀䌀㘀㘀㠀㐀㤀䄀㜀㘀㐀　㐀㘀㈀㠀㐀㐀　㄀　㤀䐀䄀㤀㌀㠀㠀䔀䐀㌀䘀䘀䔀䌀㌀䘀㌀㤀㐀　㘀㄀㌀㈀㠀㈀㌀㌀㜀㈀㌀䔀䄀䌀䈀㐀䘀㠀䔀䘀䌀㜀㄀㔀䔀䘀㘀䄀䐀䐀䄀㜀㄀㄀䐀㄀䘀㠀㤀䐀㐀㄀㜀㈀䄀䄀㤀䈀䌀䔀㐀㄀　㌀㘀㄀㄀䘀䌀㤀㌀䌀㈀䈀䌀䈀㜀㐀㐀䐀䘀㠀䌀䔀㌀㜀䔀䈀㌀㄀䈀㈀㈀㈀㠀䌀䔀㠀㔀㐀㘀㜀䔀䈀㄀䈀䈀　㐀㐀㘀㄀㌀㈀䐀䈀㜀㠀㤀㜀㤀㔀㠀㈀䌀䘀㈀㤀㘀㐀　㐀䌀䈀䌀䔀㐀䄀䔀㜀㠀㘀　䄀㜀㌀㔀䘀㠀㔀䈀㜀㐀㘀㜀㤀䔀㜀㤀䈀㤀䈀㤀㔀㈀䘀㌀䄀䘀　㘀䌀㤀㔀䌀㜀䈀㘀㜀䄀㘀㜀㠀㘀䌀㈀㠀㌀㄀㈀䄀㜀㜀㌀㈀㈀䌀㠀䔀䔀㔀　㤀㠀䔀䘀䈀㈀䄀䄀㐀㌀㘀䌀䄀㤀㌀䄀㔀㠀䄀㄀㌀㈀㜀䌀㈀䌀㜀䌀㜀䘀䄀　䔀䔀㤀㌀　㘀㠀㐀䐀㤀㔀㘀㐀㤀㜀㤀㔀䔀㘀䌀䄀䐀㈀　㄀䐀㈀䔀䈀　㈀㠀㐀䈀㘀㘀㤀㠀䐀㜀㈀䈀㌀䘀㌀㄀㘀䐀䄀䈀㄀㔀䐀䔀㔀㈀㤀㔀　㜀䘀㔀䈀䈀㠀㄀䔀䔀㈀㌀㌀㐀㤀䌀䈀䔀㜀㜀䈀㘀㠀䐀䈀㈀㘀㘀䈀㘀䘀㔀䈀㠀䘀䔀㄀䘀㔀㄀䈀䄀䈀䐀䘀䌀㔀㘀㔀㤀䐀㔀㔀㘀㈀㈀䐀㘀㔀㠀䈀㔀㔀㤀䘀　㈀㐀䘀䐀㜀䔀䐀㠀㔀䄀䔀䈀㄀㜀䐀　䄀㘀㤀䔀䄀䐀䔀䘀㄀㄀㘀㠀䘀㌀㐀㌀㌀㤀㤀　䘀䘀㄀䈀㤀㐀䘀㜀䘀䈀䄀䌀䄀䄀㈀㌀㐀䘀㄀㜀㜀㄀䈀㌀䌀䘀㠀㤀䄀䐀　䔀㘀䌀䄀㜀㜀㠀㤀䐀㤀㔀䌀㈀㘀䐀䄀㤀䘀㈀㠀䐀䄀　㤀䌀㘀㘀㔀㔀㌀㤀䌀㜀䈀㠀㈀㠀䈀䘀䐀䐀㘀䌀　㠀䐀㄀㈀䘀　㈀㠀㘀　㘀䌀㈀㄀㘀㜀㔀㠀㐀　䈀㄀㔀䈀䄀䈀䄀䔀㘀㤀䐀　䈀䘀㔀䘀㜀䈀䈀䔀㄀䐀䔀䌀䘀㘀䄀䐀䔀䘀䈀䈀䔀㌀㔀䔀㌀㐀㌀㌀㘀䈀㤀㘀㠀䐀㈀䈀㄀䘀䌀㔀　㜀䘀㈀䘀䄀䌀㜀㤀䘀㘀㔀㌀䘀䐀㔀䐀㤀　䐀䌀㌀䘀䐀㔀䈀䄀䌀㌀㐀㔀㌀㘀㌀㘀㔀䌀㘀㄀㘀㌀䌀㜀䐀䘀㠀㔀䐀䘀䔀䐀䘀㐀㐀㠀䔀䐀䌀䄀䘀㌀䘀㈀䔀㐀䘀䘀　䈀㘀䄀䐀䔀㘀㤀㄀㜀䘀㘀㜀㜀㘀䄀䔀䔀䄀㔀䘀䈀㠀㈀䌀䔀䄀㤀㜀㤀䔀㜀㄀㜀䌀㤀䘀䘀㔀䘀㐀䌀䘀䔀㌀䘀䐀㜀䐀䄀䔀㌀䌀㌀　䐀䔀䘀䈀㘀㐀䈀㈀䈀䔀㤀㘀㈀䘀　㐀㄀䐀　㌀㌀㠀㠀㈀　㌀䌀㔀㠀　㘀㌀䐀㘀　䔀䐀䘀㄀㘀㄀㄀䈀㜀㈀䘀㐀㠀䈀㠀　㜀㄀㐀䌀䌀㘀㌀䔀㤀㔀㠀䌀㠀䌀䘀㔀　㄀㘀㘀㜀㐀㔀䘀䈀　㜀㈀䈀　㘀㐀㐀㌀㘀㈀㌀㘀㤀㔀㌀　䌀䈀㌀㐀㜀㔀㐀㘀䌀㘀㈀㐀㘀㄀㔀㤀䘀㠀㤀䐀㠀㔀㠀䈀䐀　㘀䘀　㈀㘀㘀㔀䐀㔀　䌀㠀㄀㄀䈀　㄀㄀㈀㠀㄀䘀㘀㤀㄀　䔀㜀䔀㤀䐀䔀㔀㠀䔀㠀䔀㄀㔀䔀䄀㈀㠀㤀䄀䄀㐀㔀䘀㄀㌀㤀䐀䘀㐀䄀䐀䈀㈀䄀䘀㐀㔀㄀㘀㌀䄀㔀㘀䐀㐀㄀㈀䘀㘀㠀䐀㔀㜀㔀㔀䐀㜀㜀䔀䈀　䄀䔀㠀㠀䈀䌀㠀㄀䈀䔀㔀㐀䈀㤀䄀㌀䄀㘀䐀㌀䘀㠀㠀㔀㐀㌀䔀䘀䄀㈀㐀㤀㐀䔀㄀㈀䌀㔀㌀㤀㜀㔀䈀䘀㌀㜀㘀　㈀　㜀㠀䌀㄀㜀㜀䄀䄀㜀㘀䈀㘀䐀㐀㠀䐀　㈀䘀　㈀㘀㘀㔀䐀㔀㈀䌀㠀㄀㄀䐀　䌀　㈀㠀㐀䌀㘀㤀㌀㐀㈀㠀㄀䘀䄀㄀㌀㈀㔀㌀䘀䄀䘀㌀㔀䈀　䄀䘀㌀㐀䘀䄀䌀㈀䌀㈀䘀㐀㘀㈀䄀㄀㐀䄀㌀㈀㠀䘀䐀㔀　䔀　䐀㈀㜀㠀䘀㘀㔀㐀㜀䄀䔀㠀㄀　㌀　㈀䐀䌀䔀㌀䌀䌀　䔀䄀䌀䌀㔀㔀㔀䄀㜀㘀䈀㐀㜀䄀㌀䄀䘀㔀㤀㜀㠀䄀㠀䈀㌀㐀䐀㌀䘀　㤀䔀㘀䈀㤀㔀㐀㈀㄀㔀㐀㔀䔀㐀䄀㤀㠀䄀䔀㜀㜀㠀䄀䈀㔀㠀㤀㤀䔀㤀㜀䄀䐀䔀㠀䔀䈀㘀㈀㔀㌀䘀㠀㜀㔀䈀䄀㔀　　㜀㜀㐀䄀䐀䌀䔀㤀㔀䔀㜀㐀㌀㤀㘀䔀㐀䘀㠀㔀㔀㈀㜀㜀㔀㜀䔀㔀㠀䈀㌀㈀䐀䌀㐀䐀䘀㤀䐀䄀㔀䔀䔀㤀䄀㘀䐀䌀䐀　㈀䐀䌀　㤀㈀䌀　䄀㐀㌀䌀㘀㠀㄀㔀䄀䐀䈀䄀㈀䔀䔀䈀㘀䔀㔀䘀㤀㔀　㌀䘀㔀㌀㔀䄀㈀䘀䘀㤀䐀䘀䔀㠀㘀㄀㈀㐀㘀䔀㜀䈀㔀㤀䘀䐀㈀㠀㤀䘀㈀䘀㐀　㈀㤀㔀㠀㄀㤀䈀㠀㤀㔀䌀㘀㄀䄀䐀㔀䈀　㐀㤀䌀㐀㈀䌀㜀䔀䔀䔀䌀　　䄀㔀䘀㔀㄀䔀䈀䐀㠀㌀　䔀㘀㤀　䈀䐀䐀䄀㜀㤀䔀㜀䔀䄀䌀䈀㈀㈀　䄀䐀㌀㜀㈀㤀　䐀㤀㜀䔀䄀䐀䔀䈀㤀䄀䄀䐀㌀䄀㌀㤀㐀㈀㜀　㘀　㜀㄀㐀䈀䈀㜀䈀䄀䈀㈀䔀䌀㠀䘀㌀㌀䌀䄀䈀䈀㘀㄀㌀䄀　㈀䌀㠀㘀㈀㈀㌀䘀㐀㔀䘀㔀䔀㌀㘀䐀㠀㠀㌀㐀䄀䐀㔀㘀䐀䔀㘀㌀㄀䐀䐀㘀䈀㔀䐀䐀㠀㄀㐀　䈀䘀　㠀㤀㠀㜀㔀㐀㤀㈀㄀䈀㜀㐀㌀㄀䐀䘀䐀㌀㤀㔀㜀㜀㄀䐀　㄀㤀㄀䘀㔀㄀䐀䄀　䔀䐀㈀㜀䈀㜀㐀㜀㐀㄀䄀㈀　㠀䐀　㈀䌀㔀䔀䔀㌀㄀㔀㘀㌀㘀㌀　㄀䄀䐀㜀㤀㄀䌀䄀䌀䘀䘀㔀㐀䄀䐀䘀㐀㌀㔀㘀㐀䘀䄀㜀䘀㈀㄀䔀䔀䌀　㌀㠀䐀㤀䐀㐀㘀㐀㘀　㌀䈀䘀㔀䐀䌀䘀䄀䘀㔀㌀䈀䄀　䔀䈀㜀㠀䄀㤀㈀㈀㜀㤀䌀䈀䈀㤀㐀䈀䔀㜀㘀䈀㐀㈀䐀㘀㤀䐀䐀㔀䄀䘀㤀䐀䔀䌀㤀㐀㘀䐀㌀䈀䐀䌀㐀㐀䐀㐀㜀㠀㐀㔀㄀㐀㄀䈀　䄀　㄀䌀㜀䐀䄀䄀䘀㈀㠀　㜀　䐀㠀㔀䘀䌀䘀㌀㘀㔀㜀㄀䄀䘀㠀㐀䈀䐀䐀䄀　䈀䌀䌀㐀㜀㤀䐀㘀䐀㔀㈀䄀㤀㌀㐀㠀㔀㜀䘀㜀䈀䄀䔀䔀䘀㠀䔀䈀㔀㐀䘀㘀䄀㌀㈀䄀䐀䈀㐀㠀㜀䘀㈀㌀䄀　　䘀㔀㄀㄀㠀䌀䘀㔀㈀䐀䄀㤀䌀㤀㘀㈀㘀㌀䔀㘀㘀㈀㌀㜀㄀㠀䈀䌀　㄀䌀㤀㔀　㜀㠀㈀䔀㐀　㈀㜀䐀䌀䈀㈀䌀䔀㔀䘀㜀䘀䄀䔀䈀㌀䔀㜀㐀㠀䔀㔀㄀䘀䌀䌀㐀㜀㤀䄀㘀䈀䔀䐀䘀㔀㘀㘀㤀㜀㜀䄀㔀䘀㈀㐀㘀㈀䄀䔀䘀㄀䈀㔀㐀㜀䔀䈀䔀　䘀䔀㘀㔀　㌀䐀䌀㌀㔀　㜀㔀㐀㜀䔀㔀㤀䘀㌀䄀㜀㈀㔀㘀䔀䘀㈀㄀䄀㔀㘀㌀　㜀䐀䐀㌀䘀㔀㠀䘀㄀䄀㐀㜀㔀㌀㠀㤀　䔀㠀㄀㜀　㄀䈀㌀䄀䔀㈀㠀㘀㐀㌀䄀㌀㌀㤀㔀䐀䘀䄀㐀䐀䐀䄀䘀䄀㌀㌀䘀䘀㤀㜀㘀㘀㌀㌀䐀㔀䈀㘀㌀䄀䐀䐀㐀㈀䐀䘀㜀㘀㠀㌀　㐀䈀㜀㔀㜀䘀　䈀䌀㔀㐀㤀䐀䄀㄀䘀㔀㐀㌀䔀㤀䌀䐀㈀䐀䐀䐀䌀䔀䄀䔀㤀㔀㐀㌀䄀䔀㜀㄀䌀䌀㔀㐀䈀㘀㌀㤀䈀㘀㔀㄀㔀㠀㔀㠀䈀㤀　䈀㤀䌀　㈀䄀㜀䄀㤀㔀㤀㤀䌀䐀㔀䐀㈀㄀䈀䐀䔀䐀㘀㠀㔀䈀㔀㌀䐀䄀㘀㜀㔀䄀㌀䐀䐀䐀䈀䈀㔀㔀㐀㠀㌀㜀㘀　㔀㘀㐀㌀㐀㜀䈀䐀㔀㈀䔀㤀㠀㄀　㤀㤀㤀㘀䈀䐀㔀　䌀䔀㜀㈀㘀䌀㔀㠀䘀　㜀䈀䈀䌀㔀㈀㄀　䐀䔀䈀㤀㈀䘀䔀㜀㜀㠀䄀䐀䔀㌀䈀㔀䌀䄀㐀䈀䘀㘀㄀㜀　㔀㘀㠀㔀䈀㈀㐀㈀㤀㠀䘀䐀㈀㈀㤀㐀㄀䈀㐀㈀　䐀㜀䘀㌀㘀㜀㄀㠀䈀㠀　㔀㌀䐀㔀㔀䔀䐀䔀䌀䌀㔀㐀㤀㠀䌀䐀䌀䌀㔀㘀䈀㠀䔀㐀　㤀㘀㜀㔀䐀䐀䔀㔀䔀䈀㠀䘀䘀㘀䌀㤀㔀㈀㌀䈀㌀㌀㔀䘀㘀䈀㤀䐀䌀㄀㠀㤀䔀㤀㄀㔀㘀　㐀䌀㔀㈀䌀䘀䐀䔀㘀䈀䐀㤀㔀　䄀䐀䘀䈀㜀㄀㌀㔀　㤀㘀㔀䈀䔀㤀㤀䈀㔀㔀㐀䄀䌀㌀　㤀䌀䄀䐀㜀㄀㔀㜀䄀㘀㜀㌀䈀㘀䈀䄀䐀㐀㌀㘀㘀㐀㈀䐀㐀䐀㔀㐀㈀㄀䈀㌀　䘀㐀㠀䈀㠀　㘀㄀　㐀㔀䐀㔀㜀㄀㐀㜀㈀㠀䄀䈀㠀㠀㔀䐀䌀㔀䐀㌀䄀䄀㘀䘀㐀䔀㜀㔀㈀㘀䈀㜀㔀䘀㜀䘀㠀䌀䈀㈀䔀䔀㈀䄀㐀㠀㄀䔀㌀䔀㘀㠀　䌀㘀　䐀㌀㔀㜀䐀㜀㔀䘀㈀㘀䔀㐀䄀䄀㜀䄀㘀㠀㠀㘀㤀㐀㠀㔀䐀㐀㤀㌀㠀㌀䄀䐀㄀䈀㘀㐀䐀䐀䈀䔀㌀䘀㤀　䔀㠀㄀䘀㜀㔀㐀䄀㔀㠀䐀㤀㤀　㜀㌀䔀㘀㤀㌀䄀㔀㄀䔀　㤀䘀䄀䐀䈀㤀䈀㜀㈀䔀䔀䈀䔀䔀㜀䘀㘀䈀䔀䔀䄀㔀䘀㐀㌀㜀　㈀㄀䌀㈀㄀㠀䌀䈀　㘀　䈀㌀䐀䈀㤀㤀䔀㄀䐀㤀䘀㤀䘀䄀䈀䈀䄀　㈀㄀䘀䌀　䈀䄀䐀㌀䐀䈀䔀䄀䐀　䈀　㄀㠀㜀䈀　䄀㈀㐀䔀㤀䌀䘀㤀䘀䌀㤀㤀䐀㔀㘀䘀㤀䈀㘀㠀㘀䄀㈀䈀　㠀㘀㤀㘀䘀㔀㌀　䈀䐀䈀䌀㐀㐀㤀㄀䐀㌀㈀㐀㠀䔀䌀㘀䘀　㌀㠀㠀㜀䔀㄀㄀㌀　䌀㌀　㠀㤀㘀㌀䄀䔀㠀㘀䘀㄀㠀䌀䐀㌀䈀䔀䐀㠀㜀㔀㠀㄀䘀㘀　㘀㐀䌀㐀䈀㜀　䐀㌀㌀㈀䐀㐀㘀䔀䐀䈀㔀㌀㘀㄀䌀㘀　䘀㤀䌀㤀䄀䌀㠀䄀㌀㈀㔀䘀㘀䔀䈀䐀　㄀㌀㌀㤀㈀㠀㔀㔀㘀䌀䐀䌀䔀㜀䄀　䐀　㘀䄀㤀䐀䘀䐀㠀　　䄀㈀㄀䘀　㔀㠀䌀㌀㌀㄀㐀㘀䔀䐀䈀䐀㄀㠀㤀㐀㔀㜀　㘀㌀㌀䈀㌀䄀㐀䌀㌀㐀䔀䄀㠀䈀　䌀㐀䌀㤀㌀䘀㘀㜀䔀䄀䌀　䌀㐀㄀㈀㜀䄀㐀㈀䌀䌀　㄀㘀㐀䄀䌀㜀䈀䄀㄀㐀㌀　䄀㐀㠀㄀㘀㔀㄀㈀㌀䄀㤀㘀㔀䈀䐀䈀䈀䌀䌀㜀䘀㐀䐀䌀㘀䐀㔀䘀䐀㈀㠀䐀㠀䐀㘀䔀㜀䌀䌀䄀䔀䌀㠀㘀㄀㤀　㄀䘀䄀㄀㐀䘀㈀䌀　　㠀㔀䘀䐀㜀㘀㤀㤀䘀䄀㘀㌀　㄀㘀㜀㜀㠀㠀䈀㌀　䔀㤀䌀㈀㠀㠀㄀㈀䔀㠀㌀䌀䔀䌀䄀䄀䌀䔀䔀㄀㈀㄀䈀㄀䈀䐀㈀㌀㈀䄀㜀䘀㌀䐀䘀䐀㔀䘀　㘀䔀㘀㐀䔀　㌀䄀䔀䐀䈀㤀㘀䄀㘀㜀㔀㠀㌀䈀㔀㌀䐀㜀㐀䘀㤀㈀㘀㜀㈀㤀㤀㌀㄀㘀䐀䈀䐀㜀㄀䄀㤀䈀㌀㠀㤀䄀䐀㈀䐀㐀䈀㜀䔀㠀㄀㜀　㄀䌀㌀㜀㐀㌀䐀㄀䄀㜀䔀䈀㄀䔀㘀㠀㐀䄀䐀㘀　㔀㐀㘀㔀㐀䐀䔀䈀䔀䌀㠀䈀㄀䈀㌀䐀㘀㈀㤀㠀㠀㘀㔀　㠀㤀䌀㘀㜀㘀㘀䈀䘀㐀㤀䌀㠀䄀㈀㜀㔀䘀㔀㐀　㐀㤀䐀　㌀䘀䐀　㤀㠀䐀　䘀䘀䈀䄀㘀㘀㠀　䌀䐀㠀㈀䐀㐀㌀䈀　䐀　㐀䄀㈀䘀䘀䌀䈀䔀䄀㔀㄀䔀㐀㔀䔀䌀䘀㔀㠀䄀㜀㜀䄀䔀䐀䔀㈀㌀㤀䐀䄀䌀䈀㜀㘀㤀㐀䌀㈀㠀㘀㘀㘀㄀㄀㌀㌀㘀㔀㔀㌀䄀㤀㘀䔀䄀㔀䈀㤀㘀㈀㄀㤀㠀㌀䐀䈀㠀㜀㈀䘀㜀㘀㄀䄀㔀䘀㤀　䔀䔀㔀䌀䐀䘀㌀㜀䘀㠀䘀䘀㈀㠀䌀㄀䐀㄀㔀䘀䄀㠀䄀㔀㜀㈀䈀㐀䘀䔀㠀㐀㘀　䔀䈀㘀㜀䄀㐀㌀䈀䐀㤀䈀㤀㔀㤀㜀㌀䈀㄀㐀䄀䔀䘀䈀䔀㠀㜀㔀䔀㌀䌀㄀㄀㄀㈀䈀㤀㔀㠀䐀䘀㜀䄀䄀䄀䌀䐀　㈀㌀䄀　㜀䌀㜀䐀㔀　䘀㤀㜀㄀　㘀㠀㘀䈀㐀㄀䐀䄀䘀㌀㠀䘀㘀䐀㔀䘀㔀㈀䈀䄀㔀㠀㜀䘀㠀䐀　㌀䈀㄀䐀䄀㌀䈀㈀䈀䐀㐀䐀䔀㔀㜀㌀䄀䐀䔀䔀㔀䐀䄀䐀䔀䘀㔀䔀㘀㘀䄀㌀㠀䐀㔀㐀㜀㤀䄀㜀㠀㤀　䐀㈀㄀㈀䘀䐀㜀㈀㠀㜀䔀䐀㈀䘀䌀㔀䄀䐀䐀㄀䘀䐀㄀䘀㜀䌀䈀㔀㐀㈀䔀䔀䐀䘀㈀㠀䈀㔀䔀䄀㌀㠀㤀㜀㤀䘀㄀㌀䌀㐀㔀　㘀㠀䔀㌀䄀㜀㜀䔀㌀䐀㈀䌀䈀㔀㔀　㘀䌀㐀䌀㄀㄀㈀㤀㄀㜀㘀䔀㈀㈀䌀䐀䔀㈀㌀㜀䄀㤀䘀䈀䄀䐀䐀㈀䌀䐀䌀㐀㌀䄀　㈀㄀䌀㐀䐀䐀䄀　㄀㌀䌀㄀㠀㠀㜀䔀㠀䘀㌀㘀㠀㄀㔀㈀㄀㤀　㄀㜀䐀䄀㈀䐀㈀㐀㠀㔀㤀䌀䐀䐀㌀䈀㜀㈀䌀䄀㄀㔀　䐀㐀㔀㌀㤀䘀䈀㜀䔀㠀䐀䄀㔀㌀䘀㤀䘀㈀㜀㜀㐀㤀䐀䈀䔀䘀䘀㔀㐀䐀䐀䄀䔀䔀䄀㜀㈀䈀㄀䐀䌀䈀䘀㐀䌀䐀㔀㜀䄀䐀䌀䘀㌀㜀䄀㜀䘀㘀㠀䈀㠀　㐀㤀　䐀䈀䘀䘀䌀䌀㐀　　㈀䄀㠀䌀　䄀㜀㐀䘀㘀䌀㔀㠀䐀㄀䔀䈀㜀䐀　㜀䈀䐀㄀䐀㠀㠀䔀㌀　䔀㠀䈀㠀　㠀　䈀㌀䄀㌀㠀㜀㤀㠀㌀㌀㤀㐀　　㄀㠀㠀　㈀䔀䐀㄀㘀䄀䈀㠀䌀　㄀䌀㜀䌀㈀㄀　㐀䌀㔀㌀䐀䌀㜀㐀㜀　㐀䔀㌀㜀㐀　㄀㄀㐀䄀㘀㌀䄀㘀㌀㄀䈀䄀㠀㈀㜀㄀䈀䄀䌀㈀㜀　㤀䈀㈀㌀㌀㜀㔀　䘀㐀䘀㐀䐀㄀㠀㠀㘀㠀　䌀㘀䘀䈀㌀䈀㈀　㌀䈀　㈀䔀䌀㜀㘀㔀䔀㘀䔀㌀㔀㘀㔀㤀㄀㜀㜀䈀䘀䔀㔀㄀㤀㠀㌀㈀㌀㈀䈀䄀䌀　㠀㈀䄀㤀㘀㄀㈀㘀㠀㄀䄀　㘀㤀㌀㈀䐀㐀䐀䈀㔀㘀㘀㤀㠀㔀㜀㄀㐀㄀䈀㠀䐀　　㠀㘀㤀䄀㠀㤀㄀㜀㄀䘀㄀䈀㈀㌀䈀㔀㈀㘀㔀㐀㐀䌀㌀㜀䌀㤀㜀㔀㔀䌀㘀㤀㄀㘀䔀㘀㤀䔀䌀㜀㄀䐀　㠀㠀䌀䘀䈀　㔀㈀㠀䘀䔀㐀㠀㈀㤀䔀　䔀䔀䄀　䌀䌀䐀㜀㐀㔀䐀　䌀　㘀㌀㜀㈀䄀㈀䔀㔀㠀㄀䈀㠀㐀㜀䘀㘀䄀䄀㐀㐀䄀㘀㜀㘀䌀㘀㈀㐀㌀䈀㠀䈀㜀㤀㜀䌀䄀　㈀䔀㄀䔀㜀䘀㐀䘀㜀㘀䘀㐀㌀䘀䄀㈀㤀㠀㌀䘀㌀䐀䈀䔀㐀㜀㜀㘀䘀䄀䈀㘀㜀㔀䔀㌀㘀䈀　㜀䄀　㘀㘀䔀䈀㘀㔀㔀䌀㘀䄀㔀㐀䘀　䘀㘀㔀　䘀㌀䈀㄀㠀㔀㤀㌀䌀䔀䄀㜀㜀㌀䘀㌀䐀㜀䈀㈀㐀䐀㐀　䘀㘀㤀䐀䈀㔀㤀䘀㄀㈀㄀　　䔀㘀㔀䈀䌀㤀㤀䔀㔀㄀䐀㜀㘀䔀㐀㜀㐀㔀䘀䈀䄀㐀㜀䐀㜀㄀㌀㐀䌀䐀䈀㔀㜀䄀　䘀㐀㄀䈀㜀㐀㠀䔀㔀㜀䘀㤀䌀䈀㔀䈀㈀㐀㜀㤀㄀㔀㤀㜀㐀㈀㄀㤀䐀䈀㘀㜀䈀䌀䄀䔀㄀㔀䔀䄀㔀䄀㤀㄀䘀㤀㜀䐀䐀䄀㌀䐀　㈀䘀　㈀㈀㘀㌀㔀䘀䌀㘀㈀䈀㐀㘀㜀㐀㐀㘀㄀䘀㐀䄀㔀㐀㄀㌀㤀䘀䈀㄀㈀　䐀䐀㤀㔀㈀㘀㌀㌀䈀　䄀䘀䌀䌀㤀䈀䄀㄀㠀䔀㄀㘀㠀㤀㠀䐀㌀䘀㐀䘀䔀　㘀䐀㘀㘀䄀　䌀㌀㠀㔀㘀㠀㘀㘀　䈀㔀䐀㈀䔀㈀　㈀　㔀㤀䐀　㔀㤀㔀㐀䌀䔀㌀㐀㘀㔀㠀㄀䌀䄀㠀䘀䘀㄀䘀㔀㐀䈀㠀㘀䔀䄀　䔀㠀䄀㌀㄀㜀㤀䐀　㜀䘀㘀䌀㔀㜀䐀䐀䌀㌀䔀㘀　㄀㔀㠀㌀䈀㌀㌀㐀䌀㤀䘀䘀䈀䐀㔀㘀㈀䐀㔀㤀㄀㠀䄀㄀㐀䘀㔀　㤀䔀䌀㠀㘀䘀㤀㌀䄀㄀㄀䔀㘀㤀㜀㜀㤀㜀　㄀䔀㐀㄀㄀　㄀㄀㌀㠀䐀　㜀㌀䐀　䘀㘀䈀䘀㔀䐀䌀㘀㜀㌀㘀䌀䌀䐀㘀㌀㘀䈀㜀䐀㄀　䌀䌀䌀䔀㌀　䄀䔀㌀㘀㐀㈀䈀㔀㤀㤀䔀㈀䐀㤀㔀㔀㘀㐀䘀䌀㌀㐀䔀䌀䄀㈀䈀䘀㤀㤀㠀䄀㤀䘀㜀㄀㄀䄀䔀㜀㜀㔀㤀䈀䐀㤀㄀䄀䄀㈀䘀㘀㄀㈀㤀㠀䈀㤀㐀䌀㤀㤀䈀䄀㘀㌀㈀㠀㌀䄀䄀䄀㜀䌀䔀㜀䐀䐀㘀㜀㤀䈀㐀㔀㔀㠀䌀㤀㄀䈀㌀㌀䌀㐀䐀䘀㤀䄀䐀㘀㌀㔀䔀䔀㘀䔀㤀㔀䈀䌀䘀㔀㌀㘀㐀䔀　䄀㈀㜀㄀䔀㤀㘀䐀䌀䄀㠀䘀䘀䈀䌀㠀䐀㤀㈀䄀䌀㐀䈀㜀㐀䘀㈀㠀䈀㌀㄀㜀䔀䈀䈀㜀㌀㌀㘀㠀䐀㄀䈀㜀㌀㌀㘀㔀䘀㐀㐀䌀䔀㔀䔀㌀䐀䈀㈀䄀㔀䈀䌀䄀䌀㐀㠀䘀㠀䈀䘀㄀䄀䐀　䌀䈀㐀㔀㌀　㐀㤀䔀䈀㜀㔀㄀㘀㜀㠀䘀㈀䔀䈀㌀㔀㘀㘀㘀㜀㄀㤀㄀䌀䄀㈀　㘀䐀䘀㜀䈀䌀䈀㌀䈀䘀䘀䔀䈀䄀䐀㄀㘀㐀㤀䔀䌀㄀㜀㐀　㄀㈀䄀㌀㤀㄀䄀㜀䔀㤀䐀㘀㌀䌀䐀㠀㠀㤀䄀䘀䔀䌀㤀㘀㐀㈀䘀䐀䄀㌀㄀　㐀㤀䘀䐀㄀㔀䘀㜀㜀㜀㘀㄀䐀㄀㤀㈀㈀㠀㐀㐀䔀㘀㐀㈀䄀䈀䄀　㄀㤀䐀㤀䄀䌀䔀䔀㐀㠀㘀㠀䘀㘀㤀䘀䔀㄀䐀㜀㐀㠀㠀㠀䘀㜀㐀㄀㄀㄀䔀䄀㜀㈀㌀㌀　㄀㌀䔀䄀䌀㐀　㈀㜀㤀䐀㤀㤀䐀䐀㔀䘀　䈀䌀㠀㤀䄀䐀㜀㈀㄀䌀㘀㘀㄀㔀㐀㌀㠀㌀㔀㌀䔀䘀㘀㔀䐀㘀㄀㤀㤀䐀㤀㠀㤀㤀䈀㌀㜀㔀㠀䐀　㔀㤀䐀䘀㈀㄀䈀䐀㤀䈀㌀䄀㘀㌀䌀㜀㔀㌀㈀㈀䔀㐀䐀䐀䈀䔀　㔀㔀㄀䐀䐀䔀㐀䘀䔀㌀䘀㠀䄀䌀䐀㔀䄀㌀㔀䐀䐀䈀䘀䔀㐀㔀䘀㈀㌀㜀䄀㈀䌀䔀䐀㠀䈀㜀䔀䘀䐀㄀㈀䘀　㈀䄀㘀㤀䘀䐀　　䐀㐀㌀㌀　㔀㄀㠀㘀㈀㠀㌀㈀㌀㠀㤀㌀㠀㄀㤀䘀䐀㠀䈀䄀㘀㄀㠀㄀䐀㘀　㔀㐀㌀䐀㌀　䐀䐀㘀㔀㔀㜀䔀㌀㌀㈀㘀㠀㠀㈀䌀㘀　䔀䄀䐀㄀㠀䐀䐀　㤀㠀䌀㠀㠀㤀　　㤀㄀䌀㄀㤀㤀　䌀䄀䌀䈀㘀㜀㔀㠀㌀㜀㘀　䌀䌀䐀䈀䄀䌀㐀䈀䄀䌀䄀㘀䘀䌀㘀　㐀䐀㄀㈀䘀　㈀㈀㘀䘀㔀㄀䐀㄀䈀㔀㄀㘀㜀　　㔀㘀䔀㜀㘀䈀㌀㜀㐀㔀㈀㜀㘀㌀䈀㤀㐀䔀㘀㄀㐀䌀䈀㘀䘀㄀㄀䔀㤀㠀㘀䌀䐀䄀䈀㈀㤀䈀㜀㈀㐀㠀㘀㤀䔀䈀䐀㐀　　㈀䘀㈀㌀䄀㌀㘀㜀䔀㠀㄀㜀　㄀㠀㌀䐀㈀　䔀㄀㘀　㠀䄀㔀㄀㜀㜀䄀　䐀䄀㘀䌀　䔀䌀㠀䘀㐀　㠀㄀䌀㠀㘀䌀　㈀㈀㔀㈀㄀㄀䐀䌀㌀㘀䐀㜀㔀㄀　㄀䔀䈀　　䐀㈀㠀䐀䌀䔀㠀䈀　㘀䔀㤀㐀㠀㠀㘀䔀䔀㌀䄀㔀㔀㘀䔀䄀㌀㜀䘀㘀䐀㈀㌀䐀㄀㠀　㘀㈀㠀㘀㌀㄀㐀㜀㔀㈀㠀㠀䘀㔀㄀䄀㈀㌀㈀䐀㔀㌀䘀䐀䄀㈀䄀䌀㘀　㈀　䄀㜀㜀㤀㤀䐀㈀㐀㄀㤀㠀㤀䈀㈀㠀䄀䔀㠀䈀㤀㐀　䔀䘀㜀䄀㌀䘀䄀㠀㠀䐀㈀䘀㄀䔀㜀㐀䄀䐀㌀䔀㔀㐀䄀㌀㜀㘀㄀㌀㠀㠀䐀㄀㤀䄀㤀㐀㠀㤀㐀㜀㜀㐀䘀㔀㔀㄀䔀㔀　䐀㠀䄀㄀㌀㐀㔀䌀䄀㤀䘀㐀㤀　　㘀㔀㠀䄀䐀㔀䐀㤀㔀㔀䘀㌀㜀㜀㠀㐀㐀䌀㄀　㜀㌀䈀䐀㈀㘀㐀䔀　䔀㜀㜀㐀㜀㌀䌀䌀　㌀䌀䄀㐀㌀䐀㠀㠀㠀䐀㜀䔀䈀㌀䐀㠀㐀䘀㄀　㄀㔀㘀䘀㤀㈀䈀㜀㘀㈀䘀㘀䌀㈀㜀㈀㠀㠀䘀㠀䘀䄀㠀㤀䌀㠀䘀䈀　㘀䄀䈀㘀䈀㘀䄀䐀䔀㈀䈀䈀䌀㄀㌀㈀㌀㈀㈀㘀　㤀䘀䐀㈀㈀㘀　䔀㠀㔀㠀㔀　㤀　㐀䔀㄀㄀㘀㈀㤀㄀㐀䈀㠀㜀㜀　㌀䄀㠀䘀䌀㘀　䘀䄀㔀㠀㜀䈀㘀㄀䘀䈀㘀㠀㄀　䔀㠀㤀䄀䘀㔀䐀㌀䄀㄀㠀㄀䐀䌀㘀㠀䐀㄀㈀　㄀㈀䌀　䘀㌀㌀㄀䔀㄀㠀㈀　䄀㘀䘀㌀㜀䈀㔀㤀䄀䈀㐀䘀䐀䈀䘀䐀䘀㐀㤀䐀㠀㜀㄀㄀　䐀䔀㠀䔀㠀㤀　㌀䔀䔀䈀㄀㤀䈀㄀㔀㈀㤀㌀䌀䘀䈀㜀㜀㄀䌀㤀㌀㐀㐀䐀㜀䘀䘀㄀䈀㠀䌀㘀䔀䌀　㄀㄀䄀㌀㄀䐀㈀㤀㠀㤀㄀㠀䄀㜀䌀䄀㌀䐀㈀　㔀䌀㌀䌀㄀㘀䌀　㄀㈀㄀䘀㔀㈀䌀䘀䐀䈀䘀㠀㤀㔀㔀㠀䔀䌀䄀䄀㤀　㜀㌀㜀䌀　　㌀㤀㄀䐀㈀㐀䐀　䐀䘀䌀䔀䄀䘀㈀䔀　㘀㔀㜀㠀䄀䈀䔀㈀䔀㘀㜀㠀㔀㠀㤀䌀㄀䔀䈀㤀䈀䘀㘀㈀䌀䄀㘀䔀㔀䘀㤀㔀㈀㤀㐀䄀䌀㘀㌀㜀㈀㠀㄀䐀　㠀䈀䄀㈀䐀㤀㔀䘀㘀䌀䐀㈀䌀㈀㌀㘀㌀㤀㈀䐀㄀㈀䘀　㈀䌀㘀㐀㄀㐀㜀㘀㈀䈀㘀㐀　㐀㜀䄀　㐀㌀䈀㠀㤀㔀㌀㔀䈀㌀　䈀䄀㜀䘀㐀䄀　㠀㔀䐀䐀䐀㜀㈀䔀㤀䐀㠀㔀㘀㌀㐀䔀䐀䐀㈀㠀㤀㄀㤀㄀䐀䄀䘀䐀䌀䈀䈀㈀㐀䔀㘀㜀䈀㐀㐀䘀㜀䐀䐀䄀㜀㈀䐀䐀㄀䐀䌀㈀㔀㠀㘀䐀㄀㔀㄀䐀䌀䄀㜀䈀㌀　㌀䄀㈀䘀䐀㌀䈀㌀㔀䘀㠀㔀䘀　㠀㠀　㜀　㄀㠀　䔀　㐀㈀䌀㠀䈀㤀䌀䘀㔀㔀　㐀㔀　䄀㐀㌀㄀㈀㌀㄀㔀　㤀㔀㔀㠀䈀㠀　㜀㤀㔀　䘀㄀㐀　㔀䈀㈀㈀䘀䌀䄀　㄀䔀䄀㄀㠀䄀㄀㄀㐀䔀　㠀㔀㔀㠀㐀㠀㈀　䈀䈀㄀㤀㔀䐀㘀䐀䔀䌀　䄀䘀㈀䔀　䘀䈀　㔀㠀　㠀䈀䔀䄀㌀㄀㐀㔀㘀䘀㐀㘀㤀䌀䌀䘀䘀㜀㌀㤀㐀㜀㘀䘀㘀㜀㤀䔀䌀䄀㜀㜀㠀㜀䘀䄀䐀䘀㈀㜀㄀㤀䘀䈀㌀㔀䌀㈀䔀㠀䌀㤀䈀䔀䌀㘀㜀㌀㈀㌀㈀䌀㘀㠀㐀㜀䔀㄀㄀㌀　䔀䌀　㤀䘀㠀㤀㜀䔀㐀䐀䔀䈀㜀䐀䈀䈀䌀㄀䘀䘀䐀䈀㔀㐀㘀䐀䄀㠀䔀㤀㤀䌀㜀㐀㜀㌀䈀䌀㐀䔀㔀㜀㐀㔀䘀䈀䈀䘀　䔀䈀䌀䌀　㔀㔀㠀㠀㈀䌀䌀䐀㘀䔀䘀㌀䄀㤀䘀䄀䈀㤀㄀䌀㘀㘀䌀㐀㜀㐀㔀㌀㘀㘀㄀㐀㄀䌀㌀䘀䐀㌀䄀　㌀䈀䘀䈀䄀㌀䌀㌀　㄀䈀㐀㄀㌀　䌀　㐀䔀㌀㔀䔀㤀㜀㜀㔀㈀㌀䄀䈀㠀㤀䐀䘀䘀䔀㈀㠀䌀㠀䌀　㤀䄀㌀㔀䘀　㐀䌀䌀㈀　䔀　䌀䔀䘀　䈀䈀㄀䘀㜀䐀䄀䔀㠀䔀㔀㠀䈀㤀㐀㐀㤀䄀　䌀䔀㔀㜀㄀㐀㘀䌀㘀䄀㐀㈀　　䈀㤀㠀䘀㄀䄀㄀䐀䘀㠀㐀　䈀䘀　㘀㔀㐀䔀㐀㘀㐀㘀䐀䘀㈀　　䈀㤀㠀㠀䌀㠀䌀㠀䌀㤀䔀㈀㄀　䈀㤀㠀㠀䌀㠀䌀㠀䌀㤀䔀㈀㄀　䈀㤀㠀㠀䌀㠀䌀㠀䌀㤀䔀䄀㄀㔀䘀　㐀　䌀㤀㘀䈀䘀㔀　䄀䔀䔀䌀　䈀㠀㄀㈀㄀㜀㄀㌀㜀㤀㌀㜀㔀㤀㘀䄀㈀䐀　䄀䘀䔀䌀㈀㤀㜀㄀㠀㌀䈀㘀㜀㘀　䔀㠀　㄀䌀㘀䌀䈀㘀㠀㌀㠀䔀㄀䐀䄀䈀㌀㌀䄀㐀㠀㠀㜀㘀㐀㜀㐀䔀㌀㐀㠀㔀　䘀㄀䐀㠀䌀䔀㄀䔀㐀㐀䘀䘀㔀㌀䐀㜀䈀㔀䐀䈀䄀㌀䐀㔀䔀㘀㐀䘀䈀㌀㄀䈀䔀䐀䘀㈀䔀㠀䐀䔀㤀㐀䔀䔀㤀䐀䐀㤀㔀䈀㘀䄀䐀䄀䐀䈀䈀㄀䐀䈀䐀㘀㌀㜀㄀䐀㐀䐀㐀㤀㐀　㘀㔀㠀㌀㠀㘀㠀㜀㈀䘀㘀䔀㔀䄀㐀㜀㔀㤀䈀䔀䔀㜀　䔀䔀㘀㘀㠀㜀䘀㈀㔀㠀㌀　㜀　㠀䔀㤀䄀㠀㘀　㔀䘀䐀㈀㈀㘀　䄀　䄀㤀䘀㄀㤀䐀䌀㄀㈀㘀㌀㔀䘀㘀㜀㐀㈀䌀䈀　䈀㈀䐀㌀䈀㈀㐀䐀㄀䘀䌀䈀㘀㔀㌀䘀㜀㈀　㌀　㌀㐀㐀　㐀　䄀　䐀䘀㐀䌀䐀㔀㘀䔀䔀䐀㠀㜀㔀　㜀㐀　㔀䈀㠀㜀㜀䈀䔀䌀㔀㔀㘀㄀㈀䘀　㤀㄀䐀㤀㐀　䔀䈀㐀㤀㜀䔀㈀䄀㄀㤀㄀䈀㌀䄀䘀㠀㘀㄀䐀䈀㘀㘀䌀䔀　㘀㌀䐀䘀　䄀㐀㜀㠀䈀䐀㈀䄀㠀㌀㄀䘀䘀㠀㜀䔀䄀䌀㔀㐀㔀　㈀㄀䈀䔀㄀㄀　㜀㐀㘀䌀䄀㤀䘀㜀㔀䐀䌀㈀㌀㐀㔀㈀㠀䔀㈀䔀䐀㤀㔀㜀䌀䘀　䔀㔀㐀䈀㠀䔀䔀㘀䔀　㄀㤀㘀㠀㤀䈀䐀㌀䄀䔀䔀㄀䌀㠀䄀　䔀䘀㌀䄀㠀䐀㈀㐀䔀㌀㤀䌀䘀䐀㘀䘀䈀㜀㐀㈀㘀㘀㠀䘀　㘀㜀㈀㠀㠀䐀䔀䌀㜀䈀㠀㤀䌀㜀㔀䘀䈀㠀㈀㌀㈀㐀㌀䄀䌀㌀㜀䌀㈀䈀㌀㜀䐀㠀䘀䐀㔀䌀䔀䘀䌀㜀䘀㐀㔀䐀䄀㈀䈀㈀㈀　㜀䔀䘀㘀　䐀䈀㄀䘀㌀䐀㠀㠀䘀䌀㔀㠀㠀㠀䔀䈀㔀㐀㠀㈀㜀䌀㈀　䘀䄀㄀㜀䐀䈀㠀䘀㈀䔀䄀䘀㔀㜀䔀䄀䘀㔀㔀㐀㜀㘀䄀䔀　㌀　㘀䄀㔀㜀䄀䈀㜀㘀㈀䐀㈀㌀㠀　䐀䌀　㤀㄀㘀㄀䈀　䔀㤀㜀䔀䈀㈀㈀㌀䐀䌀䘀䐀㌀䈀㜀㠀䘀䄀㠀㔀䌀䘀䌀㘀　㜀㤀䔀㈀䈀㠀㐀䔀㘀㔀㜀䈀䈀㐀䌀䄀䌀㐀㜀㜀㌀㠀㔀䘀䄀㄀䈀䌀㤀㌀㠀㜀䔀㌀䄀䐀䐀㤀䘀㄀㄀㜀㜀㤀㜀䘀㠀䔀䌀㈀䔀㔀䐀㤀㌀㘀㈀䄀㤀䘀䌀䐀䄀䌀䘀㈀䐀㄀㐀㈀㤀㤀㘀㄀　䈀㠀㘀䔀　䄀㌀㜀䐀㜀㐀㜀㌀　㐀䌀䌀㈀㌀䘀䄀　㘀䌀㄀㤀䐀㜀㜀㈀䌀䄀䘀㈀㌀䘀㐀㠀䈀㠀　㐀㤀䌀㄀䄀㘀㌀　㌀䄀㄀㔀　䐀㤀䌀　㘀㐀㤀㘀㌀䘀㘀㈀㌀㌀㜀䐀㠀䐀䌀㐀㘀䄀㌀㠀䘀　䔀㤀䄀㜀　　　䔀㐀　䐀㤀㘀㜀䈀㌀㠀䄀䄀䄀㈀㄀㌀㌀㈀㜀㈀䐀㌀㐀㠀䔀䘀䐀㈀㘀䘀䐀䘀　㔀䌀䈀　䔀㔀㜀䘀㘀䌀䘀䔀　㘀䌀䌀䄀　䘀㠀㜀㜀㜀㈀㜀㔀㄀䈀䔀䔀㌀㤀㜀㐀䐀㘀㠀　㠀㈀䐀䐀䘀㈀㔀㐀䌀㈀㜀㐀㘀㜀　䈀　䌀㤀　䐀㘀㜀㔀㐀　㠀㌀㄀㘀㘀㈀䌀㜀㐀䄀䔀㘀㜀㠀㔀㜀㜀䔀㠀㈀㐀㜀㐀䈀㘀㔀㔀䘀䄀㜀䈀䈀㜀䘀㈀㐀㐀㈀㜀䄀　㘀㌀䔀㄀㤀　䔀㤀㜀　㠀㔀䌀䐀㌀㜀　䘀㔀㠀䔀㔀䐀䌀㠀䄀䐀㄀䐀䘀㄀䐀㈀㄀䔀䐀䄀䔀䔀㜀㘀䌀㤀㐀䐀䈀䈀㤀㈀㘀㜀䐀㐀䈀㄀㔀䌀㜀㠀㄀㠀䄀䔀㌀㄀㌀㈀䄀　㌀䈀䔀㜀㄀䌀㜀㔀䄀䘀䈀䔀䈀㜀䐀㐀䌀㄀䔀㠀䔀㔀㐀㔀䔀㄀䔀㔀　㤀䄀㄀㄀㌀䄀㐀䘀䈀㄀䔀䄀㐀㠀　䐀䌀䄀䔀䈀㄀　䄀䈀䘀㘀䘀㘀㐀㐀㈀㜀㘀　㤀㐀䐀㜀䔀䘀㄀㐀䐀䘀䌀㄀䌀䄀㈀㌀䌀㈀㄀㄀䈀㌀㠀䌀䔀㠀㐀㠀䔀䈀㔀㘀䐀㔀㄀㜀㜀㔀䈀㐀㠀㤀䈀㔀䔀䔀㜀　㜀㘀㌀㌀　㤀㠀㐀㄀㔀䈀䔀㘀䘀㄀　䄀　䄀㤀䔀㌀䄀䘀　䐀㜀㐀㠀䘀㤀㤀㈀㠀㠀㈀㜀㘀㤀䔀㤀㔀䌀㜀䈀㄀㘀㈀　㈀䈀㄀㐀㈀䔀㔀㠀㈀䈀㤀䌀㜀　㄀㐀䄀䄀㌀　䈀㤀䘀㘀䔀㠀䔀㠀　㐀㄀㌀　䔀䐀㘀㘀䐀㔀㌀㄀㈀䌀㄀㤀䔀䈀　　䘀䐀㈀䄀㘀　㜀䌀㐀㜀㈀䘀　䐀䐀㌀㠀䘀䔀㐀㠀㠀䐀㘀䌀䈀㌀䔀㔀䈀㠀㠀　䔀㠀　㜀㠀䔀䔀㐀㜀㘀㘀䐀　　㄀㤀㠀㈀䐀䐀　䔀㠀　䔀䐀㐀㔀䘀㄀䄀㔀㘀䐀䌀　㔀䔀䈀㐀㜀㔀䈀䈀　㔀㤀㠀䐀㤀㤀㐀䐀䈀䄀䔀㌀㤀㜀㄀㄀㤀䐀㘀䐀䘀㠀䈀䔀㐀䈀㜀㠀䈀㘀䐀䔀㘀㌀䐀䄀䌀䔀㈀䌀　㄀㤀䈀㈀㌀㜀䌀䌀㈀䔀䌀䄀䄀㌀㐀䘀㠀㐀䔀㔀㤀㄀䄀䘀㌀㈀㌀㜀䄀䐀䘀䈀䐀䄀䄀㤀㤀䌀㈀㘀㘀㄀㘀㠀㘀䈀㤀　㌀䈀㌀㤀　㘀䐀䘀㔀䐀䔀䔀㔀㐀䄀　䈀　㈀䔀䈀㌀㄀䄀䈀㄀䌀㈀㄀㤀㄀䌀㜀㤀㔀䘀䄀㜀㘀㤀䈀㤀䄀䘀㐀䘀㤀　䔀㔀䘀䌀䄀㘀㤀㠀㔀㔀㔀䌀㜀㘀㈀㐀㐀䌀㜀㔀䄀㠀䈀㄀㐀㠀䘀㄀䘀䈀㔀䔀㈀䈀䈀㤀㈀㄀㄀䈀㠀䘀㌀㐀㈀㌀㤀䈀䘀䌀䈀㈀䄀㤀㜀䄀　䔀䔀䌀㠀㈀㠀㌀䄀䌀㄀㠀䄀㄀㘀䐀㐀㠀㐀䔀㤀　䔀䄀䈀㐀㠀㐀㜀㜀㐀䄀㐀䔀㔀㠀䔀㤀䄀㜀㘀㔀㈀㌀䔀䔀㈀　䔀㘀㜀　㘀㠀㄀䄀䐀㤀㐀䐀㘀㄀䈀㤀㔀䘀㘀䐀㐀䘀㄀㄀㜀䐀䘀㠀䘀㔀㠀㌀㤀䈀　㘀䌀䄀䈀䐀䘀㘀䘀䐀　䐀䘀䌀䐀㤀㐀㐀䔀㠀㐀㈀㌀㜀㔀䔀䈀㔀䔀䐀䐀䈀䄀㌀䐀　㈀㘀㘀䈀䘀㤀　㐀㘀㠀㐀䐀㠀㌀㐀䌀㔀㤀䘀䐀㄀㐀㌀䘀㐀㤀㌀㠀　䄀㄀㜀㌀䈀㠀㤀㌀㄀䔀㜀㜀䘀　㔀㐀䈀㜀䄀㌀䘀㘀㠀䈀䘀䄀㜀䈀㘀㤀㠀㜀䘀　㤀䄀㤀䔀䘀䈀䐀㈀㠀㜀䌀㘀䌀䔀䈀㐀㤀䄀㐀䔀䌀䔀㐀㠀䘀㜀㠀㄀㤀䄀㜀㜀䌀䘀　䈀䈀䘀䔀㤀㔀　㌀㠀㠀㔀㠀䄀䌀䔀䄀㠀䐀㈀㤀䐀䈀㌀䔀䐀㄀䌀㈀㜀䄀㄀㐀䈀䘀㠀㐀㈀㜀㈀䄀䘀䌀䔀䈀㤀㔀㔀㈀㜀㐀㜀㐀㠀㠀䔀㠀䈀㘀䌀㘀䌀䈀㠀䌀㈀䌀㘀㠀䔀㌀䄀㈀㜀㔀㠀㄀㜀䐀㠀䔀㠀䄀㌀㐀㈀㔀㈀䌀㐀䐀䐀䐀㔀㤀䐀㄀䌀㌀㔀䄀㔀㔀㠀㘀㠀㘀㌀㌀䘀䘀䘀㘀㜀㈀䌀㐀㜀䌀　㘀㐀䄀䌀㐀㌀䘀㐀㤀㌀㠀　㔀㤀㤀㜀㄀㠀䄀䘀䔀㌀䄀㐀䔀㠀㠀䌀㘀䄀䄀䐀㐀䐀㜀䌀䔀㜀䔀䌀䈀䄀㌀䔀䘀䔀㈀㈀㈀㌀㘀㌀㤀䐀㘀㈀䄀䄀　䄀㤀㠀㠀㤀㌀㠀㐀䔀㠀䄀䘀㘀㐀㜀㤀㌀䈀㄀㜀㌀㜀㘀㈀　㤀䌀㌀㜀㘀㜀㘀㐀㠀䌀　㜀㔀㌀㔀㔀䌀　㘀㐀㘀㐀㘀㐀䄀䌀　㌀㘀㐀　㄀㤀㌀㤀㄀㤀㄀䐀㄀㌀㌀㘀㐀　㄀㤀㌀㤀㄀㤀㄀䐀㄀㌀㌀　䌀䈀㈀㠀　㘀㄀䈀䘀　㌀䘀䈀㄀䔀䌀䔀䄀㠀㜀㤀　㘀㌀䈀䘀㌀䐀㜀㔀㘀䐀㈀㤀㄀㈀㠀㔀　䘀㄀㌀㔀㔀㌀䔀㜀㔀䈀㄀㜀㈀䄀㤀㐀㈀㌀㔀㈀䈀䘀㘀　䔀㌀　㜀㜀㄀㤀䐀㘀䌀䔀㔀㄀䔀㤀㤀䌀䈀㘀䌀䘀㈀䌀㄀䘀䔀㄀　㘀㠀䔀㌀䐀㐀㜀䘀　䐀㄀䈀䘀䄀㌀㠀㜀㄀䘀㈀㐀㜀㜀䄀䌀䔀㄀䔀　䘀䄀㠀䔀　㘀䈀䄀䐀㌀㌀㤀䄀㜀㘀䈀㘀㐀㈀䌀㌀䌀䘀䈀㜀㜀㈀㜀䈀䌀　㈀　㄀䘀㠀䈀㄀䄀㠀䘀䈀䔀㘀㔀㤀䈀　㄀㤀䈀䘀䔀㈀䔀䈀㄀䔀䄀䐀䌀㈀㐀㐀㜀㌀㜀㐀㜀　䄀䌀䘀㄀䈀㘀㌀䈀䄀㈀㘀䌀㌀䔀㜀䘀㄀㘀㐀㤀㜀䔀䐀㜀䄀䌀㌀䄀　　䄀㄀㠀㌀㘀㠀㜀䈀㄀㠀䈀㜀㔀䄀㜀㠀㘀䔀㜀㌀㐀　㠀㜀㘀㘀䌀㘀㈀㐀䔀䌀　㌀䔀㄀㠀㜀㘀䌀㄀㔀㈀㘀㄀䔀䌀㄀　㠀㔀䐀䔀㘀㔀㘀䘀　䐀㐀䄀㔀䔀㄀䄀㄀㠀㄀䈀䘀㄀㐀䔀䐀㄀㌀㌀䘀㘀䄀㤀䐀　䌀㤀䐀㠀㐀㌀㐀㄀　㜀㘀㘀㈀䘀　㤀㌀㐀㌀㐀㤀䈀䈀䈀䐀㠀㐀䌀　㘀㘀䈀　㐀䌀䐀㐀䐀䔀㌀㘀㔀䄀㜀㈀䈀䈀䈀㠀䔀㔀䘀䄀䐀䈀㠀䐀䌀䄀㄀㌀㘀䈀䈀㠀㤀䔀㜀㈀䈀㘀䔀䘀㘀䌀㠀䈀　䐀㤀㠀䔀䌀㘀　㤀䔀䈀䌀㐀䔀㘀㈀䘀䘀㘀㠀　㈀　　㠀㐀䔀䈀㘀㜀㈀㐀㜀㈀㤀㠀䐀䘀㄀㌀㄀䈀䐀㜀㌀㠀䐀䐀㈀㌀䈀㘀㈀䔀㔀㈀㘀㌀㘀䌀㈀㘀㐀䄀䘀㐀㘀㤀䐀㌀䈀㐀䈀㌀㘀㄀㌀㘀䔀䄀䄀䔀䘀㄀䘀㔀　㄀䄀䈀䌀㄀㌀㠀䌀䘀㜀㔀㠀䐀㐀㈀䈀㤀㐀䘀䘀㐀䐀䄀䌀䈀䈀㘀㌀㔀㄀㔀㜀㈀䄀䔀䌀㌀䐀㤀㐀䘀㘀㔀䐀䄀䐀䘀㔀㔀㠀㔀㐀䈀䔀㐀㄀䘀　䈀㄀　㜀䌀㜀㠀䘀㜀䐀䌀㔀㐀䈀㈀　㜀㔀䐀㜀䌀䐀䈀㄀䄀㠀䄀㐀䌀㤀㜀㜀㔀㠀䈀㌀㈀㔀㠀　㜀䐀㌀㤀　㠀䘀㈀㜀㤀㌀㘀䐀䄀　䘀䘀㌀㄀䄀䔀㔀㤀䘀㌀䐀㐀䔀㜀䈀㈀䈀䌀䐀䘀䈀䔀䄀㌀䈀䘀㘀䘀㘀䈀　䌀㤀㤀㄀䈀䐀㐀㐀㄀䌀㤀㌀㌀䈀㔀㜀䔀㔀㔀㌀䈀㜀䘀㌀㌀㤀䐀䐀㔀㤀㜀䌀㠀䌀䔀㈀㔀㠀䄀䔀䘀㐀㐀　䌀㄀䈀㌀䈀䘀䔀㜀㈀䐀㈀䄀䈀䈀㠀䐀㔀㔀　㘀䐀㜀㈀䈀䐀䐀㄀䈀㈀㤀㜀䔀䘀㜀㜀㤀䈀䌀㐀㈀䘀㔀㌀㌀㐀䐀㘀㤀㤀䔀䄀䐀㜀㈀䐀䌀䌀㜀㐀㘀䘀䈀㔀䄀䈀䔀㐀䘀㘀㔀䈀㈀㐀䘀㠀㠀㜀䘀䄀　㌀㄀䄀㠀　㈀㠀㘀㠀㘀㐀䄀䌀㌀㜀䘀㐀㤀㤀䈀㜀㜀䄀㠀䔀㠀㄀㜀㔀㠀䐀㤀㔀㤀㜀　㄀　䌀㔀㈀㄀㘀䐀㘀䌀㔀䔀㘀㌀䄀㐀䄀㐀㈀㄀䐀㌀䔀㠀㄀㄀㄀䔀䘀㌀䄀䐀䄀䌀㔀䌀㤀䔀䈀㄀㔀㄀㠀䔀㠀㘀㜀　䄀㈀䘀䔀㈀㈀　㠀䐀㠀䈀䘀㠀㈀㐀　䄀㈀㈀㄀䐀　䘀㤀䔀㤀䘀㐀㘀䌀㠀㜀䄀㜀㤀㄀䈀㈀㠀䈀㤀㠀㄀㤀㠀㐀䔀䘀㈀䌀䔀㔀㄀䈀㜀㜀　䌀䘀䔀㔀㐀䌀㔀䌀㄀㄀㤀䐀㌀䄀䘀䐀㘀㌀䐀㜀䔀䈀䘀㔀㈀㘀㄀㔀䐀䄀㐀㜀㐀䈀　㜀㄀　䘀㐀㄀㐀㤀㈀㜀㘀　㔀㌀㄀㤀㜀䈀㜀㈀㈀䔀㐀㤀䔀㈀䄀䈀䌀㌀㤀㄀㐀䄀　㌀㤀䐀㌀䄀䔀䔀䐀㜀㠀㤀䈀䈀㠀㄀䌀㜀㜀䄀㈀䌀䔀䄀㌀䔀　䄀䄀㌀䐀䈀㘀㌀㔀㄀㄀㄀㘀㐀　㠀㄀㜀㠀㐀䌀㄀㜀䈀䄀䌀㜀㐀㄀㜀䘀䄀　㌀㘀䈀㌀䐀㄀㘀㜀㔀㘀㌀㘀䈀㌀䐀䘀㘀䘀㔀㐀㐀㤀㔀㐀㔀㌀㜀䌀㜀䄀㈀䌀㘀㘀㌀㜀㠀㠀㤀䐀㌀㌀㜀　㠀䌀㘀㄀䐀䐀㘀㘀㘀㤀㔀䐀䘀㘀㐀䘀䔀㔀䘀䄀㘀䈀㠀䌀㠀㌀㜀　㌀䌀　　䈀㄀㐀㈀䘀㠀㈀㠀䔀㄀㌀㌀㤀　䘀㔀㔀䘀䌀㤀㐀㐀䘀䈀䄀䘀㌀䈀㤀䔀䔀㐀㠀䔀㄀㄀㄀㤀㔀䌀䈀㤀䐀㈀䄀㈀㌀䔀䄀䔀㐀　䔀䄀䈀㠀㐀䘀㌀㘀㄀㈀䄀㈀㜀䔀㈀㜀㠀䄀㈀䈀䔀䔀㄀㤀㤀䘀䈀㌀䌀㈀㘀䈀䌀㈀䐀㜀㔀㈀㄀㘀䌀㈀䔀䈀㈀䌀䄀䐀䔀㈀䄀䘀㔀䈀㔀㜀䌀䄀㠀䘀㈀㜀㈀㐀㘀㠀㠀㜀䘀䄀　㌀㄀䄀㠀　㈀㈀㘀㠀㈀㐀䄀䄀㐀䘀㌀䄀㐀㜀䔀㘀㐀䄀㤀䈀㐀㜀䘀䈀㌀㜀㈀䐀㐀㘀㌀䐀㜀㈀䘀㠀䐀㠀䈀㠀䔀䌀㜀㘀㘀㌀㠀㜀㘀䘀　㌀㈀䌀䄀㌀　䌀䄀㈀㈀㌀䌀㤀㠀㔀㔀䔀䌀䄀㔀㘀㜀　㠀㈀䘀㌀䄀　䐀㤀㔀㜀䘀㤀㔀䘀䔀㌀䘀㐀㐀䐀䘀㠀　　䐀䘀㐀㠀䐀㄀䘀㈀㤀䌀䄀䔀㠀㠀㤀䄀　㘀　㌀䄀㐀䔀㈀㌀㤀䈀㘀䘀㘀㔀䌀㜀㐀　䌀　㈀㄀䐀䌀䐀䔀㘀䄀㘀㔀䔀㌀㤀䘀䄀䔀䐀䘀㌀㐀䐀㈀㘀㔀　䄀㠀㜀㌀㐀㌀㄀䔀㌀䄀㄀䌀㄀㜀䐀䐀㈀䌀䄀䄀䐀䘀䈀　㠀㤀㜀䘀䐀㤀㌀䘀㠀䔀㠀㐀䌀㜀䘀㘀㤀䄀㔀㌀㤀　　䄀　䈀㄀䐀㈀㜀㄀䘀䘀䐀㘀䌀䄀䌀䔀䌀䌀䘀㘀㜀䐀㌀㜀　䄀㤀䌀䌀㠀䈀㄀䄀㠀䈀䘀㔀㔀㔀䔀䈀䄀㌀䐀㄀㘀㤀㔀䔀㔀㈀㜀䌀㈀䔀㤀　䐀䌀䄀䌀䈀㌀䔀㈀䄀㔀㜀㌀䘀㄀㘀㄀㔀㈀㄀䔀㌀㐀㜀䔀㄀䄀䔀　䔀䔀㄀㜀㤀䄀㜀䔀䄀㜀㐀㈀䌀㈀䄀㘀㤀䘀㄀㄀䐀䌀䌀㄀䈀䔀㤀䐀㤀䐀㔀㈀䄀䔀㌀㌀䄀㌀䘀䌀䌀㜀㜀㠀㔀㜀㠀䄀㤀㠀㌀㤀㌀䄀䐀䐀䄀㈀䐀䘀䌀㜀䈀䐀㔀䌀㜀㈀㈀㠀㔀㔀䐀䈀㜀䘀㌀䈀㤀䔀䔀㐀㠀䔀㄀䌀㜀㔀㔀䘀䔀䔀䔀䈀䘀䐀㤀㌀㜀㔀㌀䘀㈀䘀䈀䐀㘀䘀　㄀䔀䔀㄀䈀㈀㘀䌀㔀䘀䄀㄀㜀㠀㐀㘀䄀䌀㄀㐀㄀㠀㤀㐀䐀㜀㄀㈀䄀㔀㤀䐀䌀㄀䔀　㄀㘀䈀䐀㔀䘀䔀㜀㘀䈀㤀㤀䘀㈀㤀㠀㤀㄀䌀㐀㌀䘀䐀　㄀㠀㘀㐀　㄀㐀㌀䌀㌀䘀䐀䈀䌀㜀䔀䄀㜀䌀㈀㠀㔀䌀䄀㜀䄀䄀㜀㜀䔀㤀䘀䄀䘀䈀䘀㔀㐀㈀㐀㤀䐀㌀㈀䈀㔀　㘀㜀䔀㜀㌀䌀䐀䈀㌀䐀㐀　䘀㈀䔀㌀䄀㤀䄀䐀㌀䄀䌀㜀䔀㐀䐀㐀䐀䌀㌀㔀䘀㄀㤀䘀䔀㜀䘀㤀㌀䌀㈀㈀㌀　䐀㄀䘀䈀㜀㜀㈀䄀㐀㘀㐀㔀䄀䘀䘀㌀㄀㈀䈀㘀䐀㜀䔀㈀䔀䈀㜀䐀㘀㠀㌀䌀㌀㄀㘀䔀䄀㈀䘀　䐀䘀　㐀㔀㈀㄀䄀䐀㐀䐀䘀㄀　㄀㄀䄀䔀䌀䈀䘀䔀䄀䘀㜀㜀㜀㘀䐀䘀㐀㜀㄀䄀㈀㄀㌀㌀㤀㄀㘀䈀㔀㘀䔀㌀㜀㜀㈀䈀㜀䌀㜀䄀㈀㠀䔀㄀㜀䔀䐀㠀䔀㐀㔀䄀䐀䐀䈀㘀㄀㄀䐀㜀㜀䔀䔀䄀㘀㜀䔀㤀㠀䐀㌀㘀㌀㜀䌀䈀㄀䈀㄀㘀㈀䈀㤀㐀㜀䐀㤀㠀䘀䔀㜀㄀䌀䔀㜀䘀㌀䄀䐀㘀䄀㐀㌀㄀㄀䈀䔀䐀䈀㜀䌀㐀㄀䈀㠀㤀㜀䔀䔀㌀䌀㘀䘀䔀㜀䘀㌀䈀㠀㤀䐀䄀䘀䔀㔀䄀㄀䌀㄀㈀　　䈀㤀㠀䈀㄀㠀㈀㄀㄀䘀㤀㤀㄀㜀㄀㌀䌀䘀㌀䔀㜀㐀䐀㤀䐀㜀䐀㘀㔀䘀㈀㜀䘀㜀㐀䄀㜀䘀㤀㌀䔀㈀䈀㐀㜀䌀　㌀㔀䌀㤀䔀䘀䄀㘀䘀㜀䈀䈀㠀㤀㈀䘀㘀㌀㘀䌀㘀　㤀㘀㠀㔀㐀　䔀䌀䔀䈀㐀㌀䔀㈀㠀㜀㄀㔀㔀㌀㐀㤀䌀　㠀䌀㄀㜀䐀㄀䄀㜀㐀䈀䐀䄀㐀㠀䐀㄀㐀㄀䄀　䐀㐀䘀䌀㔀㘀䈀㠀䐀㜀䔀㐀䌀䈀㘀㐀䌀㔀㌀㠀䔀㌀㄀䘀　䘀䈀䈀䔀㈀䄀㜀㔀䄀䈀㈀㠀㐀㜀　㌀㘀䄀㔀䄀䔀㠀㌀㠀䐀䌀㔀䌀䘀㠀䈀䄀㌀㄀䈀䘀䘀㌀䈀㤀㌀㠀㄀㔀㠀㠀䔀㈀䌀㔀䘀䔀䄀㜀䌀䔀㌀㜀㐀㤀㌀㜀䔀㤀㘀㔀㈀　㠀㘀䈀䐀㈀㐀䐀㜀䈀㘀㜀㄀㤀䐀㠀㜀㐀䐀䄀㘀㜀㠀䄀䈀㄀䘀䄀䔀㐀䄀㤀㌀䈀㠀㔀䈀㐀㄀䈀㜀㐀㜀䈀㠀䄀䔀㠀䌀　䈀㄀㐀䈀䌀㌀㈀䄀㘀　㘀㠀㤀䌀㈀㠀䘀㜀㘀　㜀　䐀䌀㄀䘀㠀䌀㤀䘀䌀㐀䘀㠀㘀㐀䘀䐀㄀䔀䈀㄀㔀㈀㄀㜀䌀　䘀㐀㄀䘀㈀㔀㈀䐀㐀䈀㄀䐀㄀䄀　㜀㐀䄀㌀㠀㜀㐀㌀䄀䄀䌀䘀䈀䔀㤀䐀䌀㌀㐀㐀㠀㤀㐀㤀㔀㘀㤀㔀㤀㘀䐀䄀㈀䘀　䘀㤀䌀䔀䐀䐀㈀䔀䘀㐀䌀䄀㤀㜀　㤀䄀㌀㌀　䌀䈀㄀䔀㜀㐀㈀㄀㐀㜀㠀㐀㘀䘀䄀䔀䐀㐀䘀㌀㈀㔀㐀㤀㜀䄀䌀㠀䔀䘀㘀㤀䌀䄀䘀䈀㈀㄀　䄀䐀㜀㌀䈀㈀䄀㌀䄀㄀㈀㤀㠀㄀㐀䄀㘀䔀㌀䈀㠀㠀䐀㐀　㠀㜀䌀㔀㄀㤀㐀䘀䐀㌀㤀㔀㜀㜀䔀㈀㐀㔀㠀㤀䈀㤀㜀䐀㠀㠀䔀㜀㘀㈀䄀㔀㤀㜀㜀㜀㄀䘀㔀㐀㔀䔀䘀㜀䈀㈀䌀䄀䌀䐀　㔀䔀䘀䄀㌀䈀㜀㠀㤀㠀䌀　䘀㐀䄀㐀䔀㔀㜀㘀㘀㄀䘀䄀㜀䐀䘀㈀㠀㤀㤀䐀㄀　㤀䄀㄀㠀　㘀㔀䔀㤀䌀㈀㤀㈀　㈀㜀䐀　㤀㜀䄀㤀㔀䐀䐀㜀㐀㠀䘀䘀䌀㔀䘀䄀㜀㌀䄀䘀㄀㔀㌀㈀䈀㘀㜀䄀䈀㌀䔀䌀㤀　㜀　䌀䌀䌀䐀㌀䘀㔀㄀䔀㜀㄀䄀䐀　䄀㘀㔀㜀䔀㠀䈀䌀䄀䘀㤀㤀䌀㔀　㤀㘀㌀　㠀㌀䔀㠀㘀㘀䘀㘀㔀　㜀䔀㄀䘀㔀㌀䘀䔀㤀䐀㘀㤀䈀䈀㔀䐀㜀㤀㐀䐀㐀䘀䌀䔀㌀䌀㌀䐀㠀㤀䘀㜀㌀㈀㤀㔀㠀㄀䈀㌀㔀㜀䔀㠀㜀䔀㐀䔀㐀㤀䔀㈀㐀㈀䄀　䐀䘀䄀䄀㜀㠀㘀㘀䄀㤀䈀䔀㤀䘀㘀㈀䐀㔀㘀㤀㤀䈀㠀㜀䔀㤀䐀䔀㘀䄀䐀㔀　㌀䈀䘀䐀㄀䐀䈀㐀㐀㠀㘀㈀䔀䈀㘀䐀䈀㌀䐀㔀㔀㌀䔀㤀㜀㈀㤀㈀䐀㤀㄀䐀䐀㄀䄀　㠀　䌀䄀䈀㠀　㜀㄀䐀　㘀㤀䄀㠀㄀㐀㌀䄀䄀䄀㤀䘀䌀㐀䈀㠀㔀㘀䈀䘀㜀㄀㄀䔀㐀㔀䌀㜀䄀　㔀㈀㤀䐀㘀㤀䄀㄀　㄀䌀　㜀㈀䐀䌀䄀㤀㘀䘀䔀㈀䘀㜀㈀㤀㘀㠀㤀䌀㜀䈀䔀㤀㜀䈀㤀㐀䄀䌀　㠀䄀䄀㔀䔀䘀㤀㌀㈀䄀㄀䌀㌀䐀㄀㤀㄀䔀㜀㈀㐀䐀䘀䐀　　㄀㜀䐀㠀㤀㌀㘀䐀䈀㔀䄀㐀䘀䈀㔀䈀䌀㔀䐀䘀㜀㘀䘀㔀㜀㤀䄀㜀　䈀㄀　　㘀䈀㐀㈀　㜀䄀　䄀㌀㔀䌀䄀㐀䘀㜀㘀㘀䄀㤀㄀䌀㤀䌀㘀㤀䈀䄀㐀䈀䈀䘀㘀䘀　䘀䘀㄀䔀䌀㘀㐀䄀䐀䘀䔀㘀㠀㄀　㌀　　䘀㈀䄀䐀䘀㈀䌀䘀䈀㄀　䐀䌀㄀䈀㔀䄀㈀䈀䔀㌀䔀㌀䈀䔀㜀㈀　䔀　㠀䈀䘀㔀㄀䈀㠀㈀㌀㌀䌀䔀㤀㐀　㌀　㐀䘀䄀䘀㔀㄀㜀䔀㄀㄀㘀䄀　㠀䌀㤀　㌀䄀䐀䘀㈀䘀㄀　㌀䔀㌀䔀㘀䄀㜀㔀㘀㤀䄀䐀㈀㠀䈀䐀㈀㤀䄀䘀䄀䐀㤀㔀㤀䐀䘀㈀㄀㜀㠀㄀㜀㈀㤀䈀䔀䔀㠀㤀㜀㈀㘀㤀䔀㤀㐀䌀㤀㌀㌀䔀䄀㄀㜀㈀㔀䘀　䌀䐀䌀䄀㔀㜀㘀㐀䐀䄀䘀㘀㔀㌀㤀䄀㈀㌀㤀䈀㐀㌀䈀䔀䈀㜀㐀㠀䔀㈀㐀㔀㜀㠀㈀㈀㜀㠀㤀䌀䈀䐀㤀䄀㘀㔀䄀㌀㐀䘀䔀㔀㤀䌀䄀㌀䘀㈀䐀㤀㔀䘀䘀䘀㔀㌀㤀䘀䌀䔀㄀㐀䐀㄀䄀㘀㔀　㄀㐀㌀㌀䐀㠀㄀䌀䄀䔀㜀㐀㌀䌀㐀䈀䔀㄀㌀䈀㐀㌀䔀㜀䘀　㜀㘀䌀㜀㌀䐀　㐀䌀䘀㌀㄀䈀䄀㄀㜀䐀㤀䄀䐀㠀㄀䌀　䈀　　䄀㄀㠀㤀䘀㔀㈀䐀㌀䘀㠀㤀㤀䌀䄀㌀㌀䈀㔀䘀㐀㤀㌀㄀㠀㤀䘀䄀䄀䐀䘀㌀㐀㄀㘀㌀䄀㈀㜀㠀䐀㠀㜀㠀㘀㠀䌀䔀　㐀㄀㐀㠀䐀　㄀㄀㄀㤀㠀㄀㐀䘀　㠀䐀䘀㈀㌀㈀　㄀㠀䐀㤀㄀㠀䘀㤀䔀㠀㔀䌀　㠀㄀㔀㄀䄀　　㠀䄀㐀㌀㐀㘀㐀㐀䔀㠀䘀㈀㠀㔀䐀㘀㌀䈀㔀䘀㈀㘀㌀㐀䘀㠀　䈀䘀㐀㜀䘀䘀䌀㠀㘀䐀㄀䔀䌀㐀㤀　䄀䔀䘀　䄀㘀䈀㌀䐀䐀㔀㄀㈀㘀㄀㐀㘀㈀㌀㐀㜀䄀㠀㤀䌀㘀䌀㈀㔀㜀䈀㐀㌀䈀㠀㜀㐀䄀㘀㤀䈀䄀䐀㤀䄀㘀㈀㈀䘀䈀㘀䌀䄀㠀䘀㐀䔀㘀㐀㤀䄀㘀㈀㌀䌀㠀㐀䈀㤀㠀㌀㜀䔀䌀䘀䐀　㜀㜀䌀䈀䘀㐀㌀䘀䔀䘀㌀㈀㐀㈀㌀㌀㠀䄀㌀䈀䔀㌀㐀㌀㤀㤀䈀㄀䘀㜀　㠀䐀㘀䔀㐀㌀㈀㤀㔀䌀䘀䄀䔀㔀㘀㜀㤀䌀㄀㔀䈀䄀㄀䈀㈀㈀㄀㄀䐀䈀　㌀䈀䐀　䘀㠀㈀㠀㤀㜀㜀㜀㔀㜀㜀㠀䈀䘀䈀㜀䐀㘀㔀㌀㈀䈀　㄀㤀䐀㤀㈀㔀㄀㄀䘀㐀䄀㜀䔀㔀㌀䐀䐀㈀㌀䐀䔀㐀㜀㐀㌀㜀㠀䔀䔀㤀㜀㈀㘀㤀䔀㤀㐀㄀㤀䘀䐀　㠀䌀䐀㔀　䈀㤀㌀　㈀䈀㜀㈀䄀㘀㘀䐀㔀㌀䄀䈀䔀䄀䐀㐀㐀㈀㤀䔀㄀䐀㄀䔀䔀䘀䄀㔀䌀䄀㠀㌀䈀㌀㔀㜀㄀䈀䐀㜀䌀㐀㐀㔀䐀䔀㄀　㘀㘀䈀䔀㌀䘀䌀䈀　㔀㌀㈀㘀㄀㘀䘀䄀㈀䔀䘀㤀㠀䈀㔀䐀䔀䄀㠀㌀㈀䘀䐀㠀㌀䌀䄀䐀䔀㄀㤀䈀䄀䈀㐀䐀䐀㈀䔀䈀㔀㐀䄀㄀䘀䌀㜀䌀䌀㜀㐀䔀　䐀㠀䄀㔀㘀㄀㄀㔀㌀　㔀㐀䄀㐀䘀䈀㌀㈀㐀㄀䘀㈀㜀㌀㔀㠀㌀䐀㈀㌀㄀䌀㈀㌀䐀䔀㌀㘀㌀㘀䘀䄀㔀㐀䌀㘀䔀㠀䘀㜀䌀㐀㌀㔀䘀㤀䔀䐀䘀䌀䌀䐀㔀　䔀㤀䘀䘀㄀㔀䘀䔀䘀䘀䈀㠀䘀䔀㈀䔀䈀㐀䐀䔀䘀䄀㌀㈀䘀㤀㘀㄀㤀㜀䐀䘀㐀㐀䈀䌀䈀䘀䌀䐀䈀㌀㠀㔀㄀䐀䈀䔀䘀䐀㐀㔀䘀㈀㌀㜀㠀㈀㤀㄀㤀䌀㔀㤀䔀　㐀䘀䘀㔀㌀䘀䌀䈀㄀䐀㘀㜀㜀䌀㔀䌀㔀　䈀　䌀䘀㘀㠀㤀䔀㠀䐀䘀㘀㤀䈀㤀㌀䘀䄀㤀㌀䘀㄀㄀䐀䐀　　䈀㄀䄀䐀㈀㠀㄀㘀　㜀䄀㔀䈀䘀㠀䘀䘀㘀㜀䌀㤀䘀㌀㌀䄀㜀䘀㈀䘀㘀㤀㔀㠀䘀䘀㤀䔀䘀䌀䐀䘀㠀䔀㘀㤀㠀䈀㘀䌀䌀䔀䐀䈀㄀䄀䐀䔀䄀㄀䘀㌀䐀䘀䐀䌀㄀　䐀㜀㐀㐀㐀䔀䌀䌀䄀䌀䘀㌀䌀㄀㔀㌀䔀㜀㄀㜀㘀㤀㈀　㌀　䄀䌀　㈀㈀㘀㠀㈀㄀㄀㈀㤀㤀䔀䌀㐀䐀㠀㠀䘀䄀㜀㌀㈀　䔀㈀㈀㄀　䔀㈀　㠀㠀䐀㌀䄀䄀㜀䐀䌀㈀㌀㔀㘀䘀㤀䌀䄀㠀㤀䈀䘀㌀㌀䄀㘀㄀㠀䄀㘀㠀㈀㠀　　㄀䄀䈀㄀䄀㜀䔀㘀㜀㠀䌀㄀䘀㤀㐀㘀㌀㤀㌀䌀㜀䘀䘀㜀㠀䌀䄀㘀㐀㌀䔀㜀㄀㜀㈀　䄀㘀㌀䄀䄀　㠀㤀㠀㜀㘀䔀㠀㤀㘀㈀㈀䌀䌀䌀㠀䌀㠀㄀㠀㈀㌀㠀㘀㔀㔀䌀　䄀　㜀㜀㘀㄀䘀䈀㌀䈀㘀䈀㜀䈀㤀㐀㘀㠀㈀㠀䔀㐀䄀　㈀㈀㄀㜀㔀䄀㜀㔀㌀㘀㐀䘀㘀䄀䌀㐀㤀㜀㤀㄀㤀㄀㌀㄀䌀㤀㄀㠀㔀㘀　㄀　㌀䐀㠀㔀㌀㠀㄀䔀㘀䐀䔀㘀䐀㜀䄀㔀　㐀䄀㈀㈀㐀䌀㤀䌀㔀㈀㤀䌀㘀䘀䄀䐀㐀㘀㜀䌀㄀㤀㄀㤀㄀㤀㤀㌀㠀䌀㘀㄀㄀㔀㌀　㐀䔀㌀㌀㐀㈀㌀㤀㐀㌀㄀䐀㐀㈀㈀䐀䄀䔀䐀㄀㜀䐀㘀㜀㠀䘀䄀㈀㄀㄀㤀䘀䔀䘀䌀䐀䌀㠀䌀㜀㔀㠀㘀㐀㘀㐀㐀䌀㈀㈀㠀㘀㔀㔀䌀　㈀　㐀䌀㌀䔀㘀㌀㤀䐀㜀㄀䄀䔀㘀㔀㘀㐀㘀㐀䘀㐀　䌀䌀㌀㈀䄀㘀　㌀㈀㌀㈀㌀㈀䘀䄀　　㠀㌀㈀䄀㘀　䐀㠀㜀䐀䌀㤀㐀䔀㐀䘀㤀㐀䈀㜀䔀䌀䘀㐀䈀䌀㈀㌀㜀㤀㄀䔀㔀䐀㘀㘀䈀㈀䐀㌀㄀㈀㘀㜀㔀㌀䘀㜀㠀䘀㈀㄀㜀䌀䘀㜀㐀䌀䌀㜀䘀㄀䈀㔀䔀䌀䈀䄀㘀㐀㐀㌀㄀㤀䈀㘀㌀䌀㌀㜀䐀䈀䈀䄀　㜀䔀㘀　䈀䔀䌀㈀㐀㌀䐀㌀䐀䈀㤀㐀䘀㄀䄀㐀㤀㄀㜀㄀䈀　㈀䐀㤀㐀㄀㠀䈀䐀䐀㄀　㌀䈀㐀㄀䈀䘀㄀䐀㤀䔀㤀䘀㘀䌀㘀㌀㜀㜀䔀㔀䐀㤀䔀㐀䄀㈀㤀㌀㜀䈀䄀䘀䈀㔀㜀㈀㔀㜀㌀㈀䘀㘀㔀㤀㜀㔀㤀䈀䌀㤀䐀䄀㄀䐀㜀䌀㌀䘀䐀䘀　㘀䌀䈀㄀㔀㈀㜀㜀㤀䌀㄀䘀㔀　㘀㌀䈀㠀䌀㜀䘀䐀䘀䔀㔀㌀㜀㤀　　䈀䔀䌀㔀䄀㘀㘀䐀㜀㈀䐀㌀㘀㔀　䐀㄀　　㤀㌀㌀䄀㘀㐀䘀㜀㜀　㤀㌀　㌀䈀㄀㌀䄀㐀㐀㠀㌀䌀䘀䐀㔀䔀㌀㐀㠀䌀䘀㜀䄀䌀㜀䄀　　䄀㄀㠀䈀㘀㔀䘀䈀㌀㘀㔀㜀䌀㘀䘀㔀䐀䄀㤀㠀　䄀㄀㐀㄀䔀䐀䄀㠀㜀㜀䐀㠀㌀㔀㠀䄀䌀㈀䘀㜀㤀䘀䄀䌀䄀䌀㘀　㄀䄀䘀䘀䌀䈀䄀䌀䔀䌀㐀　䔀㠀㘀　㄀　㔀㘀䌀䈀䘀㐀　䌀䈀䐀䌀䌀㜀䌀㈀䈀䐀䐀㔀䐀䔀䔀㘀㄀㔀㔀㐀㜀䔀㄀㄀䐀䈀䌀㤀䔀㜀䐀㐀㠀䔀䘀䐀　㘀㄀䐀㤀䐀䔀㜀䔀䄀㌀䈀䔀䈀䐀㔀　䌀䘀䐀㤀㘀䄀㜀䘀䈀㈀㤀㔀䔀㘀　㜀䔀㠀㜀䐀䐀㠀㔀䄀㠀䔀䌀䐀　㤀㠀䐀䔀䐀㈀䘀䄀䌀䐀䌀䌀䄀㠀䔀䌀　䌀㌀㘀　䘀㄀㈀䈀㔀㘀㜀䄀㜀䘀䌀㌀㜀　䄀䘀䌀䔀㄀䐀㈀㜀䌀䔀䄀㔀䈀　㘀㌀䐀䄀㐀䈀䔀㄀㘀䔀䄀㤀䈀　䐀䐀㤀䐀㈀㜀　䄀㘀䌀䈀㜀㠀㌀䌀㄀䘀㜀　䐀㄀䐀㤀䔀䔀䐀䘀㤀㈀㜀㈀䄀㘀䘀䔀䔀䌀䄀㤀㌀㜀㐀䈀䌀㐀㌀䔀㄀䌀䘀㔀㄀㌀㠀䔀㐀　㄀㜀䐀㄀㌀㠀䌀㄀䄀㄀䐀　䘀䄀㔀㌀㜀　㘀㠀㌀　㠀㄀㄀　㐀㔀㈀䔀䄀㠀㈀䌀㈀㔀㐀㔀㘀㤀㠀㔀䄀㈀䌀䈀㐀䐀㈀䐀㘀　㘀㤀㘀㘀䔀㈀䌀　㜀䐀䘀䔀䘀䄀　㜀䌀䔀㄀㈀㘀䈀㈀䌀㤀䐀　䄀䘀䌀䔀㄀㔀㘀㜀㌀㐀㄀㘀㘀㔀䐀䘀　䐀㈀䔀㌀㜀䈀㄀㈀㌀㔀䄀䄀㔀㜀㜀䈀䈀㌀㄀㄀㘀㔀䐀㘀䈀䄀䐀䄀䔀㌀㠀㈀㤀㄀㌀㌀㜀㈀䄀㔀䌀䄀㐀䘀　㔀㈀㔀㜀㤀䌀䌀㐀㠀䐀䄀䐀㄀㜀㈀㐀䌀㄀䘀㌀㜀㔀㤀䘀䈀㈀㜀䈀㔀㠀䘀㜀㌀㘀㔀　㤀㠀㜀㜀㈀㠀㄀䔀䌀㈀㜀㈀䌀㌀㔀㠀䔀䄀　㜀㔀㌀㤀㌀䄀䈀㤀㐀䔀䔀㄀䘀䔀䈀㔀䈀䐀䄀　㌀㜀䄀㐀㄀䐀䄀　䐀㠀㌀　㄀㘀䐀㄀㐀䘀㌀㄀㌀　㘀㐀䄀㐀䌀㄀䄀䈀㘀䐀㌀㌀䈀䘀㜀䄀䈀䄀䌀㠀䘀䈀㘀䌀䄀䔀　㜀㌀　㜀㤀㔀䘀㜀䔀㄀㐀䄀㌀䈀㘀䐀㜀　㌀䘀䌀㔀㐀䘀㜀䈀䔀䐀㐀䈀䄀㈀㘀㈀㔀　　㔀　䌀㠀䄀㔀䄀㈀䄀㜀㐀㤀䔀䈀㔀㘀䔀䐀㤀㠀䘀䄀　　㄀㘀　㄀㘀㠀　㘀䐀　䐀㤀䐀䐀䘀㔀䐀㔀㌀䐀㈀䄀㄀㌀㄀㌀　䄀㌀㠀㈀䄀㠀㐀　㈀䄀㤀㠀䌀䄀䄀㄀䐀㌀㐀㐀㜀㜀㤀㜀　䔀㄀䄀㌀　㤀㔀㌀䌀䄀㈀䘀　䈀　㄀䘀㤀㤀㘀㤀㤀㔀㐀䐀　䘀䌀䘀㘀㠀　䌀㜀䈀㈀䄀㐀䌀㜀㜀㜀㔀㠀㤀㤀　䌀㄀㠀㄀㄀㈀　䐀䔀䐀㜀㤀㔀㘀䌀䔀㠀㘀䔀㠀㄀䌀㌀㠀㈀　㐀㜀䔀㠀㈀　㘀㐀㘀㠀㜀㠀㐀䐀䔀䔀㌀㠀䘀䐀䘀䌀䔀㐀㈀䘀㈀㤀㘀䐀㘀䔀㐀㜀䔀㐀䔀䔀㌀䌀㜀䐀䌀㐀䔀㜀㈀䘀㄀䐀䘀㠀　䔀䌀㔀　㄀㔀䈀㄀㘀㔀䐀㜀㤀䈀䄀㈀㜀㌀㠀䌀䄀䔀㤀㘀㐀㈀䈀㄀䈀㈀㔀㘀㤀䘀䈀㄀㌀㤀㔀　䐀㄀䐀　　䔀㄀䘀䈀䄀　㤀䔀䐀䐀䄀䐀䔀㜀㈀㤀㄀　䔀䄀䌀䈀䄀䐀㌀䄀䐀䘀㤀㤀　䔀㠀㠀㤀　䔀䌀䘀㘀䔀　㜀䈀䐀㌀䘀䐀㐀㌀䄀䌀䐀䔀䐀　䄀䘀䌀㤀㄀㔀㘀㜀㌀㐀㄀㘀䄀㔀㄀䌀䐀䐀㄀㔀㈀㜀㄀䐀䈀䐀㔀䈀㘀㌀䐀㄀㐀㔀䐀㘀䔀䄀㠀䄀䐀㌀㌀㄀㔀䐀㘀㔀㌀䈀㘀㈀䄀㌀㔀䐀㜀㄀䘀㈀㌀䐀㔀㘀䐀䔀　㠀㐀㌀　㐀㈀　㘀䐀　㔀㈀㄀㐀㄀㌀䈀㜀䄀㠀䄀䘀㈀䔀㘀㘀䔀㔀㘀㄀㜀㔀㤀㘀㔀䄀　䔀㠀㄀䈀㌀㤀㤀㜀㈀㠀㄀䘀㌀䔀䐀㠀䌀䌀䈀㔀䌀䄀㌀㌀䐀䔀㐀䐀䌀䄀　㜀䘀䘀㜀䈀㔀䈀　㈀䌀㜀㈀㠀㔀䘀㜀㌀㜀㔀㠀䘀䐀㤀㤀䔀㄀䈀㜀䌀㤀㈀㤀䔀㌀䘀㔀㠀㘀㔀䔀䄀䘀㈀㄀䄀䐀㔀㠀㌀䌀䘀㘀䔀䘀䄀㄀㈀㠀㌀㈀䄀㘀　㘀㠀䈀　䔀䘀䈀㘀㔀㈀䈀㈀㈀㌀㘀㠀㄀㠀　㄀㔀㈀䄀䘀㜀㘀㜀㐀　㘀㐀㘀㜀㔀㘀㘀　㔀㔀㐀䈀䄀䈀䈀䄀㘀䄀㐀㌀㌀䈀䄀㌀䘀㤀　㔀㔀䈀䄀䔀㠀䔀㐀㌀㐀㤀　䘀㤀㔀㘀䈀㤀䈀䈀㜀䌀㌀䌀　㤀㠀䘀㜀䈀䐀㠀䌀㐀㌀　䔀㈀㈀䔀䐀㈀㘀䘀㘀㘀㄀㜀㔀㐀䘀䌀㈀㤀䘀䄀㤀䔀䌀㘀䔀㘀䈀㐀㌀㠀䔀㄀㐀㐀㌀㜀㤀㄀㈀䌀䔀㤀㤀㠀㈀㔀㈀　　㠀䔀㠀㈀　㘀㜀䔀䈀㜀㤀㤀㌀㌀䈀㐀䔀㌀䄀㈀㘀㌀㌀㤀　㌀䘀䈀㘀䈀㈀䄀㄀䘀㌀䔀䔀㤀㔀㠀䄀䐀㌀䐀䐀㜀㤀㌀䔀㔀㤀䈀䘀䈀㜀䈀㄀䌀䄀㔀㤀㜀㤀䔀䄀䌀䄀䘀㌀㘀䄀㤀㔀䌀㔀䐀㘀㔀㘀㈀䐀㐀㜀㜀㠀㠀䔀　　㐀㌀㈀　䔀䐀䄀䔀㘀䘀䘀䌀㄀㤀㘀䐀㈀㈀㜀㔀䐀㄀㘀㤀㠀䄀㤀䈀㜀䌀㌀㈀㤀㌀䄀㤀㌀㌀㌀　䔀䌀㜀㐀䘀　䘀䐀㘀㘀㐀䄀䌀㜀䘀㔀㔀㘀　㤀䔀䄀㘀㠀䔀㠀䐀㜀䔀㐀㠀䄀㜀㌀䌀㐀㈀䄀㘀㌀㔀㄀䐀㈀㠀㜀䄀　㐀　㔀　㔀䐀㘀㘀䐀䐀㄀䈀㠀䈀䔀䔀㘀䈀䄀䐀䄀䔀㌀㠀㜀㤀䐀䘀㠀䐀　䄀㤀䈀㔀䌀㜀㄀䈀䄀㌀䘀㔀䐀䔀㈀㌀䘀䌀㤀䄀䄀㠀㄀㘀　㠀䐀㔀㔀㠀䔀䌀㌀䈀㠀㘀㘀㔀㠀䄀䈀㠀㄀䄀㈀　䈀㄀㠀㤀㘀㌀㄀䘀㠀㄀㄀㠀䄀㜀㘀㔀㈀㌀㌀㄀㔀䘀㘀䔀䔀㔀㘀䈀㤀䈀䄀䘀　䔀䐀㄀㌀䔀㐀䌀䈀䐀䐀㜀㤀㤀㈀㜀㜀㘀㘀㌀㤀䄀㤀䌀㄀㈀㜀䔀㔀㌀㜀㌀䐀㤀㐀㠀䈀㄀䈀䄀㘀䘀㘀㈀䐀　㘀㔀㔀䌀　㌀　䌀䄀䈀㜀㜀㌀䘀㠀㄀䐀㔀䐀㘀㘀　㈀㠀䌀䔀㌀㄀㘀䔀䄀㜀㜀㌀㐀㄀㔀䘀㠀䘀㌀䘀　㄀䈀㄀䈀㈀㔀䌀䄀㠀㌀㐀䔀㤀䔀㈀䔀㄀㄀䐀䔀䄀㔀䈀䘀㌀㐀䔀䌀㄀㔀　䄀䔀㌀㤀䈀䘀䄀㄀䐀㄀䐀㌀㠀䘀㌀䘀㜀㌀䘀䄀䌀䐀㔀㄀䈀㤀䐀㘀䘀䔀㈀㌀䈀䐀䈀䄀䄀㠀䔀㄀㠀䐀䐀㜀㌀䈀㘀㜀㌀䌀㜀䘀㤀䈀䐀㤀　㄀䘀䘀　䈀䘀㔀㘀䔀䘀㘀䄀㜀㄀䄀㄀㔀㔀㤀䐀䌀䐀㄀㄀㔀䐀㜀㤀䈀䄀䘀䔀䔀㘀䄀㔀㔀㘀㌀㔀䔀䌀䐀㐀䔀䐀㘀㔀㜀䌀㔀㘀　㜀　㐀　㈀䌀㘀㠀䌀䔀䔀䘀㜀䄀㐀　㤀㐀䐀　㜀䐀䘀䐀㜀䈀㤀䔀㈀㐀䌀㌀㄀㄀䔀㔀㜀㤀䌀䔀㌀㌀䐀䘀㠀䈀䔀䌀䔀䄀㠀㌀　㜀㔀䌀㔀䔀㤀䌀㜀䐀㤀䄀㐀䌀㘀㤀㔀㔀㜀㠀㐀䐀䘀䔀㤀䌀　䔀㘀㘀　㄀　㘀㐀㠀㘀㜀䈀䄀㌀䘀䔀㘀䘀䈀㜀㤀㤀䘀㌀䌀䌀㠀㘀䘀䈀䔀㤀㌀㜀㤀䘀䈀㌀　㄀䌀㌀䄀　　䄀㤀㠀䘀㄀䄀　㄀䈀㄀䈀䄀㐀㐀䔀䔀䘀㈀䌀㘀䈀䘀㠀㄀䐀䔀䐀㘀䔀㤀䄀㔀䌀㔀䐀䌀㘀䘀䈀㔀㄀䘀㤀䐀㜀䔀䔀㤀䈀㘀䔀䄀㜀䈀䔀㜀㔀䘀䔀㘀䄀䔀䄀䘀㐀㈀㠀䔀䐀䐀䌀㜀　㜀㘀䔀㌀䄀㈀㤀㌀䘀㐀㈀䌀䈀㌀㠀䌀㘀䔀䌀　䐀㈀　䘀　㄀䘀㔀䄀㠀㐀䐀㘀㄀㐀䌀㈀㔀　㄀㤀㌀㤀㄀䈀㄀㈀䔀㤀㄀　㔀䈀㄀㘀㔀　㄀䐀㌀　䐀㤀䄀㜀䌀䔀䌀　㈀㄀㐀㠀　䔀㠀㄀㌀㔀䌀㐀㤀㄀㤀㔀䐀㄀㤀㠀䔀䐀㜀㠀㠀㜀㈀㌀䌀㜀䔀㜀㈀䌀㜀　䄀㤀㠀　㠀㤀㘀　　㄀㌀䘀㄀㌀㌀㠀㈀䌀䔀㠀㜀䈀㐀㐀䔀䄀㘀㔀䘀㔀䔀䈀㜀㈀㄀㐀㌀㄀㤀㠀䈀䔀䔀㠀䌀䘀㈀㘀䈀㈀䄀䘀䈀㠀䌀　㄀䌀　䈀　　䄀㤀㠀㘀䔀㠀䌀㄀䐀䄀㄀㠀䔀㤀䐀䐀䔀㐀㘀　㤀㤀㠀㤀䔀䈀㈀㠀㜀䐀㈀㄀　㤀㘀䌀㈀䄀㤀䌀㈀㔀䘀㔀䈀㐀㤀　䘀㌀䔀䄀㐀䘀䘀㜀㤀䔀䔀䔀䔀㌀㈀㔀㄀㄀䄀䄀㈀䄀㠀㘀㔀䐀䐀㠀䐀䔀㈀㤀㐀䈀䐀㈀䈀㐀䘀䐀㐀㌀㜀㈀䘀䈀㐀䈀㈀㈀㌀䄀㌀䐀㠀㘀㌀㔀㐀㔀䈀䄀䌀㠀䈀㌀　㔀　㤀　䔀䔀䄀㜀㌀㐀㄀　㄀㜀㌀䈀㠀䈀䔀㤀䘀䌀㈀㠀㈀㌀䐀㄀䘀䈀㔀䌀䄀㤀䔀䘀㜀㠀䘀䘀㘀䔀䄀㔀䌀䈀㘀㤀㔀㤀㄀䌀㌀䐀㔀䐀䐀䈀㤀　㐀䘀䔀䔀䄀㌀　䌀㜀㘀䌀䄀㤀㔀㜀㐀䄀㄀㈀㠀㐀㔀㄀㤀㠀㤀䘀䔀　　㈀㘀　䐀　㔀㈀㄀䘀䄀　㄀㈀㠀䐀䐀㘀㌀㘀䌀䘀㐀㐀㤀㠀䈀䄀㜀䔀䈀㤀䐀㤀㌀䄀䐀㔀䌀㠀㈀㈀㄀㈀㠀䐀䐀㄀㔀䔀㐀㌀㜀䄀䌀䄀㐀㔀㤀䈀㜀㔀㌀䘀䔀㠀㠀㈀䈀䐀㈀䐀㔀䔀㜀䄀㠀䐀䌀㔀　㔀㠀䘀䔀䌀㈀㈀䄀㤀䘀䌀㠀㜀䌀㠀䈀㄀㈀䘀㠀䌀䈀㐀䄀㈀㜀䔀㄀䄀㌀㈀䈀㠀㈀䘀㔀㐀㄀㐀　㌀䈀䌀䐀䈀䈀䈀㄀䔀㈀㜀䄀㠀㘀㔀㔀㌀㐀㘀䐀䌀㘀　　㘀㈀㔀㠀　㔀　䌀䔀㠀㘀㐀䔀䌀㐀㠀䌀㜀㜀㔀　㄀㔀㌀㜀㜀䌀䄀㄀䔀㄀䐀㤀䘀㐀䔀䔀㈀㔀㐀䄀㄀䔀䈀㐀䄀䈀㠀㐀㜀䌀㜀㠀　㘀䄀㘀㐀㤀䐀䌀䐀䌀㠀㠀䄀䄀　䌀　㌀䘀㈀䈀㈀䌀䌀　㤀㄀　䄀㤀㜀㘀㜀㜀㌀㜀㔀㄀䘀㘀㔀㄀䘀㄀㐀㈀䄀㌀㌀㤀䔀㈀㔀㈀㄀㠀䌀㔀䈀㄀㐀㈀䘀䌀㈀䔀㈀㘀㤀㐀䄀　㜀㤀䐀㄀䔀㄀㘀㠀㘀　䔀　䌀㠀㌀㠀　䄀㈀　䘀䔀㘀㘀㘀㤀䔀䈀㔀䐀㈀䈀㈀㘀䌀䄀䔀䈀䈀䈀㘀㈀㄀㤀䘀㜀㐀䌀䌀䈀㔀㔀㘀㔀㄀䄀䔀䌀䌀　㠀㐀䔀䐀㐀㘀䘀㜀䌀䌀䐀䘀䄀䔀㤀㤀㄀䔀㐀䐀㜀㐀䘀㌀䔀㐀䌀㐀䘀㔀䄀䐀䌀㐀㈀䘀㜀㜀㤀㄀㜀㌀䄀㄀㘀㜀䘀䈀䄀㔀䘀㔀㈀㔀䄀䐀䌀㈀㔀㈀㐀㘀㤀㐀㐀㄀㠀㐀㘀㜀䘀䈀㠀䈀㜀䄀䄀　䌀䘀䌀䐀㠀䐀䈀䘀䐀㤀㔀㘀䘀䘀㜀㔀㤀㜀䈀䄀㄀䌀䄀㠀　䘀㐀㌀䐀㐀㜀䔀㄀䈀㠀䌀䘀㔀䌀㠀㐀㈀㐀㘀䌀䌀䌀　䔀㜀䄀㌀㜀䐀㈀䈀㐀㄀㤀　㌀㠀㠀㘀㄀㄀㔀㌀　䐀䐀㄀㠀㌀䈀㈀㈀㈀䌀䔀㠀　㠀䈀䔀㐀㄀㈀䈀㌀䐀㘀㔀㠀䘀㠀䈀㠀㘀㄀䘀䄀㤀㐀㈀　㐀　㔀㔀㌀㜀㘀㌀䄀　䘀㌀㌀㄀㤀㌀䄀　㌀　㈀㠀㈀㄀㄀䐀㠀䘀㜀㠀䔀㌀　䘀䄀㄀䘀䄀㐀㘀䘀㈀䔀䐀㘀䘀㌀㄀㠀㌀䔀䔀䘀㄀䐀㄀㄀䌀㈀㜀　㌀䄀㌀㐀　㔀䌀䈀　㌀　㐀㄀㔀㄀㐀㈀㤀䈀㌀　㈀㄀㜀㐀㘀䐀㄀㘀㜀㘀䌀㔀㌀㌀䔀㤀㤀㠀㤀㘀䐀㘀䔀㄀㔀䔀㔀㐀䄀㠀㜀䄀㘀䌀㌀㈀㈀㤀㠀　䔀䐀㐀㔀䘀㔀㜀㈀　䘀䈀㠀㘀䈀䈀䘀㐀䄀㐀㐀㔀㠀㜀㔀㌀䘀㤀㜀㜀㠀㜀䈀㐀㌀　䐀䈀䐀㤀㐀䄀㘀㔀㐀㠀㤀䔀㔀㈀䈀䄀㤀䄀㌀㈀㌀㠀㐀　䔀䘀䈀　䐀㜀䌀㔀䌀䈀䘀䌀䔀㄀㄀　䔀䘀　㌀䘀䄀㤀䔀䘀㜀㤀䘀㘀㠀㄀㔀䌀䐀䔀䈀㄀㐀㌀　䔀㔀䔀㌀㘀㔀䌀䘀㔀䔀䄀㔀㈀䐀㈀䐀㄀䈀䄀㌀　䔀㄀䌀㠀㘀㔀㔀䌀　㜀㐀㘀㌀䔀䌀㐀㠀㘀㌀䐀䔀㔀䘀䈀䘀䐀䈀㤀䐀䈀㈀㄀㜀䈀㜀䌀䌀䐀㌀㜀㄀䐀䔀䐀㄀㐀㔀䘀䌀㘀㜀㜀㘀㜀㠀㜀䔀㔀㄀䌀䐀㌀䐀䐀㜀㠀㜀㈀䌀㐀䌀䔀䔀䄀㜀㄀㐀㘀㤀㐀䄀䌀䈀㜀㘀㘀㌀䐀㐀　㤀䐀䔀㔀㜀㜀㌀䌀䘀䘀㌀䘀㠀㤀䐀㠀㘀䘀䈀䌀　䌀䐀㈀㌀㔀㈀䈀䄀㤀㜀㤀㤀㔀䈀䐀㌀䘀㘀㜀䈀㘀㘀㔀㌀䌀䌀㤀㘀㄀　㐀㘀䔀㐀䔀䈀䔀䈀　䐀䔀䘀㜀䐀䐀䔀䐀䄀䄀㌀㄀䈀㘀䄀㌀䈀䄀㌀㠀䘀㌀㄀䄀䌀　㈀䄀㘀㄀䈀䐀　䘀㠀㜀䘀㘀㌀㄀㤀䈀䐀　　䌀䈀㈀䄀㜀㐀㌀䘀㜀㄀䌀㘀㤀㠀㌀㄀　㔀㌀㄀䄀㠀　㈀㠀㘀㘀㔀　㔀䈀㘀㌀㘀䄀㐀㤀䘀䐀㄀䈀㄀䌀䔀㤀　㄀㄀䔀㔀㈀䈀㤀䈀䔀䐀㤀㠀䌀䐀䈀　㄀㔀䈀䔀㤀㜀䐀㌀㘀䈀㄀㐀㤀㄀䔀㠀　䐀㜀䌀䔀㐀㐀㜀㐀㤀䔀㤀䔀㘀　㤀䔀㌀䐀䐀　㜀䌀㄀㤀㈀㠀　㘀䐀䘀㈀㘀䌀䘀㄀㜀㜀　㘀　㔀䔀㔀㌀㄀㠀䄀㔀䔀㤀㘀㐀䘀㔀䘀　㠀䔀䘀䈀㈀䐀㐀㘀㌀䔀㜀䔀䌀㠀㠀㔀㔀㐀㘀㤀　㘀䈀䘀㐀䐀䐀䘀㜀䄀䌀㄀㔀㤀䔀㌀㘀㔀䘀㤀㈀㐀䌀䐀㐀㤀䈀㔀䘀㔀㌀㔀䔀㔀㤀㤀㘀䄀㄀䌀㠀㐀䐀㜀㜀　㐀㌀䈀䘀䌀㔀㐀㐀䌀㌀䘀䔀㠀　䔀㜀䐀㐀䘀䐀㌀　㤀㤀㐀㄀㄀㐀䐀　㘀㤀㔀䔀䐀　䌀　䐀㔀㌀　㌀䌀䄀㜀㘀䌀䌀䔀　㜀㠀䐀　㤀㐀䄀㘀䈀㄀㜀䔀㌀䈀䐀㘀㤀㌀㈀㐀䘀䈀㄀䔀㠀㌀㈀䄀㘀　　　　䐀㄀㌀䌀㔀㈀㌀䐀㌀䘀㄀㔀㐀䌀　䘀㠀㄀㤀㌀㈀㔀䘀䈀㐀䔀䄀　䌀㤀䈀䈀㜀㔀䈀䌀㤀䔀䄀䌀䌀䈀㜀㔀㈀㌀䘀㠀㄀㜀㈀㤀㐀㐀䔀㐀　㐀㜀㘀㘀㤀䈀㌀㠀　䐀䘀　　䌀㈀䈀㈀䈀㄀䈀㤀䐀　　㄀䐀㄀㘀䈀䐀　㜀㐀㘀㜀㌀㄀㜀䔀㠀㄀䈀㤀㘀㈀㜀䈀　㌀䌀㈀䌀㐀䈀㔀　䐀㐀㤀䔀㘀䌀䄀㔀㔀㈀䐀㘀䔀䐀㔀　㔀　䄀䔀㈀㈀　　䐀㠀㘀㤀㠀䌀　䐀䐀㈀䐀䘀㈀䈀㈀䌀　䔀㈀㘀㐀㌀㘀㤀㠀䌀䈀㈀㤀㌀䄀䐀䔀㔀　㠀㌀䌀㄀㐀䄀㈀㘀䘀䈀㘀䌀䄀䈀㠀㜀㈀㐀㜀䈀䐀㜀䈀㠀㜀㈀䔀䘀㈀㐀㘀　㜀䌀㐀㜀㌀㌀䘀　䄀䐀㜀　䘀㔀䄀䌀㤀䌀㘀䘀䌀䌀㄀㈀䄀㔀䈀㄀䔀䔀㈀㐀㜀䄀㜀㠀㌀䔀䐀㄀㐀䈀㌀㌀㄀　䌀䔀㔀㌀　㐀䈀㜀㠀㔀　㜀㤀䔀㘀䘀䌀㈀㜀㔀㠀㤀䔀㠀㔀㔀㘀䔀䄀㔀㜀䄀　䐀㐀㤀㤀䈀㤀䘀䐀䈀㤀㔀㔀㈀㜀　㈀㈀䌀䈀　㔀㈀㐀　㜀䔀㔀㤀㘀㤀䘀㜀䈀䌀䘀䘀㠀㌀䔀㈀䘀䘀㘀䈀䄀㔀㠀䐀㐀䔀㜀䈀䈀䌀䌀㈀㐀㄀䐀㤀䘀䈀㐀㘀䄀䈀㐀䌀㄀㄀䐀㠀　㔀㠀䌀　䐀㄀㄀　䄀㘀　　䌀㌀㠀　䘀䐀㌀㜀䈀㘀㜀㈀㠀䌀䐀㈀㤀䔀㈀㈀㤀㤀㐀㤀㐀㌀㄀　㈀㠀　㐀㄀㠀㌀䘀㘀㐀㠀㠀㜀㘀㌀䘀　㐀　㠀㄀䌀䌀䔀䌀　㜀㄀䐀䌀䌀㘀㔀䄀䄀㤀㜀㌀㤀䄀䄀䈀㌀㈀㜀㈀䈀㈀䘀㤀㐀䄀㜀㤀䘀㄀㈀䔀㤀　㘀㤀㔀㌀㌀㤀㔀䌀䔀㄀䐀㔀㔀䔀䔀㔀䈀㔀㠀䔀䈀㠀㤀㠀㠀㜀䔀䘀䄀䔀㘀㘀䔀　䄀㤀䘀㌀䌀䄀㌀㠀　㜀䔀㐀㐀㘀㤀㠀䐀䄀㜀㘀䘀㔀㈀䔀㜀　㜀㈀䈀㔀䐀䌀䈀㔀㐀䐀㘀㠀䘀㈀㠀䐀䔀㄀㄀㈀䈀㜀㔀㘀䈀㘀䔀䔀㐀䘀㤀㔀䌀䘀䐀䈀䘀㠀㔀䌀䄀㠀　㜀㘀䘀㄀㘀㜀　䄀㘀㌀㤀㔀䌀㈀䄀㐀㘀䔀䄀㠀㔀䈀㜀㐀㜀㘀䔀㠀䌀㤀　䔀䐀㈀䘀䐀䐀䐀䘀㔀㠀䌀㌀䌀䄀㌀㠀䌀㜀㜀㌀㘀䘀㈀㄀㤀㈀䄀㄀㜀䐀䄀䘀㜀㠀㔀㔀㘀㄀㤀㠀㈀㤀㈀㜀㘀㌀䘀㤀䐀㌀㌀㌀㈀䄀　䄀㜀㔀䈀㤀䘀㤀䐀㘀㤀㌀䔀䄀㠀　㈀䌀㘀　䘀䈀㠀㜀㈀㌀䈀㤀䌀㄀㐀㠀䌀㔀　㜀㐀㘀㐀㔀㜀㜀㈀䘀㈀㤀䈀㐀䄀䄀㄀䐀㈀䘀㜀䐀㐀㜀㌀㠀㐀　䘀㜀㘀㌀䔀㜀㐀　㈀䌀䌀䔀　㘀㄀㐀䄀㔀　䈀䔀㌀㈀㤀㈀䈀㈀䐀䐀㄀䐀㌀䈀㄀㈀㈀䄀㄀䔀　䈀㘀䄀㄀㐀㤀㠀㌀㐀㄀㘀㌀䄀㤀㔀䐀䈀㌀㘀䌀䐀䈀　䌀䄀䄀㘀䔀㘀　㘀䌀㔀䈀㔀㔀㠀㘀㄀㌀㌀㄀㈀㐀㄀䈀㤀䐀㈀㈀　䄀㤀㜀䌀㌀䄀㈀䌀　䐀㤀䔀䌀㘀㠀㜀㤀㈀㄀㌀㠀㄀㌀㐀䌀䐀㔀䄀㠀䐀㈀䈀䄀㜀㈀㤀㔀䔀　㐀　㈀㠀䌀䐀㌀䄀㜀䄀䌀䈀㐀䘀䐀　㄀㜀䈀㔀㠀㘀㔀䘀㠀㜀㠀㤀㐀䐀㈀㜀㔀䈀㔀㔀㔀　㘀㤀㜀㌀㐀㜀　㘀㠀㘀㐀㌀䄀㄀㠀䐀䈀䔀䐀㌀㤀　䈀　㤀䔀㄀䘀㄀㜀䐀䔀㔀䔀㜀㄀　䄀㔀㄀㌀䘀㘀㠀㜀䌀䔀㜀䄀㠀㔀䐀㈀䌀䈀㘀㠀㐀㤀㈀㜀䘀䘀㘀䘀㈀䈀㐀㜀䘀䘀䐀㔀㔀㘀㄀㤀㘀㠀㘀䔀䄀䄀㜀㠀䔀㤀䐀㐀䔀㠀㤀䐀㄀　㠀㘀㘀䔀㌀　䌀䄀㠀䌀㠀㤀䈀㘀䘀㌀　㌀䄀䈀䄀㠀㘀䘀䌀㈀㐀㌀䔀㠀㘀䘀㄀㘀䐀䔀㌀䈀䐀㐀䔀䄀㄀㄀㐀䘀䌀㔀䐀䌀㈀䘀㜀㤀䈀㘀䈀㜀䌀䄀㤀䈀㄀㄀㄀䐀㈀㔀㈀䘀㠀㈀䐀　　䐀䘀䈀㤀㠀㘀䐀㌀䐀㔀㜀䘀㤀䔀㔀㔀䈀㔀㠀㌀㐀㌀䘀㈀㔀䘀㈀㠀䘀㤀㔀㜀䔀㌀䄀㈀㤀䌀㈀㄀㤀䘀䐀䐀　䐀㌀䘀㐀㤀䐀㤀䘀㠀㠀䈀㠀㠀㄀㔀㔀䄀㜀㘀䘀䘀㈀䌀䔀䌀㄀　䄀䘀㌀㌀㤀㠀䄀䘀㜀䄀㌀䐀㘀㜀䄀䘀䄀䔀㘀㄀㘀㐀䄀㠀䈀㄀䈀㌀㘀㌀㈀䈀㠀㔀　㠀䘀䈀㜀䔀䈀㄀䐀䐀䄀㘀　㌀㐀䘀㈀㜀㐀㌀䈀㈀䔀㐀　㜀䐀䘀㤀　䌀㘀䐀㜀䈀䐀㔀　㌀䌀䌀㄀䘀㠀䄀䔀䔀㄀䐀䘀㐀㄀䐀䌀㈀㤀㌀䈀㘀㜀㌀㠀䐀䔀䔀㌀㌀䐀㠀䈀㄀㌀㔀㘀㄀㤀㄀䐀䔀䘀㔀㤀㌀㌀㈀㈀㤀㔀䈀　㐀　䘀　㈀䘀㄀㈀㤀㠀䄀䐀䘀㐀䘀䔀㜀㠀䌀　䌀䄀㠀䐀䈀㜀䈀䘀㔀　䐀　㘀㔀㔀䌀　㔀　䘀㠀㈀㜀㔀䈀䈀㤀䌀㘀䔀㜀㜀㈀㌀㘀䌀㠀㐀㄀㈀㄀䄀㌀㈀　㘀㐀䐀㐀䄀㜀㌀㌀㜀䘀䌀㐀㐀䄀㐀㄀㐀㌀㠀㜀㈀㔀䌀䘀　㠀　㈀㈀䄀㠀䐀㠀䄀䄀㄀　㄀㈀㄀㜀㠀㘀㠀䘀　㜀㐀㄀㠀㈀䄀㘀䔀䈀㔀㤀䔀㌀㄀㜀㈀㌀　　䈀䈀㤀㔀䌀䔀㄀㈀㌀㜀㐀䘀䌀㤀　㌀㔀㄀䄀㠀䌀㄀䈀㌀䘀㘀㈀䐀㠀䔀㘀䔀㜀㔀㤀㐀䘀㔀㌀㤀䌀㌀㐀㄀㘀㄀䄀㈀㌀䄀㌀㈀䈀䔀䌀䌀䈀㈀㈀䌀㔀㐀㤀䄀㌀䄀㈀䘀㌀㐀㄀㔀䘀䌀䘀䈀㜀㔀㘀䔀㌀㐀䄀㘀㜀䄀䘀㘀㠀㐀㠀㘀䘀㔀㜀㄀䌀㠀　䌀㘀䔀䐀㠀㘀㠀䘀㐀䔀䄀䐀㜀䈀䘀䌀㜀䈀㈀㤀㌀䘀　㠀䄀㤀㄀㔀㔀㘀㤀㤀　䐀㄀　䔀䔀䘀㄀㈀䄀㠀䈀㜀㌀䘀㐀㤀䈀㜀㠀㤀㠀䌀㔀䈀㤀㜀㄀㈀㐀䘀㄀䐀　䈀㄀䐀䔀㘀䄀㘀㔀䄀㜀㜀䈀䈀㈀䈀㔀㤀䄀㈀㜀䐀　㤀　㘀㄀㠀㈀㄀　䌀㘀㔀　䔀㐀䈀㠀㤀㈀䄀　䐀㄀㜀䘀㈀㤀䈀䌀䈀䈀㌀䄀㠀㐀㐀㜀㤀䔀㄀　㘀㐀㘀䘀　䔀䔀䘀㌀㄀䌀㈀䈀䔀䌀㔀䌀䄀㄀㄀㤀㤀䌀䔀㤀㐀㤀䔀㠀䄀䘀㤀㈀㘀䄀䈀䔀䌀㜀㔀㐀䌀䘀㤀㌀䈀㐀㄀䘀㔀㐀　㄀䔀㔀㈀䌀㌀䈀䔀䐀㔀㈀䄀䐀㜀䄀㔀㐀䄀㤀䘀㄀䈀㔀䐀㈀䔀㔀㈀㌀䄀㔀㘀㈀䄀㌀䌀㘀㘀㐀㤀䐀㜀䄀䈀䈀䌀䘀䐀㐀㐀㐀㐀㌀㜀㔀䔀㜀㐀㜀㘀䔀䄀㔀䌀䄀䈀　䌀㄀㤀䄀㤀䔀䈀䘀㐀䘀㐀䌀䐀㈀䈀䄀䐀䐀㔀䈀　㜀㄀㠀㔀㔀㔀䌀㘀㤀䄀䘀㜀㔀㤀㘀㔀䈀䈀㐀㔀㤀䄀㔀䌀㜀㠀䘀　䘀䘀㐀䔀㈀䄀　㜀㘀㜀䘀䐀䈀䌀㐀䌀㤀㜀㈀䄀㘀䘀䄀㐀㠀䐀㌀䄀㔀䈀䄀㘀㜀㈀㤀䈀䄀㔀䘀䌀㤀㤀㔀㔀㐀㘀䈀㘀䐀䈀㔀㠀㜀㔀㔀㈀㈀㘀䔀㔀㜀䄀䈀㐀䐀㈀䔀䈀㐀㜀　㐀䘀䈀䔀㤀㤀䌀㤀㄀䄀㄀㤀䌀㘀䔀㜀䐀㠀㘀㐀㄀㄀㔀㌀　䌀䌀　䌀㔀㠀㘀㘀䐀㐀㄀㤀㈀㘀㌀䄀䌀䔀䐀㈀䔀㔀䈀㠀䌀㐀㈀䄀㘀㤀䔀䘀㜀㠀䈀䈀䘀䔀䐀㈀㤀　䄀㈀　㄀㈀㈀㜀　䐀䐀　㐀㤀㔀㐀㜀㐀㔀䐀㈀㐀㤀䄀　㤀䐀㤀䐀㌀㤀㘀㄀䄀㐀䄀㜀䔀㌀䈀䄀䘀㄀䔀㌀㔀㤀㐀䄀㠀䈀䄀㜀䌀㤀㈀䐀㘀䈀㤀㤀㤀㘀䐀㌀㐀㠀㘀㠀㘀㐀㄀䈀䔀㤀䈀㤀㠀䘀㌀㈀㘀䘀䄀䄀䌀㤀㠀㌀䘀䈀㐀㘀䐀㤀㌀　䈀㤀䘀䘀㘀䄀䘀䐀㠀䐀　㈀䌀　䔀㌀　㜀䐀㌀䌀㌀㘀䘀㌀㜀䌀䔀䐀䌀㈀　䔀㐀䘀㤀　䈀㈀㄀䈀䌀㄀䘀㔀㠀䐀㔀䘀㠀㜀䐀䈀㘀㄀㜀䔀䐀㤀㤀䄀㈀㔀䔀䔀㘀㐀䘀㤀㐀㤀㘀䔀㔀㔀㘀䈀㔀㄀㜀䈀䔀䘀䐀㤀㄀㜀䔀㜀䘀㌀㌀䔀㐀䐀㔀䐀㌀䈀㘀䈀　䔀㘀㌀䐀㐀㜀㜀䄀㈀䄀㘀㘀䌀䄀㘀䔀㌀㄀䘀㌀䘀䄀㠀㠀㌀㔀㈀㌀䐀䐀㜀䐀㜀䌀㠀㄀㠀䐀　䐀　䈀䄀䐀㤀㔀䄀㤀䘀䈀䐀㘀㄀㠀䈀䔀䘀䐀㘀㔀㤀䈀㘀㜀䐀䘀䄀䐀䈀㤀䐀㜀㈀䐀䌀㌀䔀㜀㐀　䔀㠀㌀㐀㌀㤀㌀㔀㜀㌀䄀㘀䔀䘀䌀䄀䔀㐀㜀䔀㄀䐀　㌀䐀䄀㌀㜀㄀㠀㔀㐀　㄀　㌀䌀㘀㜀䄀㠀　㔀䄀䈀䈀　㌀䌀　䈀㠀䐀䘀䄀㐀㔀䌀㜀㐀㤀䈀㄀㈀㜀䌀㤀䘀䐀　䘀㠀㔀㜀䐀㘀㌀䌀　㌀䄀㤀㌀㈀䈀㜀㄀䈀　㌀䌀㐀䄀㘀㌀䌀䄀䌀䄀㤀㜀㤀䈀㜀䌀䔀䘀　㌀㄀䌀㘀㔀䘀㄀㜀㔀㘀䌀䌀㜀㌀　䌀㘀䘀㐀㔀䘀㈀㐀䔀㔀䐀㔀䄀㘀㌀䈀㠀䄀䈀䌀㈀䔀䘀㌀䄀䄀㐀䐀䘀䔀㜀䌀㌀䔀䐀㌀㈀䘀䔀㄀䘀　㘀㔀㤀䌀　䄀䌀㘀䈀䐀䌀㘀㌀㄀㤀㄀㤀㄀㤀㘀㌀㐀㈀㄀㘀㌀　䔀㌀　㜀䌀䄀㐀㈀㤀㐀㠀䐀䔀䔀䈀䌀㘀䄀㈀䌀䈀䔀㔀䘀㜀㤀㄀㜀㌀䐀　　㜀䄀㄀㔀㤀㐀䈀㔀㈀㌀㌀㘀㤀䄀㤀䄀㠀䌀䔀㄀㠀䐀䐀㔀㤀䘀㘀䈀䈀䘀䐀　䈀　㤀㌀㐀䐀䈀䈀䄀㘀㘀㔀㌀䌀㤀㘀㌀㈀㄀䘀㠀䘀㠀䘀䐀䐀㘀䔀䐀㈀㌀　䐀㤀㘀㠀䘀㈀㐀㤀㌀䌀㤀　㈀㜀㤀　　䔀䈀㌀㠀　䄀㄀㠀㌀䐀㄀㈀㤀㔀㈀䐀䄀㄀㄀　䄀䘀㔀㐀䔀䘀䐀㐀㘀㐀㤀㠀㠀㤀㈀　䐀㈀㔀㈀䔀㐀䄀㐀㔀㄀䄀㈀㄀䌀䄀䌀䌀㠀䐀䘀㔀㈀䐀　䄀䈀㜀㄀䘀㔀㤀䔀㔀㔀㜀㄀㔀㠀㔀㄀䄀㈀䌀　䔀　䄀㐀㔀㈀㠀㐀㐀㌀䄀㄀䌀　䄀㌀䐀㠀㐀　䌀㤀䐀䐀䄀㜀䐀䐀䄀䄀㈀　　㜀㐀㈀䄀㤀㘀㐀㘀　㈀䌀䈀㄀㄀㤀㜀㘀　䄀䌀䈀㌀㘀㄀㌀㘀㔀　䈀䌀䈀㈀㔀㌀㄀㜀㤀㘀㈀㘀䄀㔀㈀㘀䄀㤀㄀䈀㐀䌀　㤀㐀䔀䈀㔀㔀㈀㘀㄀㠀䌀䘀䔀䔀㘀䌀㐀㈀㐀㌀䌀䔀㈀㜀㐀䐀䘀䈀㈀㤀㜀㈀㤀䄀䌀䈀㄀䐀　䈀　䔀㐀㄀㤀㤀䄀㌀䘀㄀䄀㔀　䄀㈀㐀　䄀䐀䄀㌀㘀㄀　㤀㄀㌀㈀㔀㈀䐀　㈀䔀㌀㠀㠀䘀　䌀䐀䌀㔀　䄀㘀㜀㔀㌀䔀㔀䐀䐀䌀䐀　㔀䔀䔀䐀　䐀䘀㠀㤀䐀㈀䄀䔀㌀　㈀㌀㈀䘀㔀㔀㔀㠀㤀㐀　㤀　䄀䐀㄀䌀㜀㔀㐀㐀㜀㄀䈀䔀䄀䈀䐀䌀㔀䄀䄀䈀㜀㘀㠀䘀　䔀㤀㔀㐀䘀㄀䘀㌀㤀㔀䔀䘀　㜀㄀㔀　䘀㜀䘀㤀䐀　䄀㐀㜀㜀㜀㜀㐀㠀䈀㈀䔀㤀㐀䘀㔀㜀䈀㈀䄀㘀䐀㤀㐀　㄀䌀䌀䐀㠀㌀䌀㄀䈀㘀䐀　㐀䔀䄀　䌀䔀　䄀㤀㐀䄀䐀㌀䈀㘀㈀㄀㜀䐀　㠀㤀䐀䈀䈀㄀㔀䐀㘀㄀䔀䈀䄀㐀㜀䈀䔀㘀㘀㠀㜀㌀㈀䐀䐀㔀䘀䔀䘀䔀䐀䄀　䈀䄀㔀㠀䄀䐀㘀㜀㤀㄀㔀㈀㔀䘀䄀䈀䔀㜀䐀㐀䘀㤀㐀　㤀䘀㐀　㌀䄀䄀䌀　㈀㠀㘀　㘀㐀㐀㘀㌀㠀㄀䈀㈀㐀䐀㘀㤀㐀㜀㌀㐀䘀㈀㘀䔀㤀䌀䔀㠀㄀㐀㌀㈀㤀㔀䔀䔀㤀䈀䌀䔀㠀䔀䐀㈀㘀䘀䈀䔀䄀㔀㜀㌀㐀㘀䈀䘀䄀䄀㔀㐀㌀㠀䔀䌀㠀㌀㔀㌀䐀㌀㌀㐀㌀㠀㔀㠀㈀㈀㌀䄀㄀　㤀䐀㠀㌀䌀㘀䔀䔀㘀䌀㠀㜀㘀䈀䘀䈀䈀䈀䐀㤀䌀㤀㔀䄀㐀㜀㐀䐀㄀㈀䘀㘀㜀㔀䘀䄀㄀䘀䌀㄀䔀㔀㌀䔀㠀㘀䔀䈀䌀㈀䘀㌀㜀䐀㌀㠀　䈀㘀䐀㘀䌀㌀㐀㈀䌀䔀㄀㐀㔀　㌀㐀䄀䘀㈀㜀㄀㠀㐀䐀㔀䐀㌀䈀　㐀䔀䄀㔀䌀䔀㐀㤀䈀䔀䐀㤀㈀㤀䄀㐀㜀㤀㤀㘀䔀㈀㐀㄀㌀　㔀䘀䄀䔀㜀䈀㄀㌀䄀㔀㔀䐀㘀㌀䈀䔀㄀㄀　㐀㜀㐀䔀䔀䔀䐀㐀㌀㄀㤀㔀䐀䄀䘀㜀㜀㔀㌀㠀㌀㐀䘀䘀䘀䔀䈀䈀䔀㜀䐀䐀㤀㘀㘀䌀　㘀䌀㤀㄀䈀䄀㜀䘀䄀䄀䘀䔀㌀㈀㘀㠀㄀䌀㘀㜀㤀㔀㤀䘀㔀䘀䔀䄀䘀㜀䈀㜀䘀䄀㜀㘀㤀䔀㔀㔀㌀䔀㜀䄀䄀㌀㄀㄀䔀㠀㜀䐀䈀䄀㜀䌀㜀㘀㄀㄀䐀㌀㐀㜀㌀䐀㌀㤀㌀㌀䌀㐀㌀㜀㈀㠀㤀　㔀䘀䄀㘀䈀䌀䐀䘀㄀䄀䌀䄀䐀㐀䌀䈀㤀㜀䘀䌀㄀䐀㘀䔀㤀㔀　䈀㔀㌀䄀㜀䐀㐀㘀㄀䈀䐀䈀㘀㔀㌀䘀䔀䔀㘀䐀䈀　　㤀䘀㐀　㌀䄀䄀䌀　㈀䌀㘀　䐀䘀㜀䔀䄀㘀㠀㐀㜀㄀䘀㘀㄀㄀㤀䐀㄀㤀䐀㜀㈀䄀㐀　㌀㘀䌀㘀䈀㤀㔀㜀㈀㜀㔀㠀䐀䈀䔀㜀㔀䌀䘀䘀㜀㘀䔀㠀㜀㠀㌀䐀　䄀　　㄀䌀䐀䈀㌀䈀㈀䄀㄀䘀䈀㠀䔀㔀㠀㄀䄀㤀㤀㔀㌀㤀㔀㜀㌀㄀㐀䐀㜀㄀㔀　䄀㠀䈀䐀㤀　㜀㤀䐀㘀㠀䈀㄀㌀㔀䔀䘀㈀㘀䄀䔀䄀㌀㈀㘀　㤀㤀䘀　㘀䔀䐀㈀䌀㠀㤀䈀䈀䌀　㈀㐀㌀䌀㌀㘀䐀㤀㤀䐀䄀䘀䘀䘀䄀㌀㌀䘀䐀㠀䈀㄀䐀㈀䈀　　䘀㔀㠀䄀䈀　㄀䔀㔀㘀㌀䐀㘀㐀䌀䌀㌀㈀㈀㐀㠀㔀䌀㜀㠀䌀㘀㘀䘀㐀㠀䌀䘀　䔀䘀䄀䌀䐀䘀䈀䔀䔀䈀㜀㜀㘀䄀㤀䌀㈀㤀㤀㈀㠀䔀䐀㌀䄀㌀㌀䔀㐀㤀䈀䔀䘀　䔀㔀㈀䐀㤀㜀㠀㄀㤀䔀䐀䄀㌀㜀㜀㔀㌀㠀㌀㐀䘀䐀㈀䌀䈀㐀䌀䌀㄀㘀㤀䔀䌀䌀㔀䄀㄀䈀䌀㤀䐀　䄀㜀䘀䈀㈀䔀㈀䔀㔀㌀㜀䘀㔀㜀㘀㘀䘀䌀㠀㔀䘀䘀㐀䐀㄀㄀䈀㠀䐀㐀　㜀㤀䘀㘀㔀㐀䘀䐀䔀㘀䐀㐀㠀䄀㔀㤀㐀㤀䘀䄀㌀䌀㈀䌀㤀㠀㌀㤀㌀㘀㌀䄀㔀䔀㄀䈀䌀䄀䌀㈀䌀䈀䐀㐀䐀䈀㄀㄀　㈀䘀㄀㐀㘀䄀䈀　䌀㌀㤀㤀䐀㔀㈀㔀䘀㘀㌀䘀㔀㈀㜀㤀　㌀㈀㤀䈀㐀䔀䈀㜀㘀㐀䘀㐀㌀㔀㠀㘀㔀㔀䌀　䐀　㄀㠀㐀䔀䔀䐀䔀㈀䈀䐀㌀䄀㠀䄀㌀㌀䐀㈀䄀　㌀㐀㔀䔀㐀㘀㐀䈀䐀䘀䄀㜀䘀㄀㌀㌀㄀䈀㘀䐀㜀䌀㌀㠀㔀䔀䐀　䈀　䐀䐀　㜀䔀䐀㄀䘀㌀䄀䈀䌀㤀䈀㐀䔀㠀䐀㄀㄀　䔀㜀䔀㄀㐀㐀㜀䔀䄀㔀䈀㜀㘀䄀㄀㠀䐀㤀䐀㠀㘀䘀䐀㐀㔀䔀㜀㔀㜀䘀䔀㌀䘀　䐀䔀䈀㘀㤀䘀㤀㐀㔀䘀㈀㄀㜀䈀㠀㐀䈀㠀䌀㤀䘀䔀䄀䘀䘀㤀䈀㘀䐀㜀㈀㘀㠀䐀㜀㠀䘀㠀㘀䐀䘀㤀䐀　䌀㐀㤀㔀㌀䐀㐀䘀㤀䘀㤀㐀㔀㄀　䈀㐀䄀㌀䌀㈀䐀䐀䔀㜀㘀䔀㔀䄀㈀䔀㘀䔀　䄀㄀㈀　䐀㘀㔀㐀㜀㘀䄀䐀㈀㠀㜀㘀　㘀㐀䈀㜀㌀㐀㌀㌀䄀㜀䄀㘀㄀㤀䔀䌀㐀䘀䄀䐀㜀䈀䘀㠀　㤀䄀㐀㌀㄀䐀䔀㠀㄀䌀　䈀　　䄀㤀㠀䌀㤀㐀㈀䈀䘀䘀䄀㔀㔀䈀䐀䐀䄀䘀䄀㄀㌀　㠀㌀䌀㌀㜀㐀㄀㄀㠀㘀㘀㜀㐀㌀㈀㤀㐀㘀㔀㠀　䌀㌀㔀㈀㜀䌀䈀㈀䔀㤀䘀䄀㠀㄀㌀㌀䐀　㤀䐀　䄀　㈀㠀㘀䔀㤀㌀㌀㌀䈀㔀　䐀䈀㄀㤀䐀㈀䔀㄀䔀㄀　䐀㠀㔀䔀䄀䈀㔀䘀䄀䈀䘀䐀㜀㐀䌀　㄀㘀　㤀㐀㜀䈀㤀㄀䔀㈀䈀䐀㈀䈀䌀㐀　䐀㈀㈀　䈀䌀㐀䈀㈀㘀㈀䈀䔀䘀㔀䌀㘀㠀㔀㘀㘀㌀㜀㘀䔀㈀䘀䘀㜀㔀㜀㔀䄀㈀㠀　䘀㘀㘀㐀㌀㌀㜀䐀㐀䈀䌀㄀㌀䌀䈀㈀䈀　䄀㄀㜀䌀䄀㜀㔀䄀㘀䄀䔀㜀䔀㌀㠀䐀㄀䐀㄀㤀㜀䄀䘀䌀䌀㐀䄀䐀㌀䘀㘀㌀　㄀㄀㠀㌀䌀㔀㄀㐀䐀㐀䔀䐀　䈀䄀䐀㌀䈀䔀㌀䌀䐀䌀㤀䌀㘀䈀䄀㘀㠀䈀䈀㔀䐀㘀㌀㔀㠀　㔀㠀䌀㜀㜀㔀　㜀㐀　䐀㈀㠀㄀䈀㘀㤀䈀㠀䄀䌀䔀䐀㤀㤀䔀㈀䈀㈀㄀㘀㠀㘀㈀㔀㌀㠀㔀䘀䘀㜀䐀㄀㘀䐀䐀　　㠀䐀　㐀䐀䄀　㜀　㘀㌀㐀䐀　䐀㄀㌀䌀㄀㘀㠀䈀䌀㐀㠀㘀㄀㌀㠀䌀㌀㐀㄀　㌀㐀㐀㌀㄀䔀䌀䄀㜀䘀䌀㠀䐀㔀㠀㘀㤀䄀㠀䌀㠀䈀㈀㠀　㐀㌀䌀㄀㔀㠀㘀䈀䈀㌀䘀㘀㘀㘀㠀䐀䌀䐀㌀䄀㄀㤀㘀䘀㘀䌀㠀䌀㌀䄀㜀㐀㈀䔀㤀㐀䄀㜀㜀㐀㌀㐀䐀㠀㄀䔀䐀㘀䘀　㜀㐀㐀㐀䐀㘀䐀㔀㜀㜀㔀㤀䄀㔀㔀㜀䄀㤀㌀䈀䐀㄀䔀䘀㜀　㠀㔀㠀㤀䄀㈀䐀㘀㐀䘀㔀㈀㈀㐀㄀䐀䔀䌀㄀䌀䈀䔀䌀䄀䄀䄀㤀㌀㄀㈀䄀䘀㔀㐀䈀䔀䔀㠀䈀㐀䐀㌀䄀䐀䐀䄀㐀䔀㌀䘀䄀㈀㜀䌀㌀䄀䔀䈀䘀㌀㔀䈀䄀䈀㜀䌀䘀㈀䈀㈀㄀㐀㐀　䌀㜀㜀㐀㠀䄀㠀䐀㜀㘀㈀㌀　䄀㘀㠀㄀䘀㈀㠀㐀㄀㐀䘀䈀㌀㜀㈀㌀㐀㐀㘀䄀䘀䘀㄀㘀㘀㤀㔀䐀㤀䐀䐀㈀䄀㄀䈀㘀㜀㔀㘀䔀㘀㈀䄀㤀䐀㈀䌀㈀㄀䘀䐀䌀　㌀㜀䌀䄀䘀㔀㈀㄀䔀㔀䌀䘀䔀㌀㐀㠀㔀㤀㤀㄀㜀㠀䄀㈀㈀㌀㘀㤀㤀䌀䄀㜀㜀㠀　㤀䔀㜀㤀㤀㌀㘀㤀䄀䔀㤀䐀㤀㐀䐀䘀㄀䈀㠀　㄀㈀㄀㠀㜀䐀㤀㌀䐀䐀䐀䔀䄀䐀㤀㤀䔀䌀䐀䄀䌀䘀㔀㐀㐀㐀㜀䌀䄀䔀䘀㤀㔀䘀䄀㤀䘀㌀㈀㐀㌀㔀㤀䔀䐀㘀䌀䐀䘀㠀㌀䘀䄀䔀䈀　㈀㤀㐀䘀㜀㌀㘀㔀㔀㌀䐀㌀䔀䐀䈀㐀㘀㤀䘀䘀䌀㄀㠀䐀䐀㠀㤀䄀㈀䄀㌀㜀䈀㠀㘀䘀㈀䌀䌀㔀㈀䘀㈀㐀䔀㤀㔀㄀㔀㐀㈀　㘀㘀㄀㄀㘀㠀䐀㌀㔀㔀㄀䐀䌀䔀䘀㘀䄀䔀䐀䐀䐀㠀㤀䄀㈀䈀㜀䔀䄀䌀㐀㜀㈀䐀㄀䄀㘀䘀䌀㈀㐀䌀䈀㜀䈀㤀㔀㤀䘀㌀䄀㤀㘀㘀䈀䈀䐀㘀㈀㔀㠀　㔀㐀䌀㘀㐀　䘀㌀　㤀㐀䄀㌀䌀㈀㔀㄀㤀　㔀㄀䔀㄀䌀䈀䘀㐀㤀䌀㠀䄀䄀㔀㤀㌀㔀　㘀㄀㜀㐀㈀㈀㄀䄀䈀䄀䘀䈀㤀䌀䄀㔀㘀㌀䌀　㄀䌀㘀㄀㔀㠀䔀㜀　䌀　㜀㈀㌀㄀䈀㄀䐀㌀㌀㤀䔀䘀㈀　㜀㠀䐀䌀䄀㜀㐀㄀㠀䈀㘀䔀㘀䌀㜀　䄀㤀䈀　䔀㠀䘀㄀　䄀㌀㌀㄀䘀䈀䔀㤀㠀㈀㌀㐀㌀䔀㘀㜀㈀䐀㌀　㤀㠀㤀䌀䄀䈀䔀䘀㔀䐀　㄀㐀䄀䄀㜀䘀　䐀㌀䘀䘀䐀㈀㄀㌀䘀䐀㘀䔀䈀㐀䔀䄀䐀㐀䌀㌀䔀㠀㤀䄀㄀㈀㔀䐀㄀㄀䄀䌀䐀㠀　㤀㠀䄀䌀㌀㌀䈀　㜀㈀䔀㄀䔀㌀㠀㤀䈀䌀㤀㜀䐀　㐀㄀㌀㘀䔀㘀㐀㜀䐀䔀㠀䄀　㈀䌀䘀䐀㘀㠀䈀㐀㌀㐀䌀䄀㤀䐀㄀㔀㜀䔀䔀䄀㐀㘀䐀㐀㔀㐀㈀㘀㌀㐀㔀㘀㌀䄀㌀㈀㠀䄀䌀䔀㔀䐀㤀㈀㌀㈀㌀䈀䌀㜀㈀䄀㘀㘀　㔀㠀㘀㘀㤀䈀㘀䈀䔀㠀㤀䔀䘀䘀䌀㌀㘀㠀㤀㘀㌀䈀䔀䈀㔀䈀㈀㈀㈀䘀㄀㐀㐀㐀㜀䌀䄀䔀㘀㔀䄀䈀䐀㜀㜀䈀䌀䘀㈀㤀㤀㌀㈀㌀䐀　㠀㜀䘀　㘀　㜀㌀㜀㈀　㌀䌀㔀㄀㜀㄀䐀㘀䈀㄀㌀䐀㜀㐀䈀㠀㜀㠀䄀㈀䔀㌀㜀䐀㈀䄀䈀㜀㐀䐀㤀㔀䘀㘀䌀㌀㜀㔀㘀䘀䈀䄀䌀㈀䈀䔀㐀䔀䘀㤀㈀　㈀䌀㘀㜀䈀䌀㐀㠀㄀䈀㠀㌀䌀　㌀䌀㘀䈀㌀䐀䘀㤀䐀㄀䐀䐀㠀㤀㔀㈀䘀㘀㐀㜀㈀䄀㐀䘀䔀㐀䘀㤀㐀　䘀䐀㤀䔀䄀㔀㘀䘀㌀　㈀㐀㠀䐀䌀㘀㤀䄀䄀䘀㔀㈀㜀䐀䈀㐀㜀㌀㈀㜀㜀䄀㠀㠀㜀㔀㘀㘀䈀㤀䘀䌀䐀㠀㘀　䘀䘀䈀㘀㠀㤀䔀㔀㔀䄀䄀䘀㄀㠀㔀㘀　㄀䌀㌀䔀㠀䔀䌀䔀䌀䌀㄀㠀㠀㤀㔀㤀㈀䘀䔀㘀㐀䄀䈀㠀䌀䔀　䈀䌀䘀　㜀䐀䌀䘀㠀㄀㌀䈀䐀㔀㜀㘀㔀䘀䈀㌀㌀㐀㐀㠀㌀䄀㈀㈀㄀䈀䈀㈀㄀㠀䄀㤀㔀　㔀㐀䄀䔀䈀㈀䘀䄀㔀㌀䘀䔀　　㄀䐀　㄀㄀㘀㘀㌀䈀㘀㔀㔀　㘀㤀㠀㜀䔀㘀㈀㈀　䔀䘀䐀䌀䄀㜀㌀㐀䐀　　　䔀㠀䐀㠀㌀㐀䐀　㐀㜀䄀䐀㜀㈀㐀䐀㐀㤀䘀㠀䐀　㤀㈀㐀䐀㈀㜀䘀䄀䐀㔀㤀䐀䄀㐀㘀㠀䐀㘀䌀䄀㠀㐀㈀㄀㄀㠀㘀　㔀㠀㄀㠀㈀䐀䘀䘀䌀㠀䄀䄀䈀䐀㌀㤀㘀㘀䄀㌀㔀䐀㘀䐀䌀㈀㜀䔀䔀䐀䄀䄀㜀㜀㘀㌀㜀㤀䐀　䘀㄀㤀䔀㘀㐀㄀㔀䐀䈀䈀㔀㔀㈀㘀㔀䘀　㜀㘀㠀㔀㜀㔀㤀㔀㤀䔀䘀䈀㐀㤀㠀䄀㤀㄀㔀㤀㈀㄀㘀䘀䈀㜀䔀㤀㌀䄀㌀㘀㤀㐀䄀䈀㔀㤀㘀䈀㠀㌀㠀䘀䄀䌀㐀㠀㜀䄀䄀㈀㈀㌀䔀䘀㄀䌀䄀　㜀　㜀䐀䘀㘀㔀㘀䌀㜀䘀㐀㐀㐀　㌀㐀㈀䌀㈀㜀㌀㐀㄀㤀䄀䈀㈀㌀䐀䘀䈀㔀䈀䔀䈀㠀㤀㠀䔀㤀㐀䄀㄀㤀䘀㌀䌀㄀㤀㐀䘀㘀㔀䘀㐀㌀㌀䄀䌀㤀㤀㄀㤀㔀　䐀䘀㈀䌀䐀㜀㤀䌀䘀㄀㘀䄀㌀䄀䘀㤀㜀㄀㘀㌀䄀䈀䔀䄀㜀㜀䈀㄀㔀㔀㘀䐀䌀㤀䈀䐀䘀　䘀㤀䄀㄀㜀䌀䄀㤀䈀㄀䔀㘀㄀㈀䈀䐀㐀䈀㜀䄀㤀䄀䐀䌀㠀㤀㜀㘀䌀㌀㜀㈀㈀䐀䄀䄀䘀㤀㌀㘀䐀㘀䌀㔀　㔀䐀㘀　㜀䈀㐀䘀㘀䈀　　䄀㄀㠀　䄀㜀㤀㌀䌀䄀㜀　㐀㜀䔀䈀䘀䌀㌀䘀㌀㜀㌀䄀䐀䐀㈀䔀㠀㐀㜀㔀䌀㘀　㤀䐀㠀䐀䔀䔀䈀䔀㘀䐀䐀䐀㈀㌀䈀㈀㐀㘀䘀㜀䔀䄀㘀䘀䐀䐀　㤀㠀㔀㌀㐀䈀㘀㘀䔀㐀䘀䘀䈀㜀㌀㐀㘀㠀㐀㠀㘀㐀㤀䘀㤀䘀䌀㠀䘀䈀䔀䘀䘀㤀㄀䈀㔀　㜀㐀䈀㐀　㜀㐀　㤀㌀㐀䐀䔀㌀䄀㤀䈀㈀㔀㘀㜀㔀㘀䄀㈀䈀㄀㔀䘀䐀䐀䄀㤀㠀㤀㄀㄀㘀㤀㄀㤀㌀㘀䐀㔀㔀㔀䐀㌀䄀㤀㠀䌀㤀䐀㔀　㤀㜀㈀㘀䌀㜀䐀䘀㠀㔀䐀䘀㐀䐀䌀㜀䈀㘀㈀　㌀　㌀䔀㔀　㜀㌀㌀䘀㌀䐀䘀㤀䈀㄀㠀㤀㈀㄀　㌀㤀䘀㘀䄀䈀㠀㠀䘀䈀　㘀㔀㈀㘀䘀䐀㤀㠀㌀㔀䈀䈀㄀㌀䔀䐀㤀㘀䔀㔀㔀䄀㤀　䐀䌀䈀䘀䐀　䘀䄀　䌀䌀㌀㈀䄀㘀　㌀㈀㤀䄀㌀㄀㘀㈀䔀㔀䘀㈀㘀㐀㈀䌀㔀㌀䔀㠀䈀䔀䘀㈀㌀㄀㌀㈀䔀　㤀㠀㔀㈀䔀䔀㐀㐀䈀㌀㠀　䄀㤀㘀䌀㠀䄀㤀㠀䘀㘀㜀㘀㘀㈀㤀䈀㄀䌀㐀䌀㘀䘀䔀㜀㔀㤀㌀㤀䌀㔀㘀㘀䔀䄀䌀䄀䘀㈀䌀䄀㐀㜀䌀㌀䘀㄀䐀䄀　㄀㐀䐀㤀㘀䄀䐀㐀䌀㈀㜀㐀㐀　䈀㘀䈀䘀㐀　䈀䔀㠀㘀䄀䐀㈀㐀㌀䔀㌀䘀䌀㤀㤀䈀㌀㄀㄀䔀䐀䐀䔀㤀䈀㐀䌀䌀㐀䈀䄀䌀　䄀㐀㠀㌀㤀㄀䈀䄀㐀㤀䈀㠀㜀㔀䌀㌀㌀䄀䄀㔀䘀㘀㘀㈀㄀㄀䔀㐀㠀㤀㘀㔀䄀㤀㄀䘀㠀䘀㌀㈀㔀㘀㐀䌀䌀㐀䐀䔀㘀䈀㠀㤀㐀䐀㄀㄀　䌀䄀䈀㠀　䄀㄀䘀㈀㔀㌀㜀㜀㠀㔀䈀　㄀㈀㈀㠀㈀㤀䄀㤀㔀䌀㄀㐀䈀䌀㌀㐀㈀䔀䈀㜀㈀㤀䌀㈀䄀䈀㄀䐀㠀䐀䐀㤀䐀㤀㈀㘀㔀㠀㈀㌀㔀㜀㈀㈀䌀㈀䄀䌀㌀　㤀䐀㐀㔀㘀䘀䌀㄀㜀䄀㄀䌀㐀㔀㄀䔀䔀䈀䘀㠀㘀㔀䘀䄀䐀㘀䌀䘀䘀㐀㐀㄀㜀㜀㠀㈀㐀䔀　㌀　㔀䘀　䔀䔀　䄀　㜀㜀䐀　㐀㐀䌀　㘀䔀䈀㜀㔀㘀䘀䔀㠀䔀䔀　㄀䌀䔀䐀䐀㌀䔀䘀䄀㈀㄀㘀㜀㈀㠀䄀㔀㜀㜀䐀㌀㜀㜀㈀䘀䈀　䌀䄀㄀㔀䄀㐀㌀㌀　㠀䐀㄀㘀䐀䔀㌀㤀㤀㠀䄀㤀䈀䈀㔀㜀㜀㜀㐀䈀䘀㄀㠀㘀䐀㔀䈀㤀䌀䘀㤀㌀䄀㔀㐀㘀㤀㐀㜀㘀㠀㐀䐀㔀㌀䐀䔀㔀㄀㌀㈀䐀㈀㌀㄀䘀　䘀㈀㠀㘀䘀㈀㌀　㄀䔀㄀䄀㔀㜀㘀㜀　䈀㤀㔀䈀䔀㠀㜀㄀　㌀䔀㐀䌀䔀㔀䈀㌀䐀㐀㈀䄀㈀㔀䘀㈀㠀䘀㔀㔀㐀㘀䌀䔀䌀　䐀䌀䄀㄀㌀䌀䈀㠀䌀䐀㤀㜀䄀㜀㠀㤀㌀㈀㌀䄀䐀㈀䄀䄀䌀㌀䔀䐀㠀䔀㔀㔀㌀㠀䘀䈀䄀䈀㈀䌀㈀䔀䐀㜀䘀䈀㈀㠀䈀㄀㜀䐀㔀䈀䘀䘀䘀䐀㈀䄀㈀㌀䌀䄀　䔀㜀㘀䔀㔀　　㌀䐀㜀䘀䐀㐀㈀䄀䈀䘀㌀㜀䘀䈀䔀㠀㌀䐀㌀㜀　㜀䐀㠀㐀㔀㜀㤀䐀䄀䌀㄀䔀䄀㔀㤀㈀㘀㠀㐀㄀㐀䘀䄀㄀䘀䐀䘀䈀㄀㜀䌀㠀㜀䔀䄀㤀䄀㜀㐀䐀　㐀䔀䄀㈀㌀䐀䐀㤀䄀䘀㤀㔀䔀㘀㌀䄀䄀㘀㈀䘀䄀㌀　㄀䌀㌀㈀䄀㘀　䔀䄀䐀䌀㄀㔀䐀㈀㤀㠀䐀䌀䈀䐀㈀㘀　䐀㌀㌀䐀䄀㄀㐀䐀䐀䄀䔀䘀䈀䘀䌀㘀㔀㌀㐀㠀㌀䄀㤀䄀㄀㘀䌀㤀㠀䌀䔀䔀䔀㄀䔀䌀㈀䄀㄀㐀㄀䄀㄀㠀㜀㄀㠀䈀㄀㜀㈀䔀㐀㜀㌀㔀㜀㤀㤀㌀㐀㌀㈀　㐀㠀㌀㄀䘀䐀㐀䘀㘀㘀䌀䌀㔀䌀㄀㜀㜀䌀䘀㔀㈀䈀䌀㠀㐀㠀䐀㄀　㠀㠀㠀㜀㤀䘀䌀㔀㐀㌀䌀䔀䘀㠀㤀䘀㌀䐀㈀㄀　㠀㠀㠀䔀㠀　䄀㤀㈀䈀㐀䈀　䄀㐀㐀㄀㤀㠀䌀　㐀䔀䈀㠀㄀䐀㄀㄀㐀㈀䌀䐀㠀䐀䔀㈀䐀䌀䘀䐀㘀㈀䈀㐀㘀䐀㜀㄀䐀䈀㄀䔀䈀㜀㤀䘀䔀㈀䐀䈀䔀䐀㄀㐀㈀㘀㐀䄀䔀㐀　䈀㤀㔀　䘀㌀䄀㤀㐀㄀䘀㄀䄀䐀㜀㘀㐀　䈀㤀㔀䈀䔀㐀㜀㌀䔀㤀䐀䘀䐀㈀　䈀䐀䐀㄀㔀䔀㘀䈀㘀㘀　㠀㠀㌀㄀㤀㄀䔀䄀䌀㐀㜀䈀㐀䘀㤀䈀䄀䌀㠀㈀䄀䐀㘀　㌀㠀㘀　㜀䔀㄀䔀㔀䌀䌀䐀䌀䈀䐀㜀䄀䌀䘀䔀䐀㠀䐀䔀䔀　䈀䔀䘀䐀㄀䐀㤀㄀㄀　䄀　㠀　㠀　㐀䔀䐀䐀㜀㄀㐀㈀䘀㠀㈀㘀㐀㤀㔀㔀㔀䔀䔀㈀䄀㤀䐀㐀䐀㠀㈀䈀䔀㘀㘀　㤀㠀㈀㜀　䄀䔀㌀䈀㔀㠀㠀䔀䈀　㤀㜀㈀䄀㈀䐀䈀　㠀　㘀䔀㌀䘀㄀㔀䐀䈀㐀㤀䈀㐀㈀㜀㌀䈀䌀㘀㈀䄀　㘀㈀㤀㘀㔀䘀䄀㌀㈀㄀䄀㌀　䄀䌀　㈀　㘀䄀㐀䔀䔀　䄀㘀㤀䘀䌀㌀㐀㌀㘀㄀䄀㈀䈀　䐀㌀㤀䐀䄀㄀㐀㌀㄀㌀㈀䐀㈀㔀㤀㘀　㄀㄀㐀䔀䈀㘀㜀㈀㌀㘀䈀㈀䄀䐀䈀䔀㔀䈀䄀㈀䈀　㜀䌀㐀㐀㠀㌀㜀䐀䈀㤀㐀䐀䔀䘀䐀㈀㜀㤀㘀㤀䄀　㘀䔀㐀㜀䌀㌀䘀䐀㔀㜀䔀㤀㔀䈀㌀䄀㌀䐀㈀㌀䈀䔀䈀㌀㄀㄀㠀䘀㔀㠀䘀䐀䔀㄀㘀㜀䘀㄀㤀　㌀㌀䈀㌀䌀䄀㐀䔀㈀䄀䈀㈀㐀㘀䐀㄀㘀䐀䄀㌀　㌀㠀㄀㤀㌀䈀䄀㔀䘀㠀䌀䈀㘀㈀䐀㤀䔀䄀㘀㘀㠀䘀㜀䈀㈀㐀䄀㘀㄀䐀䔀䄀䌀㜀㠀　㤀㌀㜀㄀䔀㄀䄀䐀㜀㘀㐀　䈀㤀㔀䈀䔀㜀㜀㐀䘀㈀㠀㄀䘀㘀㘀㄀㐀䈀㠀䘀㈀㜀㐀㠀㔀䔀䌀　䔀㈀㄀㠀䌀　䐀䄀䐀㤀㔀䔀㤀䘀㈀㌀㐀䈀㤀㜀䐀䐀㌀㘀䄀㠀㔀䔀㤀䌀䌀㄀䌀㤀㜀䐀㜀㠀㔀㔀㤀䔀㔀　㤀㤀　㜀　㄀　䔀　䄀䔀䈀㌀㜀　䐀㘀䔀㤀　㄀䔀㔀㠀䐀㘀䈀䌀㐀䌀䄀　䔀㄀䘀䐀㤀㈀㐀䔀䄀　㜀㈀㄀㌀㈀䌀䈀䔀䄀㔀㤀䄀㘀㜀䐀䘀㔀䐀䐀㔀䄀䄀䈀䔀䌀䄀㜀㤀㠀㘀䐀㜀䄀㌀䈀㠀㤀䘀㘀㘀㐀　㠀䘀䐀䌀䐀㘀䐀㌀㐀䐀㌀䌀㜀䘀㜀㤀㄀　䐀䌀䄀　㠀㄀㠀㔀㘀　㄀㐀㌀㈀㌀䄀䄀㜀㌀㔀㜀䘀㠀䔀䈀　䔀䐀䘀䈀䐀䈀䘀䌀䐀䈀㌀䄀䘀㔀䈀㜀䈀䐀㐀㄀䐀䐀㐀　㘀㜀䔀㄀㔀㜀䔀䐀㜀䈀㄀㔀㐀㔀㄀䘀㌀㄀䘀㠀䘀㈀㈀㘀㤀㘀㈀䄀㔀䐀䌀䐀　䔀䐀㜀䌀㔀䐀㤀䐀䐀　䌀䔀㜀䔀䄀䄀䐀䈀㌀　䔀䄀䐀䔀㜀㌀㄀䈀㈀㜀㤀㘀㈀㔀　㠀　䔀䈀㜀䐀㜀㐀㈀㄀㜀㤀㔀㌀㈀㌀　㘀㤀㔀䔀㤀䌀㈀㔀㘀䈀䌀㜀㜀䄀䌀㐀䘀䄀䔀䈀㤀㘀㄀䐀㌀㤀㈀䘀䘀㤀䈀䘀䔀㤀䈀䈀䌀㠀㌀㈀㈀㄀㌀㐀㜀　　䈀䔀䄀䈀㘀㐀㄀　㠀䌀䘀㌀䄀　㘀　㤀㜀䌀㌀㌀䘀䌀㄀䔀㌀㠀䐀㜀　㤀䔀䈀　㌀䌀㌀㈀䄀㘀　㌀㈀䐀㘀㄀䐀䘀䄀䐀㔀㔀䔀䄀䈀㔀䈀㐀䌀㄀㔀䘀䈀䄀㤀䘀㔀㠀㈀㈀䌀㘀　㌀㈀㈀㘀㠀䄀㘀㔀㌀㘀䐀㠀㘀　䄀㤀㤀㐀㠀㔀㐀䈀㠀䘀㌀　䌀㠀　㈀　㘀䌀㔀䔀㠀㈀䈀䄀䌀㘀㐀㠀　㔀㈀㄀䄀㄀㈀㐀㘀䔀㄀㈀䘀䄀䌀䐀㐀　䈀㔀䌀㘀䈀㘀㌀　㌀䐀䘀㘀㈀㘀䘀　㌀䘀䈀䌀　䈀㐀㤀䘀䔀㤀㌀㌀䌀䈀　㌀䐀䘀㔀㐀㤀㔀㤀䔀䔀㈀䐀㠀㈀䐀䈀　㐀㔀䌀㈀㔀䔀䌀㤀㌀䐀䌀㜀䐀㄀䄀㠀䐀㄀䔀㜀䄀　㠀䘀㐀㄀㄀㤀　䄀㌀㌀䐀㐀　䐀㌀䐀㌀䐀㄀㄀㔀㜀㤀䄀㄀㌀㐀㄀㘀䄀㄀　㌀䄀㄀㄀䄀　䔀䌀㤀䐀㘀䘀䔀㌀㌀㜀䔀　䄀䌀䄀㌀㤀䘀　㜀䔀䐀㘀㐀䌀㜀㔀㠀㠀䘀㘀䔀㄀䈀㜀㘀㠀䐀　䐀㄀㤀　㘀㔀㔀䌀　䐀　㐀　䈀　㄀㌀㘀㈀䘀䐀㌀䘀䄀㌀䔀㘀㌀㤀㄀㔀㠀㜀㔀㈀㄀㈀㠀䄀䘀㜀䄀䐀㜀䄀　㜀㤀䈀㤀　䐀㜀䔀䄀㌀㜀㌀䄀　㄀䄀㘀䘀㐀㈀㠀㄀䔀䔀㤀㌀　䐀　䌀㈀䄀䌀䌀㔀䘀䘀䐀㄀㐀䄀䄀㔀㈀㌀㤀䐀㄀䔀䐀㘀㠀　　䄀䄀㜀　㄀㐀㈀䘀㌀㜀㈀　　㤀䈀㤀䘀䔀㈀㐀㠀　㜀㐀㄀㄀㄀㠀㠀㔀㈀㄀㄀䔀䄀㄀㔀㌀㘀䌀䄀㤀㔀䄀㜀㌀䘀䐀㘀䘀㜀䄀䌀䐀㜀㘀㌀䌀㜀䄀㜀㄀㄀䈀㈀㠀㌀㄀㔀㔀㘀　㔀㤀䈀㄀䈀㄀䄀㈀㌀㤀㐀䘀　㈀㘀䈀䄀䐀㠀㐀䄀㠀䔀㔀　㜀䌀㐀　䔀㤀㐀㈀㄀㜀㠀　䌀㈀㜀㄀㈀㌀䈀䐀㐀䈀㜀䔀㜀䐀㐀䈀㌀䈀　䄀䐀䔀䐀㐀㤀㔀䄀㘀㈀㤀㐀䘀㔀䈀㈀㤀㐀䐀㜀䌀䈀䈀㐀㐀䔀㤀䄀㔀㤀䌀㔀　㜀㐀䌀㈀　　䈀㤀㈀㤀䌀　　䘀㤀㐀䔀㜀㔀㜀㈀㤀　䌀䔀㈀㐀㌀㜀　㜀䔀㔀㤀䔀䘀㘀㈀㤀䌀㄀㠀　䐀䘀䌀㄀　㘀㐀䐀　䘀㌀㘀䔀㤀㐀㜀㤀㤀䐀䘀㈀䔀䘀㐀䄀㔀㘀䐀㈀䈀䌀䐀　䄀䄀㘀㌀㘀　㈀䘀㔀㐀䘀䔀䐀䌀䌀㔀䔀㜀䘀㐀㄀　㄀㜀㘀㤀㔀䈀䄀䔀㈀䈀㜀㔀㤀㄀㐀㤀䘀䐀䈀㐀㌀䈀䐀㤀䘀㄀㘀䄀䄀㔀　㄀　㘀　䘀㈀䄀䈀䌀䔀䔀㘀㐀㐀㜀䘀㈀䘀㠀㜀㐀㜀䐀䘀䘀䄀㠀䘀㈀䐀䘀䔀㤀㘀㐀㐀㜀㄀㠀㌀䌀䐀㠀䈀䘀㤀㔀䄀䄀䌀㜀䌀㔀㌀㘀䈀㘀㤀㌀㄀䐀䐀䐀䄀㔀㈀㠀㜀㤀䘀䈀㤀㌀䘀　　䐀䔀䌀䐀䐀㘀䄀䔀㔀䔀㄀　㠀䄀䈀䈀㘀㐀䔀㘀䌀䄀㠀䈀㈀䄀㄀㄀䔀㜀㜀㔀㐀㜀䄀䄀䘀㔀㄀䐀㤀㐀㘀㄀㜀䄀㈀　㌀㠀䐀㐀㄀㄀㔀㌀　㌀㐀　䄀䔀㠀㐀㤀㈀䄀㄀㌀㜀㘀䄀㐀㘀㤀䔀㌀㄀㈀㠀㈀䌀㠀㐀䘀㔀㌀㤀䌀㄀㄀㜀䔀䐀㌀㘀㠀㘀㄀㈀㈀䔀㠀㌀　㤀㐀　㄀　䐀㄀　　䄀㄀㘀䌀㄀䔀　㜀㐀㈀䈀㐀䄀㌀䌀㔀㠀㄀䄀㐀㘀㌀䘀㄀䄀㔀　㌀䌀䌀㔀㤀㄀　㘀䌀㈀㤀䔀㠀㠀㐀䘀㔀䄀䔀㤀㔀㠀㠀㠀㜀㠀㘀　㄀㈀㘀㠀㐀㐀㜀㠀㌀㄀䄀㌀䔀㄀䐀䔀䐀㜀㤀　㈀㘀䈀㜀㔀㄀㐀㄀㄀　䐀　㠀㠀㘀㤀㔀㐀㔀　㤀䘀㠀㜀㈀㠀㔀䐀䘀䌀㔀䔀䄀䈀㌀㠀　䘀䐀㌀㌀䈀　㠀㐀䈀㌀㜀䄀䌀㜀䈀䈀㈀䐀㔀䈀䈀䐀㈀㐀㐀䔀㠀䐀　㠀㤀㘀㤀䌀　㌀㌀䄀䐀䄀㈀㔀䄀㄀㤀㈀㤀㤀䐀㔀㈀㌀㘀䌀㔀䔀㄀㌀㘀㐀䄀㜀㐀㤀　㘀㠀㤀㠀䘀㠀㄀㌀㤀㔀㘀㔀㤀䐀㠀㄀㄀䘀䌀㈀䔀㤀　　㤀㔀䌀䐀䔀㘀㜀䄀䔀䔀䄀䔀㈀䐀㄀㜀㔀㤀䔀㔀㘀䌀䌀䄀　䐀䘀　㜀㘀䈀㌀㔀㘀㄀㜀㤀䘀㌀㄀㈀䔀㘀䌀㤀㄀㜀䔀䄀㜀䔀䘀㔀㌀㄀㜀㤀㤀䈀䈀㔀㠀䘀䈀㤀㌀㄀䐀㄀㤀䔀䐀㘀䘀㔀㐀㌀䄀㄀　䔀　䔀㤀䌀㤀㠀䔀㠀　䌀㄀　㄀䔀㄀㠀㌀䔀　㔀㤀䄀䔀䔀㜀䔀䐀㐀䔀㜀㘀㜀䌀䄀㘀䘀䔀䘀㜀㜀䐀㌀䌀㘀䔀　䘀㌀㔀㤀㘀㤀㌀㄀䐀䔀㌀䔀㤀㠀䌀䘀㄀㤀䈀㠀㌀㤀㐀㜀㘀　㘀㤀㄀㘀䐀㤀㔀㐀㜀䌀䄀䔀　㄀㘀䈀䐀䈀㌀㐀㘀㜀㤀㘀㄀　㘀㐀䈀㜀䐀㄀䘀䄀䐀䈀　㤀䌀䐀㈀䔀䘀　䈀䄀㌀䌀㔀䘀㄀㘀㈀㔀　　㔀㠀䌀䌀䘀㈀䌀㄀㠀䔀㤀㘀㠀　㠀㐀䐀㘀䔀　㐀䌀㤀㤀䘀㤀䘀䄀㘀䈀㠀㜀㌀䘀㠀㠀䐀䈀　㘀㄀㄀㐀䄀㐀㌀㄀㌀㄀䘀㈀㌀㄀䐀㈀䐀　㈀㤀㜀䐀㄀㤀㐀㐀䄀㔀㌀䔀㄀䔀䌀㈀䔀㄀䈀䐀㜀㠀㠀䄀㈀㌀㠀䐀㤀䄀㐀䔀䘀㔀㘀䔀䐀䐀㔀䘀䄀䄀䈀㠀　㠀䔀䈀㜀䐀㐀䄀䌀䈀䌀㤀㔀㘀㤀䐀㘀㘀㘀㠀㠀䄀㤀㌀㈀㔀䐀㈀㌀㌀㤀㔀䘀䔀㔀㐀㈀㤀㄀䄀㠀䐀䔀㤀　　　䐀䐀㜀㌀䈀㈀㜀㐀䈀㤀㌀㔀㤀㔀㘀䐀㄀䈀䈀㜀㔀䄀䔀㌀㐀㄀㄀㔀㠀䌀䈀䘀㔀㠀䔀㜀㜀㜀㘀䄀㠀㔀㘀㌀㘀䈀㈀㌀㤀䄀㔀䈀䌀䐀㈀㈀䄀㜀䄀㤀䔀䘀㐀㈀㈀㐀䌀䔀㤀㔀㠀䐀㄀㜀㠀䐀㄀㤀㄀㄀䄀䘀㠀䄀䐀䈀　䌀䄀㈀㠀䘀㌀㔀㄀㠀㔀䈀㄀㠀㤀䌀㈀䐀㤀㐀㠀䘀㄀䌀㘀䔀䐀䔀䘀㠀䘀㔀䄀㐀㔀䘀㄀䌀䔀㐀䐀䔀㈀䈀䄀㈀䈀䌀㐀㤀㌀䈀䄀䌀㠀䔀䌀㜀㐀䈀㈀䄀㌀䔀㜀䘀㤀　㤀䈀䄀㤀䘀㤀䔀䔀䌀　㠀㄀　䌀　　䌀㐀㈀　䘀㈀䄀㐀䘀㤀䐀㐀䔀㜀㘀㈀㐀　䌀䈀㘀　䐀䈀䌀㔀䌀䔀䘀㘀䘀䄀㈀㌀㈀㄀䔀䌀䈀䌀㤀㠀䔀䔀䔀㔀㈀䐀㐀䄀䌀㜀䔀㔀䈀䌀㄀䌀䈀㤀㔀䌀㜀䌀㜀䄀䌀㜀㈀䄀䘀㠀㤀㌀　䄀㔀㄀䔀䘀䐀䈀㠀㔀䈀䔀䄀㄀㤀䌀㄀䈀䈀䄀㤀㔀㔀㤀㐀䘀䔀㐀　㘀㌀㔀　　㔀　䌀㤀㈀㤀䘀㠀䔀䘀䈀㐀㄀䘀䐀㤀䘀䔀䄀㈀䔀䄀㠀䘀　䈀䘀䐀　㘀䘀㠀䌀䘀㔀䄀㠀㔀㠀㌀䄀䐀䘀㤀㤀䔀㄀㌀㜀䈀㌀　䘀㌀䘀㠀䌀䔀䌀㌀䈀䔀㄀㌀䔀䘀　㤀㌀㄀㄀㈀㌀㄀㔀㐀㤀䄀㌀㠀䈀䄀㜀㌀㠀䘀䄀䄀㘀㌀㈀㘀䘀㐀䌀㠀　䐀㄀㠀㜀　䔀㠀䌀㘀　㐀㤀　䐀䔀㄀䌀䔀䈀㘀䌀䄀䐀㈀䈀㘀　㤀䄀㤀㠀䈀䌀㘀　㔀㌀㔀䔀䘀㐀㐀　㌀䌀　㜀㘀㔀㐀䔀㤀㤀㤀　䐀䈀䘀㈀㌀䔀㠀䘀㐀㜀㔀㠀㘀㠀㤀䐀㄀䐀㔀㘀㔀㌀㜀䔀䔀㌀㐀㤀䈀㤀　䈀䄀㠀㔀䄀䌀㠀䈀䄀䈀䌀䔀㐀㔀䔀㘀㘀㐀㤀䌀䔀䌀䐀㠀㘀㐀䈀㠀䈀䄀䐀　㤀䄀㔀䐀㠀䄀㜀㘀䄀㈀㤀䔀䈀䈀㌀㤀䐀㤀㌀㄀㌀䐀㤀䐀䈀㄀㄀䈀䘀䘀䈀㤀䐀䘀䈀㘀䈀㄀㄀㤀䌀㌀　䔀　䌀　㘀㔀㔀䌀　㠀䌀　㔀㈀䈀䌀㜀䘀㠀䈀䈀　㤀㜀㔀䄀㜀㌀㠀䄀㘀䐀㘀䌀㔀䔀㠀㔀㜀䘀　䌀㜀㤀㈀㔀㤀㠀㤀㠀䌀　䌀䈀㌀㈀㤀㐀㜀㔀㌀㌀㌀㐀䈀䔀㤀㘀㐀㐀㐀　㜀䔀䄀㔀䌀㐀㤀䌀㘀㘀䘀㔀㤀㐀㜀䐀㜀㄀㤀䐀䄀㌀㄀䌀㔀㐀㔀㄀㄀䘀㤀㜀㐀䘀䐀䌀䘀䔀䌀㠀㘀䄀㔀㄀㠀䄀㌀㔀㠀䄀䄀䈀　㠀䈀㈀䔀㈀㌀㔀䐀㔀䘀䐀㄀㘀㤀㈀㌀㘀　㄀䐀㔀㠀㜀䔀䈀　䌀䌀㘀　䐀㘀㔀㘀䔀㜀　䄀䈀㈀㔀䈀䄀㐀㘀㔀䔀㌀　㘀㤀䐀㔀㜀㔀㠀㘀䘀㌀　㤀㤀䔀㄀䈀㜀㘀㌀㘀㄀䔀㘀䔀㠀㌀㤀䌀䈀䄀㄀䘀㔀䔀䔀㄀䘀㘀㔀䄀䄀㘀㄀㔀㠀　㔀　䌀㘀䈀䘀㤀㄀㜀㔀䈀䄀㤀㜀㐀㐀㔀㔀　䈀　䐀㘀䐀䐀㐀㐀䘀䘀䐀㌀䈀　䄀㄀㠀㜀㔀㄀䐀㘀䄀㄀䄀㐀㐀㌀　㠀䄀　䄀㜀䄀　䌀㌀䄀㌀䈀䈀㘀　㜀䐀䌀䘀䐀䄀㤀䈀䄀㌀㐀㘀䄀㈀㄀㄀㄀䌀䐀㌀䐀䔀㤀䐀㄀㐀㄀㘀㐀䄀㔀㜀㄀㜀㔀　㄀㠀　䘀㠀䔀㔀㠀㈀䈀䄀㌀㠀　䌀㈀䘀㐀㜀㈀㠀㔀㠀㜀䔀䔀　㐀㠀㄀䐀㔀䌀䔀㘀㔀㈀㐀㄀䐀䔀　㈀䄀㘀䈀㜀㔀㔀䐀䌀㤀㄀䄀㄀䐀䔀䈀㘀䔀㔀㜀䄀㈀㤀䔀䄀㄀䈀㐀䄀　㌀㐀㐀㐀䌀　䈀㤀䐀㄀㈀㐀䔀䈀䘀㔀㌀䐀㄀㐀㤀䔀䈀䈀㠀㈀㐀㐀㐀㄀㜀䄀䄀䔀㠀䐀㘀㘀㘀㠀䐀䌀㜀㔀㘀㔀㘀㐀㠀㜀㜀䌀㈀䈀㌀䘀䔀㄀䌀䔀䐀　䘀㜀䈀䌀　㜀㠀䈀㠀㄀䔀䔀䔀㘀㌀　㤀㔀　㤀　䄀䌀㜀䔀㜀㈀㠀㠀䘀㈀䌀㈀䈀䐀　㄀㄀䈀㤀㔀䈀㔀㈀䌀䄀㜀㔀㌀䘀㤀㔀䐀㌀㈀䘀䘀㐀㄀䔀䘀䄀㄀䈀　㐀䔀㜀㜀㘀䌀䄀㄀㌀㘀㤀㐀㈀䈀㜀䔀㈀㠀㜀㠀䔀㈀䐀㔀㘀䘀䌀㌀䈀㈀䈀　䌀㤀㐀㤀䔀㐀䘀㐀䄀䌀㈀㘀㜀䈀䈀䌀　㤀䌀㔀　㤀㘀㔀䔀㤀䘀㜀䔀㌀䌀㠀䌀㄀䈀䈀㈀㌀㈀㘀㌀㐀㐀䔀㤀㄀䄀㔀㤀㤀㠀䌀䈀㔀㔀㐀㘀䄀㐀㘀㤀䄀㘀䌀䄀䄀㠀㤀㜀㔀㘀䔀䄀㄀㤀㌀㔀㄀㠀㔀㘀　㄀　㌀㘀㠀䐀㠀㜀䔀㄀㠀㄀㜀㄀䐀䌀㜀㄀㤀　㠀㄀㐀㜀㄀㜀㐀㘀䄀䐀㘀䘀䔀䌀㜀䔀㠀㜀䘀䐀䔀㐀㌀䄀　䐀　㔀㤀㔀㄀㜀㘀䐀㈀㠀　㘀㤀䈀㐀䐀㄀　㠀　䔀㠀㔀㈀㌀　䐀㄀㜀䔀㄀㠀㔀䄀㄀㄀䐀䐀㐀㌀　㤀䐀㄀㜀㌀䐀㐀㘀䌀䄀㈀㠀㐀　㜀䐀䌀㌀㐀　䐀　㘀㤀㄀䔀䈀　䔀䄀㤀　䄀䐀㌀䄀㤀㜀㤀㄀㠀㐀䔀䈀㜀䔀㠀㈀㤀䐀㠀㄀㠀㄀䌀㔀㜀㤀㔀㐀䔀㤀㐀　䈀　㌀䌀㌀䈀䔀㐀䔀䈀　㄀䌀㔀䔀䐀㐀㘀㤀㌀㄀㜀㈀䄀㜀䘀䐀㄀㄀㔀䔀㐀䐀㌀䄀䌀䈀㈀㌀　㠀䔀　䌀　䐀㄀䐀㌀䐀㘀㔀㠀㜀㈀䔀㔀㜀㜀㠀㜀㜀䔀䄀㤀䔀㔀㤀㈀㔀㘀㠀㄀㄀㌀䄀　㠀㤀䄀䘀䈀䘀㔀䐀䈀㤀㤀㈀䌀㠀㐀㈀䌀䈀㌀䈀㔀䔀㠀㤀㘀㄀㐀䔀㄀䌀㜀䈀䔀㄀㈀㤀㠀㄀㐀㌀䄀㌀㐀䈀㐀䘀䄀㤀㈀㤀　䄀㜀㌀䐀㄀㔀䈀㜀㌀㌀㌀　䈀䌀䈀㜀䄀䈀䐀䔀㠀䐀䄀䔀㐀　㘀䘀㔀㔀䘀㠀䈀㜀㈀㔀䘀㔀㠀㘀㈀㈀䘀㐀㜀䄀䐀㔀㘀㜀㘀䄀䌀㠀㐀䄀㤀䐀䐀㐀䈀㄀㌀　㌀㌀䄀䌀䘀㈀䈀䐀䌀䌀䈀䈀㔀㤀䌀　䄀䌀㘀㌀　䌀䄀䈀㠀　㜀㄀　㌀㐀㈀㌀㐀䘀㜀㌀㐀䔀㐀䄀㠀㠀㠀㘀㔀䔀㘀㐀㄀㠀㌀㠀㐀㔀㤀䄀　㤀㌀㌀䌀䄀㘀䘀㜀㄀㠀　㤀㈀㌀㘀䈀㌀㌀䌀㌀㔀䄀㠀䐀䔀　䘀㠀㘀㘀㠀㔀䔀䔀䘀䘀䄀㤀䌀㈀㐀㔀䐀㄀㠀䌀㠀　䄀䄀㘀㌀㄀㐀㄀䔀　䈀䔀㤀䈀㤀䐀䘀㔀䄀㔀䐀㌀䌀㐀㘀㤀㜀㤀㄀㜀䔀䔀　䐀㤀䈀䐀㈀㄀㜀䔀䐀㈀㜀㠀䄀　䌀㈀㐀㐀䄀㜀㠀㌀䘀䔀㠀㜀㐀䔀䌀㘀䔀䌀㠀㠀㐀䔀㄀䄀㠀䐀㈀㘀䘀㤀㜀䘀㔀䘀㘀䈀㜀㔀　㔀䔀㤀㐀㠀㄀㤀㄀䄀㤀　䈀㈀㐀㌀䔀㠀㠀䐀㤀㠀㜀㄀䈀㤀㔀䈀㠀㌀　䐀㄀㐀　㘀㄀䐀䐀㈀䐀䐀㌀䈀㤀㈀䌀㘀㈀䈀䄀䌀㘀㈀㜀㈀䄀㘀䐀㤀㘀㠀䈀㜀䄀㐀䘀䔀㠀䌀㠀䈀　䔀　䔀㘀䐀㠀䌀㔀㈀㜀䈀䘀㜀㔀　䄀㘀　㠀　㌀㌀㜀䈀䔀㈀㐀䈀䐀㘀䔀䌀㔀㄀䔀㔀䐀㠀㄀㜀䄀䘀㠀䄀㘀㌀㈀㐀䈀㤀㤀㄀㠀䄀䘀䌀䘀㘀㠀䌀㠀㌀䄀㐀䈀䌀䘀㈀㈀　䈀㄀㌀　䘀䐀㌀䔀㌀䈀㤀䔀䘀㠀䘀㘀㤀㌀䄀䘀䌀㈀䔀䄀㌀　㜀㄀㠀㔀㘀　㄀㐀㌀䄀㌀䄀䄀㌀㌀㜀㘀㠀䌀㘀䈀㜀㐀㐀㘀㐀㤀㘀㘀　㘀䄀㜀㔀㤀㌀䐀㄀䐀㤀㠀㄀䄀䌀㄀䐀㄀㤀㠀㤀䈀䐀䌀㈀　䄀㘀䘀㠀㘀䔀㠀㜀䔀㜀䄀㤀䌀䈀㐀㠀㠀㐀　㔀㜀䈀㜀䄀㄀㘀㠀㐀㜀䈀　㠀　㐀㌀䄀㌀㤀㄀䐀㤀䔀㄀㤀㐀　㌀㐀㤀䄀㜀䌀㔀䘀䘀㈀䘀䐀㜀㔀䌀㤀䘀䘀㤀䔀䌀䘀㌀䄀㠀㘀䄀㘀㠀䔀㄀䐀㜀䄀䄀㜀䘀䔀㠀䔀䘀㔀㘀　䘀㔀㈀㘀㔀㜀㤀㜀㔀㜀㔀㠀䈀㌀㔀䈀㐀㜀䐀　䔀䐀䄀㄀㘀㌀㔀䔀㠀㜀㄀㌀䐀㤀䔀㄀㐀䄀䈀㤀㈀㈀㜀　䐀㈀䐀䐀䈀䐀㄀㤀䔀䈀　　䌀㌀㈀䄀㘀　䈀䄀　㄀㔀㌀㜀㄀䘀㐀㄀㈀㐀䐀㜀䈀　䐀䐀㘀䄀㔀㄀㄀㄀䌀䌀䄀䐀䐀㠀䐀㤀㌀㜀䈀　㠀㌀㐀䔀㠀㜀㌀㤀㘀㐀㈀䘀㜀㔀㠀䌀㘀㜀㠀䌀㄀㈀䌀㤀　㜀㈀㄀䌀㔀㐀㘀㌀䌀䌀㠀㄀䌀㘀㔀㐀㄀㘀㌀　㘀　㔀㔀㠀㜀㘀㜀䔀䈀㠀䄀㘀䔀㜀㘀㄀䘀㌀　㈀㤀㔀㠀㈀䄀䐀䐀㘀㔀㄀㤀㄀㌀䌀㄀㈀䄀㤀䈀䘀䌀㄀㌀㄀㘀㌀㌀䈀䄀䌀㐀䄀　　䄀㄀㠀䐀㘀䐀㌀㈀㜀䔀䈀㈀䘀䌀䈀㤀㄀䐀㐀䐀㠀㠀䘀㘀㔀䌀㔀㔀䘀㔀䈀䄀㤀䘀㐀㄀䈀㈀㤀䄀䔀㠀䘀㔀㤀䌀㤀㘀䌀㐀㐀䄀㌀䌀㔀㌀䄀䌀　䔀䔀䐀　䄀㤀㌀㄀㐀㌀䘀㠀㠀㈀㠀䐀㄀䐀㘀䔀　㠀㠀㤀㠀㈀㤀㐀㤀㤀㐀㜀䐀㌀䔀㘀㈀㤀㜀㐀　㌀㌀　㐀㐀㈀㠀㠀㌀㘀䘀㔀㜀㄀䄀㤀䈀㌀　䐀㘀㤀㌀㄀㔀㈀㌀㐀㠀䌀䈀㜀䌀㈀䈀㜀㔀㐀　䘀䐀㜀　䈀㈀㘀㈀䈀㜀㄀㠀䄀䘀䘀㄀㔀䘀㌀䈀㄀䘀䈀䌀䄀　㤀㌀㤀㄀㘀㌀㔀䄀㈀㘀㘀㌀　㔀㜀㤀㐀㘀䘀㄀䔀䔀㌀䄀䄀䈀㈀㤀㠀䘀㐀㄀㄀㔀㌀　㈀㠀㄀㐀㘀㄀㈀㔀䄀　㌀䔀䔀䈀㘀䌀㜀䔀㤀䌀㤀㤀䘀㤀㘀㜀㈀䈀㠀㔀䌀䌀䌀䈀䄀䌀㔀䌀㜀㈀㘀　㤀䌀䘀㜀㜀㄀㈀䈀㄀㔀㤀䄀䐀䌀䄀㜀㌀㄀䌀㈀䈀䄀㘀　㄀　䔀㤀㐀㘀㘀䌀㠀㐀㐀㤀　㌀㐀㔀䘀䘀　㈀䌀㔀㠀㤀㈀㈀㄀㔀䐀䈀㤀㜀㤀㜀䔀䈀䘀䐀㐀䘀㔀㠀䄀㤀㌀㠀䔀㔀䘀㠀　䈀㠀㐀　㠀㐀䔀㠀䔀㘀㠀䄀䌀䈀　㄀䈀㈀㠀㔀㔀䐀㄀㤀䈀䘀䌀㔀　㜀㄀䌀㈀䌀䔀䌀　㌀㠀䈀㄀㄀䐀㄀䐀　㔀㈀䌀㠀㘀㠀㐀䔀㠀㌀䈀㘀　㘀䌀㤀㠀䈀㈀䈀䘀㐀㠀㘀㄀䐀䘀㄀㐀䔀䔀䌀㔀㘀㌀㐀㐀䐀䄀㤀䐀䄀䌀㄀㠀㘀㤀㘀㌀䘀㜀㄀䌀㠀㜀䐀䔀　㘀䌀㔀䔀䌀㘀㘀㔀㘀㤀㤀㈀䔀䔀䌀䄀　䘀㐀㜀㘀㜀㌀䈀㈀䔀㈀㐀䄀㠀㔀　䐀㌀䈀㐀㐀䔀㜀㜀㘀㤀㘀㘀㜀䈀㈀㐀䔀㔀㘀䘀㐀㌀㐀㔀㈀㌀㘀䈀　㘀㘀䐀㄀㈀㠀㤀㌀䘀㐀䔀䔀䄀䘀䘀㠀䘀㠀㘀㘀㈀䘀㤀㔀䌀䐀㔀㜀䄀䌀䄀䌀㘀䈀䄀㜀䐀䈀䄀䘀㔀㔀䐀䐀䈀㤀䌀㄀䄀㘀䘀䈀㄀䌀㜀㘀䘀䘀䌀䄀㤀㜀䄀㠀㤀䌀䘀䌀㔀㐀䌀䈀㐀㌀䄀䐀䘀㈀䘀䐀䔀䈀䘀䔀㤀㈀䄀㤀㌀㜀㌀㜀㤀　㜀䌀䄀㈀䔀䄀㘀䘀㄀㌀䌀㔀䔀㌀㘀㔀㄀㈀㈀㤀㜀㠀㌀䘀㐀㄀䘀㄀㔀䄀䄀䈀㤀㠀㈀䈀䄀㜀䐀䐀䄀䘀㔀㄀㤀㠀㜀䔀　䔀㄀㔀㘀㄀䈀䈀䈀㤀㠀㌀㤀䘀䘀䄀㜀㠀䈀㐀䔀䔀䘀䘀㐀　䔀㄀㐀䐀㄀㤀　䌀䄀䄀㠀　㠀㄀㈀䐀䘀㠀䄀㈀㤀㔀䄀䌀　　㤀㔀䐀㜀㜀㐀䈀㘀　䘀㈀㌀　㤀　㈀㠀㠀㐀䔀　㘀㘀䈀㐀㌀㐀㌀䄀㈀㘀㄀㌀　䌀䄀䘀㠀㤀䔀㄀㄀㔀㠀　䐀　㐀　䔀㈀㌀䘀䌀㜀䈀䄀䌀㄀䌀䈀䐀䄀　䄀䘀䘀㄀䈀㌀㐀䈀㘀㜀䄀㘀㜀㄀㘀䔀㄀㘀䐀䔀㘀㜀䄀㐀㔀䘀䄀㘀䈀　䘀㘀䈀㌀䌀䄀㈀䔀㠀㤀㐀㘀　䐀㔀㔀㌀䐀㘀㈀㤀㔀䈀㤀　　㠀䄀㘀㈀㠀㐀䌀㠀䘀㤀㜀䄀㜀䔀䄀㐀䌀㈀㐀㄀䔀㠀㘀　㈀㐀　㤀㤀䈀䌀㌀㔀㘀㜀㜀㘀㘀㌀㌀㔀　䔀㈀㄀䘀㐀䘀䐀㈀䐀䘀䔀䔀㘀㐀䌀㔀㐀㠀㄀䈀㘀㌀㌀㜀㜀㌀䈀䐀䐀㈀䔀㌀㜀䈀㔀䈀䘀㠀䈀䈀㠀䘀䌀㈀䔀㤀䘀㘀㘀㐀㐀㔀㌀䄀㤀㔀㔀㌀䌀䘀䔀䘀㔀㄀㄀㤀䐀　㈀㤀㈀㘀䔀䈀㘀㐀㐀㔀㔀㌀㜀䔀䔀㘀䐀㠀㘀㠀䄀㌀㐀䌀㌀㜀㜀㈀䘀㐀䐀㌀　䌀㜀䘀䄀㠀䘀㐀㘀䘀㘀㄀䄀䐀㜀㐀䈀䈀䐀㌀䔀㤀㘀䔀䈀　䔀㤀㌀䔀㠀㜀䐀䐀㄀　㤀㔀㌀㠀䈀㜀䈀㌀䔀䄀㌀　㌀㘀䘀㜀䔀㤀㄀䈀䘀䐀㈀㔀㤀䈀䐀㈀䔀䄀㐀㘀㠀䐀䔀䔀㤀䘀㜀㜀㈀㐀㤀㐀㐀㤀䄀㐀䔀　㔀䐀㠀䘀䘀㌀㔀㘀䄀䈀㈀䌀䌀䘀㤀䐀㜀㘀䈀䘀㔀㤀㘀㤀㈀㜀㌀䔀䈀㘀　䌀䌀　㜀㈀䔀䐀㘀㠀䄀䐀䄀㜀㌀䔀䐀䔀䄀䄀䘀䄀䐀㤀䐀㐀䄀㘀㄀㠀　㘀㔀㔀䌀　㌀　㠀㌀䌀㄀䐀　㤀㄀㐀㘀䔀㜀㈀㌀㜀㈀㘀䄀䘀㌀㐀㄀㈀㌀䌀㘀䘀㘀䔀㔀㌀㄀䘀䐀㜀䐀㠀㔀䔀䔀䘀䈀㘀㄀䘀㌀㠀䌀㘀䌀䔀䌀㠀䈀㠀　䄀㘀㠀㔀㔀㈀䄀㔀䔀㄀䐀㄀㌀㠀䐀㠀　䘀㐀㌀㈀㜀㘀　㌀㌀㄀䄀䄀㌀䐀䄀䌀㔀　䄀䔀㌀㈀　䈀䐀䔀䘀䄀㜀㌀䔀䘀䄀㜀㐀㤀䄀㔀㄀㠀䄀䐀㄀㤀㔀㠀㘀䔀㜀䔀㜀㌀㈀㌀䘀䄀　䘀䈀　㠀㌀㠀㐀㘀㜀䔀　㐀　㠀䌀䈀㠀䔀䐀㌀䄀䌀䐀䄀㐀䌀䔀㘀䘀䔀㘀㘀䘀䐀㐀㐀㐀㐀䔀䔀㈀㌀㤀㠀䘀䔀䐀㈀䌀䄀㔀㤀㤀㈀㔀㤀䘀䈀㤀㌀㄀㔀㈀㌀㘀䐀㐀䌀㌀㠀䘀䈀䔀㠀㌀䔀㠀䐀䘀䄀䌀㔀䘀䄀㐀䐀䐀䔀㄀　㠀䔀䐀䐀㤀䔀䄀䌀㐀㠀䘀䔀㄀㄀㐀䔀䐀　䌀㘀㜀䘀㔀　㤀㠀　㠀䐀㔀䌀㤀㌀㠀㔀㤀㤀㄀㜀㈀㔀䐀䄀䌀䘀㈀㤀㠀㘀㄀䄀㌀㠀䐀㌀㈀㜀䘀䄀䐀䈀㈀䔀　䈀䄀䐀䈀䄀䄀　㌀䔀㜀㐀　䄀㐀䐀䈀㌀㜀䈀㄀㔀㘀㠀㌀䌀䐀䐀㤀䐀㘀䔀䄀㔀䘀䘀㤀㈀㠀䔀㔀䌀㜀　㔀㤀　䄀㜀㤀㔀㌀　㌀㄀㜀㈀㐀㐀㌀　㌀䔀䄀㠀㌀䄀㤀䄀䄀㤀䘀䌀㔀㌀䘀䔀㈀䘀㐀䈀䌀䄀㈀㐀㔀㈀䘀　䌀䌀㘀㈀㔀䘀䄀㜀䈀䌀䔀䔀䄀　㜀　㤀䐀㜀㘀㠀䘀㘀㤀㈀㌀㤀䔀㌀䐀䄀䐀䈀㈀㔀㤀㔀䈀䄀㌀㜀䌀㄀䌀䄀　䈀䄀䔀䄀㘀㐀㠀䈀㌀㘀㜀㐀㄀㠀㔀㐀　㄀䌀㌀㠀㠀䘀　䘀㜀㔀㘀㔀㘀㘀䄀㤀䐀㄀䐀㄀㄀㄀㔀䘀䐀㠀㘀䔀㐀㔀䔀䈀䄀　䐀㄀䘀㘀㄀䔀　　䐀䔀㄀㠀㜀㔀㘀㈀㤀　㈀㜀䐀䈀䘀　䈀㜀㠀㔀㄀䌀㌀䘀䈀䌀䌀㜀㈀㔀䔀㘀䄀䐀㔀䐀䔀㄀㜀䈀㜀㘀㠀　㘀㠀䌀䘀　㈀㤀㘀㌀䘀㄀䔀䘀䘀䄀䔀䈀㜀㄀　㄀㘀㘀㌀　㤀㐀㌀䘀䄀㌀㄀䘀䌀䈀㈀䐀㘀㠀㔀㐀㌀䄀䐀䘀㈀㜀㤀㈀㘀䘀㌀䈀㤀䐀䄀䌀　㠀䐀㈀㄀㌀㄀　䄀䘀　䄀䈀䘀䔀䈀㄀䄀㜀㔀䈀㜀㈀㜀㈀䈀㠀䔀㄀㜀㜀㔀㈀㜀㈀䈀䐀㈀㌀㄀㄀㄀　㘀䔀㐀㈀㄀㤀䔀㐀㘀㄀㤀　䐀㌀㄀䄀㌀䔀㄀㘀㄀　䌀䄀㜀㠀䔀㘀䔀㜀㜀䈀㐀䘀㌀㌀㤀㤀䌀㠀㘀䐀㌀䌀䔀䄀　㌀　䐀㔀䘀㜀㜀㠀㤀㤀䐀　㄀䔀㔀㠀䐀䔀㌀　㤀䈀䔀㤀䌀㘀䈀㄀䘀㜀㜀㜀㤀㈀䘀䘀㤀䘀㘀　䐀㔀䈀㄀䈀㔀㔀㌀㠀䔀　䐀㄀䌀㔀㐀　㄀　㌀㈀㘀䌀䄀　䌀㐀㐀䔀㌀䌀㔀㘀㠀㤀㜀䐀㐀㄀㐀㘀䔀䔀䄀㄀䄀㌀㈀㜀䔀㄀㌀㠀㔀㔀䌀㄀䐀㄀䐀䐀䄀㄀㐀㈀㘀䘀㜀㤀㤀㜀㄀䈀䌀䐀㜀㈀䄀㜀䘀㈀䐀㜀㔀㄀㠀㠀㘀㤀㌀㄀㔀䔀䘀䈀㐀䌀㄀　㐀㠀㌀䐀㔀䔀㜀㘀䐀䘀䌀䔀䐀㘀䐀㐀䄀㤀䐀䔀㐀㤀㠀㘀㈀㤀　　㔀㐀䌀䄀䘀㌀　㄀䔀㌀㘀㘀㔀㈀㈀䄀㜀㌀㈀㈀㈀㤀䌀䐀䄀㠀䐀㘀䌀㜀㔀㠀㘀㤀㜀㠀䔀㜀㘀㐀䌀㐀䐀㤀㌀㌀䈀䌀䐀㜀㘀䄀䔀㈀㔀䌀㜀　䈀㘀㘀㤀㈀㤀䌀䈀㜀㠀䌀㜀　㐀㔀㌀䘀䐀㌀㈀㐀㄀　㈀㜀䌀㈀䈀㈀㔀　䌀㘀㈀䌀䄀㔀䐀䄀㄀㤀㜀㐀䈀䄀䔀㄀㈀㜀㐀䈀䄀㐀㈀㘀䘀㜀㤀㔀㈀䌀㘀㜀㔀㠀㈀䔀䈀㌀㐀㐀㐀㘀㠀㤀㠀䌀㘀䔀　㐀㄀䐀㔀䄀㌀䄀㠀㌀㠀㤀䄀㜀㐀䌀㄀䔀㘀䄀䘀㔀　㘀䈀㈀䔀㐀䌀㜀㌀䐀㄀䌀䈀㘀㌀㌀㌀㈀䄀㔀㤀䘀䘀㔀　䈀㐀㌀䈀㜀㐀䔀㌀㄀䄀䌀　㈀㠀㘀　㘀䌀䘀㄀㈀㠀㐀㌀㔀㌀㈀䈀㘀㌀㘀㌀㐀㌀䄀䐀㘀䐀䐀䌀䔀䄀䔀㌀　䄀㔀㐀㘀　䘀䌀㄀㄀䄀㄀䌀䄀䐀㌀䔀䈀㐀㜀㐀㜀㐀䄀䘀㐀㠀䄀㜀㐀㜀㈀㄀　㜀䘀㌀㐀　䔀㌀㤀㤀㘀㜀䄀㔀㄀䔀䌀㌀㔀䐀㔀㠀䄀㘀䔀䔀㈀　㔀㄀　㠀㔀㈀䔀㤀䐀　䄀䈀䈀㠀䐀䘀㘀㐀䄀㤀㠀㌀㈀䔀㠀㄀　䔀䌀䌀㜀㈀　㔀㄀䐀　䐀㄀䐀㤀䔀㠀㘀㌀䌀㐀㜀㘀㤀㄀䌀䈀㄀䈀㈀㄀㄀䈀䈀㜀㈀㤀㄀　㘀㐀㠀䄀㌀䄀㄀㄀㄀䘀䘀䐀㘀㈀䄀䄀䄀㤀㘀㠀㘀䌀䐀㌀㈀㈀䄀㄀䄀㐀㈀䐀䔀䄀㄀㌀　㠀䔀㔀㄀㤀䔀䔀䔀䈀㘀䌀䄀䄀㘀㘀㠀㤀㘀㤀䔀㄀㌀㈀㘀㌀䄀　䔀䐀㠀㈀䘀㌀䘀　㜀㘀䄀㈀䘀㠀㔀䔀䐀䄀䔀㈀㔀㐀䘀㔀　䘀䄀䘀䌀㔀㐀㐀㘀㔀㠀䄀㌀䔀㜀㈀㤀㔀䔀䘀㐀㈀㐀㈀䌀㘀㤀䐀　㘀䐀䄀㄀㤀䘀㘀㈀　㘀㠀㈀䘀　㔀䐀䄀䌀㜀䈀㈀㠀㌀㈀䌀䘀䈀㔀䌀䄀　㔀㈀㔀䘀㤀㐀㜀㘀䘀㜀㔀䄀䌀䘀㈀䔀䄀䄀㜀㌀㤀㔀䔀䄀䈀㘀㜀㌀㌀㔀㔀䘀㘀䘀䌀㐀㔀䈀䘀㠀㌀䄀䔀㈀㈀㌀㔀㠀㠀㜀㐀㈀㌀㐀䘀䌀䄀䐀　㤀㔀䔀㜀䐀㐀䐀䈀㄀㈀䐀㔀　㄀㈀䔀㈀㜀㔀䐀䐀㤀㜀䔀䄀㤀䔀䄀䌀㌀　䐀㈀㔀㐀㤀䌀㜀㐀㔀䘀䄀㠀䔀䐀䘀䘀䈀䄀䄀㤀䔀㌀䌀㤀䐀　䔀䌀䄀　㄀㌀㘀　䘀䈀䐀㄀　　䌀㄀㔀䘀䄀㌀䈀㔀䌀䄀㤀䐀㈀㔀㤀㘀㤀　㌀㜀䈀㈀㠀䌀䐀㤀㐀䔀䐀㄀㤀㈀䄀䐀㜀㤀䐀䄀䐀㌀㈀　㈀㐀㔀䔀㤀䔀䐀㔀䈀　㔀㠀䔀㔀㄀䈀䄀㜀㜀䐀㐀㜀㌀㤀㘀䌀䔀㐀䘀㐀㠀䘀㈀䐀㈀㈀䐀㐀㌀䈀㜀䄀㜀䘀㈀䌀㘀䈀䈀䐀䔀　䔀㜀䔀㘀㤀㄀㔀㠀㌀㜀㔀䄀䘀䔀㈀㜀　㠀㘀㠀䔀㜀㜀㜀　䈀㜀䐀㤀䐀㜀㐀䔀䄀㤀㠀㘀㔀㔀䌀　䈀㠀㈀䐀　䈀䔀䈀㘀㄀㤀㠀㄀㄀㈀䄀㈀㐀䈀㈀㈀䈀㜀㐀㜀㠀㄀䄀㈀䘀㤀䐀　䄀䘀䘀䈀㠀㐀䔀㔀䈀䈀䄀㜀䈀䌀㔀㘀㜀㔀㤀䄀䈀䈀㄀䄀㐀䐀㌀䈀䘀䔀䔀䌀㈀㌀㈀㜀㔀　㜀䌀㤀　䌀䔀㐀　䘀䈀䄀㄀㜀　䐀䘀㜀㘀㠀㐀㠀㠀䌀䐀㠀㜀㐀㘀㐀䔀䘀㜀　䐀䈀㈀䄀㈀䌀㌀䄀䈀䄀㌀㌀㈀㌀　㠀㌀㘀㌀䘀㜀䔀䘀㔀㈀䄀㠀㔀䌀䘀䌀䌀㠀㌀㠀㘀㐀㜀䄀㌀㠀䄀㈀䌀㄀　㤀䐀䐀㔀　㔀䌀䌀㠀㠀㤀㔀䈀㌀　㄀㄀䄀㌀㠀　䐀㤀㤀㤀㄀䐀䈀㌀䈀㄀㤀　䐀㤀㤀㐀㘀䘀䌀　䐀㈀䈀㄀䈀䘀䄀䐀㄀㔀㘀㌀㄀㈀㜀㌀䔀䐀䐀㔀䘀㘀㈀䄀䐀䄀㜀㌀㈀㄀䔀䄀䌀㌀㈀㔀㤀䄀㘀㌀㈀䐀䄀䌀㘀㈀䄀䘀㜀㤀㤀䘀㜀㈀㤀㠀䘀䈀䈀㈀䄀㈀䔀㤀㐀䔀䈀䄀㤀　䈀䌀䄀㈀㜀㈀㠀㤀䌀䔀䈀䄀䐀㌀䄀䌀䐀㄀㄀㠀㄀㐀㌀㈀㜀㐀㔀䘀㜀㜀㐀㤀㐀䌀䄀㜀䄀㔀㌀䄀㔀㌀㔀㌀㔀㠀㠀䘀㐀䈀㠀㈀䌀䄀㐀䐀㔀㌀䈀䘀㌀㘀䄀㘀䈀㌀㔀䔀㠀䄀㐀㜀㌀䌀䘀㐀㠀䌀䄀㤀䈀㠀䈀　㄀䔀㄀㐀䄀䈀䐀䔀䘀䔀㤀㘀䌀㠀㜀㤀㔀㐀䄀㤀䈀㈀䈀㘀䈀䄀㜀䄀䈀䌀䌀㘀䘀䈀㐀䐀㘀㔀㌀㈀㘀䌀㄀䔀㘀䌀㤀䈀㜀㈀㌀䘀䄀㐀䈀㌀䄀㘀　　䐀㔀䘀㘀㔀㤀㔀䌀㄀䄀䌀㄀䈀䄀䌀㠀䔀㠀㔀䄀㄀㐀㌀䌀㤀㄀䔀䐀䈀　㄀䌀㈀㘀䘀㄀㜀㤀㔀㠀䐀㤀䘀㠀㘀䔀㤀　䌀㔀䐀㔀㐀䐀䌀䘀㜀㈀䐀㠀㘀㔀㔀䌀　　　㈀䄀　㘀䌀䐀㌀䘀䄀㌀㤀㄀㄀䘀䐀䐀䔀䄀䔀䌀　䄀㤀㔀䌀䈀　䌀㠀㄀䌀䄀䄀㈀㄀㌀䐀㌀䔀㠀䄀㌀㜀䈀䌀㔀㘀㠀　㐀䔀㤀䌀㘀㜀㔀䐀㄀㠀㔀㘀㔀䔀䄀　䔀㤀㈀　䔀䔀䈀㐀㘀㤀㐀䐀㄀㜀　　䘀䌀㐀㤀㌀　䐀㜀㤀㠀㜀䌀䔀䌀䈀䌀㠀㐀䈀㠀㜀㜀㜀䘀㘀䌀㄀䄀䌀㌀䄀㠀㤀䐀㈀　䐀㌀㔀䔀㤀㠀䌀㜀㐀䔀㘀䌀䈀䘀㐀㔀䔀㌀㐀䐀㘀㜀㐀䐀㘀㠀䌀㜀㐀䈀㄀㘀䌀㘀　㌀㤀䌀　䈀䔀㄀䐀䘀㘀㤀㔀㜀　㈀䔀䈀㐀㔀䈀㈀㔀䐀䘀䄀䐀㌀䌀㤀　㤀㜀㌀㤀㔀㘀䈀㤀　㘀䘀㔀䈀㐀䈀㄀㤀䌀㐀㌀㤀㄀䔀䐀㐀䄀䔀㈀㐀㔀㜀䄀㜀䘀䈀㘀䐀㈀䌀㄀䈀㔀㤀㄀㔀㔀㠀䌀　㠀䘀㄀䐀㄀䘀　㌀㄀䌀　䈀䌀䐀㄀㔀䄀㔀䐀㔀　䘀䄀㘀㤀㤀㘀㜀䔀㠀䄀䄀㔀䔀㜀㤀㤀㤀㤀䌀㄀㤀㌀㜀㐀䌀㄀㐀㘀䐀㄀䌀㤀㄀　㘀㠀㜀㔀　㘀㤀㄀㐀䈀㄀㐀䘀㜀㠀㄀㔀㘀䈀㤀㈀䌀㘀㔀㠀㘀㐀㈀㌀䐀㔀㄀㘀㜀䐀㄀䄀　䐀㌀䐀䐀㠀㌀䄀㘀䔀㔀㐀䐀㄀㤀䐀㈀㔀㤀㔀㤀䄀䄀㌀㄀㌀㌀䈀䐀䌀䈀㤀䄀㔀䐀䄀䄀㤀䄀㔀㔀㈀䌀㄀䌀㐀㈀䌀㈀㐀䘀㠀䘀㜀㐀㐀䘀㠀㔀㜀䔀䌀䄀䄀㐀㔀䈀䄀㘀䄀䘀㔀㄀㜀䄀䈀㘀　㤀䔀㔀㜀䘀㠀　㔀㔀㐀㘀㤀䔀䘀㜀㠀㜀㜀㐀㤀㌀㤀㜀䈀㄀㌀　㜀㐀䔀䔀㐀䔀㈀㐀䈀㘀　㌀　㐀㤀㔀䌀䘀㜀㠀㄀䘀䈀㘀㔀㘀㠀㘀䌀䔀䐀䐀䄀㘀䘀㘀䈀㔀㠀䘀㤀䈀㘀㄀㄀㘀㌀　㌀㐀䔀㈀㔀㐀䘀㌀㄀䘀䐀㤀㤀㔀㤀㐀㜀㤀䔀㤀　㘀　䈀䌀㈀䔀䘀䐀㐀㘀　䔀䘀㜀㌀㔀㘀㠀䘀㌀㔀㘀䐀㤀䔀䄀㔀䘀　䐀㄀㤀㘀㠀䔀㐀䔀㈀㌀䘀䄀㄀䘀㜀䐀㄀䘀䘀㜀䘀㤀䐀　䘀㠀䘀㜀䐀㜀㘀䘀㌀䄀㄀㄀　䐀㄀䐀㈀㄀䌀㄀㌀㈀㠀　䌀㘀　䌀䔀㌀㜀㈀㔀㄀㤀㜀䘀㄀䄀㔀䄀㜀㌀㈀㔀䔀㘀　䌀䐀㈀䔀㈀㠀䌀㄀　㘀㈀㄀㈀䔀䐀㜀㌀㜀㈀䌀䈀㐀㔀㘀㄀㜀㤀㐀㠀䔀㜀㘀䔀㄀㌀㠀㤀䄀　䌀㈀㈀䔀䈀㔀䌀㘀䈀㠀㈀䌀㠀䐀　㌀㐀䔀䐀䘀㈀䘀䐀䈀㐀䈀㔀䄀㘀䘀㌀㘀䔀㔀䐀㄀㄀㜀㐀㐀䄀䐀䘀㜀㌀䐀㐀䌀䐀㈀㤀㤀㌀㤀㄀䐀㤀㐀䈀䌀䈀䘀䘀䘀䌀　䔀㘀㤀㄀䄀　䘀㐀㌀䐀㜀㘀䔀䐀㘀㌀㔀㔀　㈀㜀　䐀　䌀䄀䈀㠀　㤀㤀䄀㠀䔀㘀㜀䘀㜀䐀㘀㌀䌀㐀䌀䄀䐀㤀㐀　䐀䐀㄀㐀㄀㠀䈀䄀䘀㌀㌀㜀䔀㄀㜀䘀䐀䔀㔀㤀㘀㠀䔀㔀　㠀　㜀䐀㈀䈀㌀䄀䔀䐀䈀㠀㄀㌀㠀䌀㘀㜀㈀㈀䄀㘀㌀㄀䄀㔀㜀䈀䘀䄀㈀㤀㜀䔀㤀㐀䌀䌀䈀㌀䘀䄀㌀　䐀㠀㘀㔀㔀䌀　　　㄀㜀㈀䔀䐀䐀䈀䄀䌀㤀　㐀䔀䐀䐀䌀㌀㠀㜀㘀䄀㌀䈀㤀㐀㜀㄀䘀㠀㄀㜀　㘀㌀㔀䄀㜀䐀䄀䈀㜀㔀　㘀㘀㄀䄀㈀䈀㜀㘀　㘀䐀䘀䘀䔀㌀㜀　㜀䘀㠀䐀㔀㔀㄀䈀䌀㜀䈀䄀㘀㄀　䄀㜀䌀㤀㘀㄀㘀㤀㤀　䘀㌀㘀䘀㜀㌀㔀㌀㄀㄀䈀䘀㄀䔀　㌀㌀䐀䔀㘀䐀㘀㜀䈀㌀䐀㐀㄀㐀㔀㜀㈀㜀䈀䈀㤀䔀䘀㔀㠀䐀㈀㤀㐀㜀　㤀䘀㜀㈀㌀㠀㘀㔀㔀䌀　䐀　䘀㠀䐀䐀䐀䐀㈀㐀㐀䈀㈀㔀䐀㘀䔀䐀㜀㐀㈀㈀㤀㘀㐀㠀　㠀㄀䈀㜀㐀㈀　䔀㠀㐀䈀㔀㈀㌀㘀㘀㠀䈀㘀䐀䔀䌀㌀䈀㘀㠀㘀䈀㔀㈀䘀㘀䈀㘀㔀㜀㜀㔀䄀㐀㐀㔀㤀䌀㄀䐀㠀䈀　㔀㘀䘀䘀㤀㔀䘀䔀㘀㜀㤀䐀㠀䐀㠀㈀㄀㔀㐀㄀㐀㄀㈀㜀䄀㌀䔀㌀䌀㈀㈀㐀䐀　䌀㤀㘀㄀㘀㌀䐀　㔀䘀㌀　㌀䐀㘀㜀䐀䐀䌀䔀㜀䄀㄀䄀㜀䐀㄀　䈀䄀㄀䘀䈀㜀䄀㌀㌀㤀㐀㘀䘀㄀㌀䐀㐀㄀㘀㤀䘀䐀䈀㤀䐀㈀䈀㌀䄀㤀䌀㈀㐀㜀㄀㜀　㐀㔀㌀　　䔀㌀　㔀㠀㌀䔀㈀䔀䌀䌀㈀㤀㔀㈀㄀㜀䔀䌀㈀㐀㘀㈀㄀䔀䐀䈀㘀㌀㠀㌀　㄀䘀　㠀㐀㠀㔀㠀㈀㤀㜀㐀　䄀䔀㜀㈀䈀㔀䘀䄀䌀䘀㜀䘀䐀㌀　䄀䘀䌀㌀㄀㔀䌀㜀䔀䈀㔀㐀　䔀㘀䔀䈀㌀㐀㐀㤀䔀䐀䐀䐀㘀㠀㤀㘀㔀㄀㌀䌀㈀䌀㜀㔀䐀㜀㌀㘀䔀䄀䈀䈀䌀䐀䔀䄀䘀㜀䌀䄀　㐀㌀㐀㈀㄀㤀㜀䐀䈀㄀㘀㔀㘀㐀㌀㐀㘀　㔀㠀　㔀　䌀㌀㌀　㈀㜀㜀㌀㜀㠀㤀㤀㘀㄀䔀㈀㘀㠀㜀㐀䔀　䘀䄀䈀㠀　㜀　㜀㄀䈀䄀㌀㔀㘀㔀㠀㌀㘀㘀䔀㤀㤀㤀䈀䈀㘀䄀㠀㐀㜀䔀㠀䐀　㜀㘀㔀䘀㄀㤀䈀䌀䔀㐀䄀㘀㜀㌀䔀㔀䌀䐀䘀䌀　䈀䌀䌀　㄀㈀䄀　㐀䌀䘀㐀㄀䐀䈀䐀䔀䔀㐀㈀䐀㌀　䘀㌀㐀㐀㌀䐀䘀㠀㌀㔀㈀　䔀䄀㔀㜀　䈀㐀䄀㌀㄀㤀䈀㄀㔀㈀䘀㠀䐀䐀䄀㔀㌀　㐀㤀䘀㌀㄀䄀䄀㔀䔀㤀㔀䔀䄀䈀　䔀㔀㠀䄀㌀䔀㌀䄀㜀㈀䌀㤀㌀㘀䘀䔀䔀䐀䈀䌀㈀㔀䄀㘀䐀㜀㄀䐀䌀㐀䈀㄀䌀㜀䘀㤀㤀㠀䐀䄀　䈀㐀㐀㔀㌀　㌀　䄀㌀䘀㈀䌀㌀䈀䌀㘀䔀䈀㐀㠀䄀䌀䔀㠀䔀㌀㘀㐀䈀䈀䌀㜀㜀䈀㤀䔀䔀䈀㄀㠀㔀㄀䘀䌀㄀䔀㔀䄀䔀㌀㤀㤀䐀㄀䄀㤀䐀䄀䈀䘀㐀㄀㄀䘀㘀䈀㄀㤀㘀㤀㄀䐀㄀　㘀䌀㌀㈀䄀㘀　䐀　䐀䔀䈀䈀䈀䈀㐀㤀㌀䄀㌀　㈀㌀㌀㄀㤀䐀　䘀　㄀䌀㌀䘀䔀㠀㐀䄀㌀䘀㔀㔀䔀䌀䄀　㘀㌀㤀䐀䌀㔀㔀䔀㌀㠀䌀䘀　㄀䌀㈀㄀䌀　㔀䔀　㔀㌀䘀㌀䔀䐀㐀㘀䐀㘀㠀䔀㠀䄀㐀䌀䔀㌀㘀䐀㄀　㄀㘀㄀　㌀䔀㠀䔀䌀䔀䔀㘀䄀䐀㈀㘀䐀㜀㜀䘀㠀㌀䐀䌀䈀㔀䄀䔀䐀㘀㠀㄀䔀　䘀㘀㄀　㈀㌀䄀䔀䔀䌀䔀㜀䄀㤀㜀䈀　㤀䌀㈀㤀㈀　㈀䐀㤀㄀㔀䐀㘀　㄀㘀䘀㌀㈀㐀䌀㔀㜀䘀䄀䘀䈀㔀䐀䄀䔀㈀㌀㠀䘀㌀㠀㄀䈀　㌀㠀㔀㤀䘀㤀㜀䔀㐀㠀㘀㄀䌀㜀䌀㌀䈀䌀㄀㘀㠀㜀㌀㐀䈀䄀䌀䐀㔀㈀㜀㐀㤀㄀䌀㤀㤀㈀㠀䐀䐀㤀㤀㄀䈀䈀䔀㘀䔀㐀䘀䘀㈀㌀㤀㐀㜀㜀　㐀㤀㐀㄀䘀㔀䔀㌀㘀㘀㈀䄀㔀䐀　䌀䄀㐀䈀㤀㈀㠀䌀㔀㄀㄀㠀㔀㘀　㄀㐀㌀　㜀㘀㄀䌀㤀䔀㈀䔀䔀㈀㘀䈀䘀䄀㄀䘀䈀䔀䔀㄀䄀㌀㈀㘀䄀䔀㤀㔀㌀㌀㘀㈀㠀䘀䄀㠀䈀㘀㤀䔀㜀㠀䘀䔀㐀　㌀㄀䐀䐀㈀㤀　䈀䄀䌀䐀䄀䌀䐀㌀䘀䔀䄀㜀㈀䌀㐀㐀㄀㌀㤀䌀䔀㤀㄀㠀䌀䈀㈀㄀㘀㠀䔀䘀㘀䘀䘀㌀㘀䌀㘀㄀䌀䐀䈀䐀㌀䄀㤀䈀䄀㔀㐀䈀㤀㌀䘀䘀㘀㌀㔀㤀㜀㔀㌀䄀䄀㐀㈀䌀㈀㌀䌀㌀㠀㘀㤀㤀㐀㔀䌀䄀䔀䔀㈀㘀㌀㌀㌀㈀䐀㘀㌀㌀㠀㘀㔀㔀䌀　㠀　䔀䌀㘀䔀㌀㈀㈀㌀㘀㌀㌀䐀㘀㌀㔀　　㔀　䌀㤀䈀㤀䐀䐀　㜀䈀䌀　㜀䌀䄀　㘀　䈀䐀㈀䐀㜀㤀䔀䔀㈀䔀㌀㌀㔀㄀䌀㐀䄀㈀㌀䌀䔀㔀䄀䌀䔀㌀㜀㐀㈀㘀䔀㌀㘀䔀㈀䈀㔀㌀䐀㜀㤀㠀䔀㠀㔀䈀䐀　䐀䐀㔀䌀䄀㌀㜀　䌀㘀䈀㈀㄀㐀㘀㠀　䄀䈀㌀㄀䐀䐀　㘀䈀䌀　㌀㠀㈀㄀㄀　㔀㤀㠀㈀䈀　䈀㐀䄀䈀㌀㌀㔀㈀㜀㐀䈀㠀㠀㄀㄀䐀䘀䄀㠀䘀㘀䔀䄀㠀䘀㜀　㠀㤀㐀䌀㔀䔀㠀㜀㔀䘀䌀䐀㠀㤀㄀䈀䄀㈀㔀㘀　㌀䈀㠀㌀䌀㄀䌀㤀㌀㐀䈀㈀䘀㌀䈀㐀䄀㐀㜀㄀䈀㐀㌀㌀䌀㘀㐀䌀　䐀㔀㄀㈀㜀㤀䈀㈀䄀㘀䘀㐀䄀㔀㌀㌀㜀䌀　㤀䌀䌀　㜀㔀㔀㔀㄀㤀䌀㈀䄀　　䄀㄀㠀㈀㠀㔀㜀㤀㠀㄀㐀㤀㠀㤀㈀䈀䄀䌀䐀㜀㐀㜀㐀　㈀㄀䄀㈀㌀䈀䈀㈀㠀䘀㄀䐀䈀㐀㈀㈀㜀㠀㘀㜀䄀㠀㘀㔀䐀㐀㈀㄀㜀䌀㈀㈀䔀㐀䘀䘀㐀㌀㈀㈀㠀㌀㘀㄀㄀㔀㐀㔀㠀　㈀䌀㌀㤀䔀䄀　㈀䌀㠀㔀㌀㤀㐀㈀㠀　㠀䐀㔀㠀䌀㤀㌀㠀䘀䐀䄀㌀㤀㔀　䄀㔀㌀㜀㘀㜀㌀㐀㈀㐀㄀䄀㌀㜀䈀㤀㤀㘀㜀䄀㔀䄀㄀㄀䔀㠀䐀㤀䐀䄀㔀㄀㠀㄀䐀㠀䘀㔀䐀䄀㌀䔀䔀㈀㘀㄀㄀㘀㘀䔀㤀㄀䐀㔀㘀　䄀㌀㜀㌀䄀䌀㠀㜀䐀　䄀㄀㌀　㘀㠀䄀䐀䐀䈀㤀䐀㄀㤀㤀䐀㈀㄀䌀㜀䐀㠀䈀䄀㈀㄀㔀䈀䈀䄀㠀㐀䈀㄀㐀䘀䔀㄀㘀㔀㘀䐀㤀㈀䘀㐀㄀㈀䘀䐀㌀䘀㄀㤀䘀䄀䌀䘀䈀㈀㠀㤀㘀㄀㄀㄀　㈀㠀㘀㄀㈀䘀䈀㔀䘀㘀　㘀㠀㌀䈀䘀㔀㔀㄀䌀㘀䌀㐀㌀㜀㜀㜀䈀㄀㠀㜀㜀　㌀㠀㤀䄀　㜀　㐀㌀㐀㈀㌀䘀㤀䐀䘀㄀㌀㄀䔀㔀㤀䈀㌀䌀㘀㄀㘀䔀㄀㄀㠀䐀㈀㄀䄀㄀䐀㔀㌀㄀㔀䘀㌀㠀䌀䘀㈀䄀㄀㜀㤀䔀䈀䈀㈀䄀㌀䐀㤀㜀䔀㤀㌀㤀　䌀䐀㐀䈀㜀䘀㐀䘀䐀䘀㌀㤀㐀䐀㜀㐀㜀䘀㐀䘀䘀㘀㔀　䄀㘀䈀㠀䔀䔀㈀䔀㔀㌀㜀䌀䄀㘀㜀䔀䄀䘀㌀㘀䔀䄀䈀䐀䌀㔀㠀䈀䄀㌀㄀䔀㘀䘀㄀㔀㘀㌀㄀㔀䈀䔀㐀㄀䈀　㔀䘀㐀㜀㈀䄀㔀䌀㔀㠀䐀㈀䌀䌀㤀㌀䈀　䄀㘀㘀㈀䌀㤀䔀㄀㜀㈀䈀㈀䔀䌀䄀㠀㔀䄀䐀　　㈀䈀㄀㔀䌀䘀䔀㘀䄀䄀㄀㌀䐀䄀㌀䈀㜀㔀䔀䌀㠀䄀㜀䄀䔀㈀㄀䐀䈀㄀䐀㘀㔀㌀㌀㤀㤀䘀䄀䈀䘀䘀㠀㤀㈀䘀㄀䄀㌀㘀䐀㈀㤀䔀㘀㠀㐀䈀㘀䈀㔀㐀㘀䔀䄀㐀㜀㜀㐀䘀㤀㔀䘀㤀㈀䔀䈀䄀㌀㜀䐀䘀㐀䄀㐀㘀㠀䔀㌀㘀㜀㄀㘀䈀䄀㠀　㌀䘀㐀㜀䄀㔀䈀㔀䈀䈀㔀㄀䐀㘀㈀䌀䄀㄀䌀㤀䘀㌀㈀䄀㠀　㈀㠀㘀㌀䐀㄀䌀㜀㐀　㐀㌀䄀㈀䔀　䐀䄀䐀㘀䔀㈀㤀　㐀㤀䈀㠀㌀㈀㜀㌀㠀㌀䄀㠀㌀㔀䈀㐀㤀䘀㌀㄀䔀㤀䔀䔀㤀㘀　㌀䐀䔀㠀䌀㠀㄀㠀䔀㠀䐀㄀　　㌀䔀䄀㤀㜀㜀㈀㤀　䘀䌀䔀㌀䔀䌀㈀㜀㈀㄀㤀　䘀㘀㐀㌀　㐀㔀㌀㐀㜀㐀㠀㐀　㔀㈀㌀㌀䄀㠀㈀㠀䈀㌀䐀㈀䈀䐀　䐀䘀䈀㠀㘀㜀䌀　䌀㈀㄀㠀㐀䘀㘀䐀　䘀䔀䈀㜀䈀㌀䄀㌀㌀㄀䐀㤀㠀㠀䔀㐀㄀　㜀䄀㐀䘀㌀䐀㄀㤀㠀㠀䔀䐀㌀䈀㜀㌀䌀㘀䘀㄀䄀㘀㤀㘀㤀䔀　㘀䈀㄀㐀㈀䘀㠀䐀䘀㄀㘀䄀䄀䈀　䌀　㘀䔀㤀㌀䌀㠀䌀䐀㘀　㠀䌀䌀㘀㌀㤀㐀㄀䘀䔀䘀㄀㐀㤀䐀　䌀　㘀䄀㄀䄀㘀䔀㤀㘀㠀䐀㜀㈀䈀㈀䘀䔀䌀㘀㄀㠀㄀㔀㔀㘀㈀㘀㘀䔀㘀㈀㜀㄀䔀㌀㈀䔀㌀䘀㈀䐀㌀㄀㤀㈀㤀㄀䈀䘀㘀䐀䐀㌀　䈀䈀䄀㄀㈀㌀㐀㘀㘀㌀䌀㠀㄀㄀㈀䈀　㔀䌀㘀㔀㌀㔀㐀㄀䔀㜀䔀㔀㐀㈀䌀㘀㔀䘀㠀㔀㈀䄀䈀㔀䌀㘀㜀㈀㈀　䌀䄀㌀䔀㄀㈀㐀䌀䘀䔀㈀　㤀㤀　㌀䘀㔀㐀䈀䄀䄀䘀䐀㌀㌀㜀䐀㜀㈀䄀　䌀䐀䔀䌀㄀㌀䔀　㤀㄀䐀䐀䄀㘀䌀䐀㔀　䘀㄀䐀䘀㜀㘀㤀䘀䄀䔀䔀㘀䈀䌀䄀㜀䘀㘀䄀㘀㐀㜀㤀䈀　㔀㔀䐀䈀　䄀㄀　㄀䄀㄀䘀㔀㔀㌀䐀㄀䌀䄀　㜀㈀㐀　㔀㠀䐀䌀䄀㜀䈀䄀䄀　䌀䔀㤀㠀䐀㤀䔀䔀㘀㠀䐀㔀㈀㤀㤀㌀䔀㤀䄀㤀㤀䌀㄀䈀䐀䄀㘀㠀䌀㌀㐀㘀䔀㈀䘀㐀㈀䐀　䐀㜀㌀㤀㔀㈀䘀䌀䄀㤀䄀㜀㘀䘀㘀　㤀䄀䈀㜀䌀䘀䐀㌀㈀䄀㠀䔀䌀㘀㈀䐀㔀　䌀㜀㐀䈀䄀䔀䄀　䄀䐀䌀㘀䘀㔀㌀　䌀㠀㌀㈀䄀㘀　㘀㠀㜀㐀㔀㠀㌀䌀䐀㌀䐀　㜀㄀䈀䐀㔀　㘀㜀䌀䌀㐀㘀㘀㌀䌀㈀䔀䈀㄀䐀㌀㌀㄀㘀㌀䄀䈀䄀㄀䈀䘀䄀㌀㄀㤀䄀䈀㠀䐀㜀㜀㤀㜀㜀䘀㠀䘀㐀㘀䔀䄀䈀䘀䌀䈀㈀㈀㈀㈀㠀㘀㘀䔀㤀㌀㤀䌀㈀　　　㄀㠀㘀䘀䘀㔀䘀㐀䌀　䘀㄀㘀䔀䄀㄀䈀䐀䔀㠀㔀䄀䄀㘀㔀䄀㐀㠀㐀㜀䐀䄀㄀䘀㌀㈀㈀㐀㐀䔀㠀䄀㠀㌀㐀㌀㐀㠀㐀㠀㌀䈀䈀䔀㐀䄀㐀㄀㌀㘀䐀䄀䈀䔀䘀䔀㠀䈀㐀㄀㠀䈀䔀䈀㄀䄀㄀䌀䔀㐀㜀㐀㘀䄀㠀㜀　㐀㘀㜀䄀䔀䘀䐀㐀㜀㐀㘀㐀㌀䘀䌀㘀䌀㐀　䐀　㘀㘀㤀䈀㐀㌀㐀䐀䔀㜀㜀㔀㤀㈀㤀㈀䌀㌀䌀䘀䐀㌀䌀㜀䘀䄀㄀䈀㔀㌀㜀㄀㠀㤀䌀䄀㤀㘀䘀㤀㠀䄀㤀䐀㄀㜀㄀䔀㜀䔀㠀㜀䈀㄀䄀㌀䈀䈀㌀　㄀㤀㘀㈀㈀䔀㤀䔀㤀㠀䌀㜀䔀㌀䄀㈀㔀䔀㤀䄀㐀䈀㌀䈀㠀䐀䐀㄀㘀䔀㄀䔀䐀㘀䌀㤀㔀㈀㌀㘀䘀䔀　䌀㘀㤀㔀㜀㠀　䌀㌀䌀㔀䌀䔀㤀㔀䘀㘀㘀㤀㔀䔀㄀䔀㐀㔀㈀䄀䈀㌀䌀　䌀䄀㘀㜀㄀䔀䌀䄀㠀䔀㜀䐀㐀㠀㄀䈀䈀䄀㠀㔀䌀䄀㐀㌀䌀䄀䘀㔀㐀㄀㤀㘀䘀䄀㈀㜀䌀㘀䔀䄀䐀䈀㈀㜀䈀䌀　㔀䄀㠀䐀㈀䌀䈀㤀䌀䘀　䌀䘀　㈀㐀䄀㔀䔀䘀㜀䔀㤀㔀䐀㌀㈀䐀䄀䄀㄀䘀㘀㘀㘀㔀㔀㜀㔀䄀㜀㔀䈀䄀䔀㜀㄀䄀䌀㔀䔀㔀㘀㔀㤀䈀㤀䔀䌀䄀㐀㤀䘀䔀㄀䔀䈀㘀䐀㄀㠀㘀㠀䐀䈀㌀䄀䌀㜀㔀䌀䈀㠀㈀䈀䈀㄀　䈀䐀㔀㌀䘀㄀䐀䐀㘀㤀䐀㔀䐀䔀䄀㐀㘀㤀㐀㤀㄀䐀㌀　㈀㌀㜀䌀䐀　䄀䄀䔀䐀㄀　㜀㤀　㘀䐀㌀䔀㜀㐀　㤀䘀䌀㈀䐀㈀㠀㔀㠀䄀䄀䌀㔀䈀㈀㈀䐀㄀㔀　䐀䔀㄀㤀䘀䔀䄀㜀䐀㄀䔀㈀䘀㌀㠀㌀㔀㄀㈀㠀䔀䄀㈀䌀䐀䔀䄀䌀䈀䘀㘀䔀㌀䐀　䈀㈀㠀㤀㌀䔀㠀䄀㄀㘀䔀㐀㌀㔀䐀䘀䔀䐀䐀䐀䈀䘀㔀㤀㜀㐀㘀㐀䈀䌀㌀䘀㄀䌀㘀㜀㈀㠀䌀䘀䔀㌀䄀䔀䐀㄀䌀㔀䐀㘀䌀㜀䔀䄀㤀㐀䐀㔀䔀䌀䔀䈀㘀䐀㄀㄀㐀䈀㄀䔀䈀㜀䐀䈀䄀㌀㄀㄀㠀㌀䌀㐀䘀㜀䘀㄀㜀㈀㐀䘀㜀㤀䈀　䌀　㘀㈀㌀㤀䄀　䌀䔀㜀䐀䌀㔀㐀㈀㈀㌀㔀㠀㘀㈀㐀㘀䘀䔀㐀㄀䈀䌀䈀㘀䐀㌀䄀㌀㔀䈀㌀㠀㐀㘀㠀㔀䌀㄀㤀㠀䐀㌀㈀㌀䈀㄀㤀㐀䔀䄀㘀䘀䄀㤀䘀㘀䔀䘀㈀㄀䄀䈀㄀䐀　㔀䄀䔀㤀䘀㘀㘀䘀㔀㤀䘀㜀䘀㠀㘀㔀㤀䈀㘀㜀㜀㄀㜀䈀㐀㄀㌀㐀㘀䌀㄀䌀䈀㄀㜀㈀㘀㘀䔀㐀㠀㠀䄀䔀㌀䔀㤀䈀䐀　㐀䐀㄀䐀　䌀㌀㔀　㘀㔀㔀䌀　㠀　䈀㄀㤀䄀䄀㤀䄀䘀㘀䌀䘀㌀㈀䌀䘀䄀䈀䄀㐀䐀䐀䘀㘀䈀㌀䄀䈀㠀䄀䈀䔀㤀䈀　㌀㐀䌀㜀㌀㈀㄀䈀㜀䌀䐀㐀㄀㤀㐀㌀䌀㘀㄀㌀㈀䘀䐀㤀㔀　㌀㠀㄀㘀䔀㌀䌀䄀㐀㄀㐀㌀㌀㘀㘀䌀㤀䌀㈀　　㘀㔀㤀䌀　㜀㐀㠀䈀㘀䔀㤀㠀㠀㄀㜀㘀㘀䔀㌀㈀㜀䈀㘀㔀䐀㐀㌀㜀䐀㄀㐀㌀䈀䔀䌀㘀㄀䄀㄀䔀䈀䄀　　䘀䌀䔀㄀䈀　䌀㐀㘀　䔀㘀䌀㈀㠀䌀䄀䌀㤀䐀㜀㄀㈀㜀䄀㠀㄀㌀㤀㈀䘀㄀䌀㐀䌀䈀㔀㐀䌀㠀㜀㜀㘀䈀㘀䌀䐀㤀　䔀㐀䐀䄀䔀㌀䔀㤀䈀㌀　䐀㤀　㜀䌀㘀䈀㔀㐀䈀㐀㜀䈀㜀䄀䔀㐀㄀㄀䐀䔀䐀　䔀㤀　㐀䈀䐀䈀㄀㔀䘀㔀　㌀䘀㤀㌀　㤀㘀㌀㈀䔀䈀㜀㜀㠀㌀䐀㌀䄀㄀㄀㔀㌀　䘀㄀㜀　㈀䘀䐀㜀䔀䔀㔀㌀㄀㤀㄀㠀　㌀䈀䄀㈀䔀㠀㘀㌀㔀㌀㔀䄀䌀　㘀㘀䈀㘀㔀㜀㜀㘀㤀䌀㠀㜀䐀㄀㐀䈀䈀㈀䌀䄀㤀䐀䌀䄀㔀㈀㌀䘀䄀㄀䈀㤀㠀　䄀㐀㘀㌀㌀䐀㘀䘀㌀㘀䔀䄀㠀　㠀㘀　㌀䈀䄀　䈀㐀㘀㤀㐀㐀㈀䌀㄀㌀㤀䔀䄀䈀㘀䘀䐀　㠀㜀䄀　㜀　䄀㔀䈀㌀䄀㌀㠀㐀㐀㐀㠀㤀䘀㠀䄀　䌀㈀䔀㐀䘀䈀㔀䐀㄀㐀䌀䘀䄀㔀　䄀䌀㌀䈀㜀䔀㠀㈀㌀　䌀䔀㤀䘀䌀㄀㠀㘀㐀䘀䄀䐀㘀䘀䈀㘀䐀㄀㔀㄀䘀䌀䈀㄀㐀㘀㜀㈀㔀䄀䔀㔀　㔀㠀䈀䌀㐀䘀㠀㜀㜀䔀㠀㈀䈀㔀㄀䔀䄀㐀㄀㘀䐀䐀㠀㔀䘀㈀䌀䔀㔀䔀㔀㘀䈀㄀㌀㌀㈀䌀䔀䈀䔀㠀㈀㐀䘀㌀䘀㐀㈀䐀　㈀䌀㌀㔀䐀㜀䄀㔀㈀㔀㘀㘀䔀　䘀㄀㔀䐀㤀　䔀㐀䌀㈀䈀㈀㘀䌀䈀䐀㠀㤀㈀㜀㈀㜀䄀㠀䈀㤀㔀　䄀䔀㈀㤀㔀䌀䄀䌀㜀㄀㈀㜀䐀㐀䘀㤀㠀䔀㠀㘀㠀䔀㠀䐀㠀㈀䘀䈀㈀䌀䄀㠀䐀䔀㤀㜀䐀䄀䄀　㌀㄀㐀䌀䌀㤀䈀㈀䈀䈀䘀㐀䐀䌀䌀㄀㈀㜀㤀䈀㤀㔀䘀䌀䘀㘀㘀䄀㤀㠀䌀䌀䘀㔀㔀㔀䄀䘀䌀䘀　䈀㘀䐀㌀䄀䐀䐀䄀㠀䔀䌀　䘀䘀䔀㠀㤀㠀㤀䔀䄀䔀䘀㜀䄀㤀㌀㜀䘀㐀㐀䘀䐀㜀䔀䄀䘀䘀㤀㜀䔀㤀䐀䔀㔀㔀㔀㘀㄀䐀䐀䌀㐀㘀䘀䔀䘀䐀䄀䌀㈀㔀䔀䄀䘀㘀䔀䈀㔀㘀䔀䄀　㌀㠀䘀㔀㈀䘀䐀䈀䄀㤀㤀䌀㜀　㘀㐀䄀　㜀㜀㔀䌀㜀　　䔀㜀㈀䌀㤀䈀㄀䈀㠀䈀䈀㈀䌀㐀䐀䌀㐀㘀䔀㤀㌀䈀㐀　䘀㄀㌀䄀㜀㌀䔀㘀㠀㘀䄀㤀㌀㄀䐀䐀㈀㌀㌀㘀䘀䄀㈀　䈀㤀䈀䔀㌀㘀㌀㠀㄀䐀㔀㘀　㄀㄀㌀　䘀䘀㜀䄀㈀㤀㄀䈀䄀䘀㈀䐀㐀㔀䐀㔀㐀䐀㈀㘀　䄀　㜀㌀䄀㤀㜀　㠀㐀㄀㄀䔀䌀䌀㐀䈀㌀䘀㐀䄀䐀㌀㌀㈀䘀㠀䌀㔀䌀㌀㐀㐀㈀㌀㜀䔀䄀㐀㌀㄀㤀㄀䈀　䐀㄀㔀䌀㄀㈀䌀䄀䈀㔀䌀㔀䈀䐀㈀㐀　䔀䔀䐀㄀㌀䈀㜀㐀㜀㐀㤀㐀䈀㘀　㠀㄀㜀㄀䄀㌀䔀㄀䐀㄀㔀㐀㔀䔀　㘀䐀㠀䄀䔀㜀䄀㈀㄀　䈀䔀㄀䘀㌀䌀䌀㘀㜀㜀䔀㠀　㘀　䔀䐀㔀䔀䘀㈀䐀䘀㔀䐀䐀㘀㘀㐀㤀䐀䔀䔀㈀㠀㄀㘀㄀䌀㐀㠀㌀䄀㈀䘀㌀㔀㈀䄀䈀　䔀㔀㈀㠀䈀䔀䔀㐀㈀䘀䐀㐀㐀㐀䈀㘀㜀㘀㜀㤀䌀䐀㤀䔀㈀㄀䔀㐀㜀䄀㤀䐀　㔀㤀㔀　㤀　䈀䈀　䘀㔀䐀㄀䄀㌀㌀䌀㈀㈀　㘀㔀㌀䈀㈀㘀䐀㌀䐀㠀䘀㈀䐀㜀䌀䄀　㌀㤀䐀䘀㐀㄀䐀㜀䄀㘀䘀㔀䈀㤀㔀　㌀䔀㤀㐀㌀䘀　㄀䌀䄀㌀䈀䌀㔀㌀㜀䘀㜀㐀㐀䔀㌀䄀㄀㈀㠀㈀　㜀䔀㔀㈀䄀　㈀㄀　㘀㄀㔀㐀䌀㜀㈀䌀㄀䐀䄀䔀㌀㈀㌀㤀㔀䄀㘀㤀䘀䄀㠀㘀䐀䔀㜀㌀㠀䘀㜀㐀㔀䔀䘀䘀㤀㐀㘀㤀䄀䌀㌀䈀㤀㐀䔀䌀䐀㄀㌀㔀䔀㔀㠀㔀䌀䄀㄀㜀㠀㈀䘀䔀㜀㐀㠀㔀㠀㜀㄀㈀㤀䘀㈀㌀㘀㐀䐀䌀㌀㔀䄀㠀䈀㌀㘀㐀㜀㜀㔀㠀㜀㔀㜀㐀　䐀㜀㄀䌀㈀㐀㐀䌀㄀䌀䌀㜀䐀㔀㘀䔀㄀䐀䔀䄀䐀㌀㠀㔀䘀䄀　㌀㠀䄀㌀䈀㄀䔀㠀䈀㌀㤀㔀㜀㜀㜀㜀䌀䐀䈀䄀䈀㄀㔀㔀䌀䌀㤀㤀㄀䈀䄀㘀䌀㘀㜀㐀䐀㜀㄀䐀㈀㐀䐀㜀䐀㜀　㘀䄀㜀䌀㌀㈀䄀㘀　㘀㠀䌀　㜀䔀䈀㠀㄀㜀㄀㔀䌀㠀䌀㠀䔀　㠀㜀㜀㘀䘀㄀㜀㜀䄀䐀㔀㔀㘀䔀㄀㜀㘀㤀㄀㠀䈀　㄀㌀䌀䌀㘀䌀䔀㠀　㠀㈀䈀䄀䌀䈀㈀㠀䄀䄀㘀㈀㄀㌀䈀㔀㌀䈀㄀䐀㠀㈀䄀䄀㌀㐀㈀㌀䄀㈀㔀㐀㈀䌀䈀　䘀䘀䄀㜀㈀䐀㜀㤀㘀䌀㐀㐀㔀㠀㌀㌀䈀㐀㤀䔀㄀䐀　㄀㤀㤀䐀㐀㤀䄀㄀䐀㄀䐀　㘀㄀䐀䌀㄀　㤀㈀㌀　㄀㜀㔀䄀䐀㤀㘀㤀䘀䐀䘀㐀㐀㌀㌀䄀㌀䔀㌀㌀㈀　㄀䄀㠀䐀䈀䈀㠀㘀㔀䌀䄀㌀䘀㐀䐀㌀㄀㄀㈀㌀㌀㌀䈀㐀㔀㐀䌀䘀㄀㠀䘀䐀䄀㄀䐀䔀㄀㄀㐀㠀㜀䔀䔀䔀㐀䘀㜀㐀㄀㜀㐀䄀䌀㜀㜀㐀㜀㘀㘀㘀㘀䈀㜀䐀㐀䘀䐀䔀㤀䌀䘀㤀䄀　　䌀㤀䌀㔀㄀㔀㤀䄀䌀㌀䌀䌀㔀㠀㌀䐀㈀䄀䔀䈀㜀䌀㤀㌀㜀䈀㘀㔀䌀䄀䐀䘀㐀㜀䈀䈀䌀䐀㜀䔀㠀䔀䘀㘀㌀䈀䄀㈀㠀䄀䈀䔀㠀䐀䘀㤀㜀㤀㤀䐀㄀䄀䐀䌀䄀䔀䈀䌀㌀㜀䄀䈀㜀㠀㤀㔀㤀㜀㈀㌀㘀䌀㤀䌀䈀䌀㜀㄀㄀　䘀㐀㠀㜀㌀䌀䈀㜀　䄀䘀㌀䈀䐀䌀㘀䘀䄀㐀䄀䔀㈀㤀䘀㤀䘀㘀㈀䔀䄀䈀䔀䄀㤀㈀㌀㐀㐀㘀䐀㜀䄀　　䌀㄀㘀䐀㐀㈀䐀㌀㌀㔀㌀䘀㐀㔀㐀㜀䔀　　䐀䌀㜀㘀䄀㄀㜀䌀㠀㤀䌀䈀䘀䐀㈀㜀㔀䘀䄀䘀㜀䄀㠀䄀䌀㘀䄀㈀䐀䈀㠀㐀㜀　䘀䌀䈀　㌀㜀㘀㜀䌀䔀䈀䌀䄀䌀㘀㈀䈀䄀䌀䐀㐀㘀㄀䘀㈀㐀㐀㜀㄀㤀㜀㐀䄀㌀㜀　㔀䔀㈀䘀㄀㠀㔀㘀　㄀䐀㌀䔀䔀㜀　䄀䘀㠀㠀㘀䔀　䔀㔀㜀㌀䘀䈀㜀䔀㘀㄀䔀㄀䐀䌀䈀㜀䐀䐀㘀㌀㈀䔀䈀㜀　䐀㜀㤀㘀㠀䔀㜀㠀㄀　㔀㠀䄀㜀㤀䐀䌀　㜀㔀䔀䌀䌀㜀㜀㤀㔀㘀㠀䘀㌀䄀㔀㘀㈀㈀䌀䐀　㌀㤀䐀䄀㜀䌀䔀㔀䐀䔀㠀㔀㠀䔀㄀　㜀䄀㔀㠀㄀䌀㤀㌀㘀䈀㘀䘀䌀㠀䌀䘀䔀㜀㘀䔀䈀㐀䄀䘀㐀㄀䐀㔀䐀䈀䔀㜀㜀䄀䔀㠀䐀䄀䔀㈀䘀㈀䘀㤀䘀䘀㐀䘀　㌀㘀㘀㘀㘀䘀䈀㄀䔀䔀䔀䄀䔀䄀㌀㤀䌀㔀䘀㜀㤀㌀䘀䘀㘀㌀䐀䐀䈀㘀㌀䈀　　䌀䔀䐀㤀䈀䄀䔀㠀䘀㈀䈀㌀䐀䈀㄀䐀䔀㈀㜀㔀㠀㜀䌀䔀㜀㔀㜀㌀㤀　㔀䌀㔀䘀㘀　㔀㠀　㔀㐀䌀䄀䘀㜀㄀䈀㔀䘀䔀㌀㈀䐀䄀㌀㔀䈀㤀䈀㘀㔀䌀㔀䘀㤀㠀㈀䌀㜀㜀䄀㄀㠀㌀㜀䄀㔀　㔀䄀䈀㜀㄀㠀䈀㄀䘀䔀䄀䈀䈀䈀䄀㄀㐀㌀㄀㘀㌀　㄀㌀㠀㌀㈀䘀㘀㄀䘀䄀　䐀㠀㌀䔀䄀㠀䈀㜀㠀㔀䐀䄀㈀㔀䘀䔀䈀㘀䔀䄀㠀㌀　㔀㔀　㔀㐀䌀㈀㜀㈀䄀䈀㐀㔀䈀䔀䄀䈀㌀㤀䈀䘀㜀㌀䄀㔀㄀䌀㄀㐀䐀㤀㠀㘀䌀㄀䄀䈀䈀㄀䐀䐀㈀㌀㐀㜀㘀㐀䈀䔀䐀㜀㌀㄀䔀㄀㄀䔀㔀㌀㠀㘀㈀䄀㔀䈀㈀䈀㔀㔀㌀䈀㠀㤀䐀䐀　　䐀㐀㔀䐀䐀㈀䐀㌀㔀㌀䈀䐀䔀㜀㈀㄀䘀　䘀㘀　䄀　䐀　㌀㌀㔀䐀㌀䈀䌀㘀䔀䘀䐀　䔀䘀䄀　䌀䘀䘀䄀㤀䔀　䐀㈀㤀㠀㘀㔀㔀䌀　䐀　　㠀㌀䈀㔀㄀䄀㄀㈀㠀㈀㜀䘀㄀㜀　䈀㜀㐀㘀䈀䘀㔀㄀㠀䌀䐀㘀㔀㄀㤀䘀㜀㔀㌀㐀㈀㄀䈀㐀㈀㤀㠀䄀䌀䌀㜀䐀䌀㈀㜀䈀䘀㌀䄀䐀㔀㐀㠀䌀㐀㘀　㌀㐀㔀䐀㘀䌀䄀䔀㠀㌀㄀㔀　㠀㠀㄀䔀䄀䔀䈀㠀㔀　䘀㘀㈀㄀㌀䌀㔀　䔀㘀䄀㄀㐀䌀㜀㘀䌀㌀㐀㌀䐀䘀㤀䄀㄀䔀㘀㤀㘀䌀䄀㜀㤀䐀䄀㌀䔀㄀㈀㈀䔀㤀㐀㌀㠀㄀㔀䄀㐀㜀㔀䐀䘀㌀䘀䐀㈀䌀䄀㔀䘀㌀㐀㤀䐀㘀㐀䌀㤀䘀䐀䘀䄀㌀㌀㐀䐀䌀䄀㔀䘀　㄀䔀䐀㘀䘀䐀㔀䐀䘀㐀䐀䐀㠀㌀䘀䄀䌀䈀㜀㈀㠀䈀䌀䔀䔀㌀　㘀㠀䌀㜀㄀㐀㌀䔀㈀㈀䌀䔀㔀㄀䐀䄀㘀䔀㘀㄀㄀㤀㔀䈀㜀㄀䈀㔀㔀㘀䔀䄀㘀䈀㈀㜀㤀㔀㠀㘀㤀㜀㄀㄀䘀䌀㜀䄀㐀䌀㄀㐀䘀㌀䔀㜀㐀㄀㌀㠀䘀㤀㐀㄀䄀䐀䔀㐀㄀䐀㜀䈀䐀　䄀　䈀䘀㘀　㘀㔀䐀㄀㜀䔀㘀㄀䄀㈀㠀㔀　䐀䐀䌀　㜀㄀䈀䄀䘀㈀㜀㌀㠀䘀䌀䄀䌀㌀䌀䘀㘀㤀䐀䄀㐀㠀䔀㤀㈀㔀䈀䌀㈀㔀㈀㄀㘀䔀㈀㠀㜀㤀㄀㐀䈀䄀㜀㌀㔀㔀㈀㘀㜀䈀㔀䄀㐀㔀䌀㜀䐀㌀㈀㘀㌀　㜀㤀㠀　　㄀䈀䄀㐀㌀䘀㄀䘀㠀㜀㘀　㄀䌀䘀䘀䈀䔀䌀䘀　　䔀䘀䘀䌀㌀㌀䔀㈀㄀䔀㠀㤀䔀䄀䌀㜀　䄀㠀㤀䈀䄀㌀䘀㐀㄀䌀㐀㔀䘀䔀㄀䔀㐀䄀䐀㌀䔀䌀䄀㐀䈀䔀㤀䔀䄀䘀㜀䄀䈀䄀㐀㘀㘀㤀䔀䈀㜀䈀㌀䐀䌀䄀㐀㐀㌀　䄀䌀　㈀　㘀㠀㘀䄀　㄀㌀㄀㔀㌀䄀㐀㜀䘀䘀䐀㌀㘀㤀䐀　䔀䔀䄀㌀䈀㔀㐀䘀䄀㤀㐀䘀㔀　㐀㜀㄀㌀㄀䔀䄀䄀㘀䘀䌀䘀　㠀䔀䘀䐀㄀䈀　䔀㈀㠀㤀㠀㘀䐀　㤀㠀㐀䘀䐀㄀䈀㜀䈀　㌀䔀㐀䔀㤀㤀㌀䈀㤀䐀　㤀㔀㌀䔀㈀䄀㜀㐀㜀䐀㈀㘀㄀㘀㠀㜀㐀㈀㤀㠀䐀㄀䐀㌀㜀䈀㈀㌀㤀㌀䐀䘀䐀㤀　㠀䐀㌀㘀䌀㐀䘀㌀㘀㜀䔀㐀　㔀㐀㔀㈀㈀㔀䈀䘀㤀㘀䘀㔀㄀㄀䌀㜀㔀䘀㐀㌀㤀㔀㐀㈀䘀　䄀㔀䈀㌀䄀　㜀㄀䐀䔀䔀㜀䌀䈀䐀䈀㜀㐀㐀㘀㄀䐀㄀䌀㄀䔀㤀㤀　㐀䘀䐀㜀㜀㜀㘀䔀䌀　㤀㠀㤀䔀㈀䘀䈀㐀㠀䐀䌀䄀㠀䌀䈀㐀䈀䄀㄀䘀㘀㌀䄀㜀䘀䔀㈀㤀㄀䈀㘀㜀㔀䐀䘀䌀㔀㤀㌀䌀䘀㤀㤀　㜀䌀㈀㈀䌀㐀㈀㈀㌀㔀䈀䌀㤀㤀䔀㈀㜀㌀㈀䄀㤀㘀䈀㐀㜀䔀㔀㜀㘀㄀䌀䔀䈀㐀䌀䄀䌀　䘀㄀㔀㠀㤀㔀䐀䈀䄀㔀㐀䄀㄀㜀䘀㄀䐀㄀䄀㄀䄀㤀㤀䘀㔀䐀㔀㔀　䔀㈀㌀　䄀㈀䈀䌀㘀䌀䐀䘀䈀䐀㜀㔀䈀㔀㔀䘀㜀䄀䔀　㐀䄀㜀䈀䐀䈀㠀㈀䘀䔀㐀㄀㤀㔀㘀䐀㔀㜀㄀䌀䌀䘀䈀㠀䄀䘀　　䔀㜀㄀㌀　䌀㠀㈀　䄀㐀㤀䌀㠀䔀㠀䔀㘀㄀䄀䌀䈀　䄀䄀㠀䔀㜀䐀䈀䈀㠀㐀䔀㤀䄀䘀㤀䘀䔀䔀䘀㠀㄀䄀䄀㔀䄀㔀䔀䘀䌀䘀㤀㜀㤀䔀　㠀㠀㘀㔀㔀䌀　㠀　㐀䔀㔀㐀䄀㠀㄀䈀䄀䘀䐀㄀㔀　㄀㄀　㠀䈀㌀㘀䐀㌀㐀䘀㔀　㤀䔀䄀㘀㠀㐀㈀䈀䔀㤀䘀㤀㄀䈀䌀㤀㜀㄀䄀㈀㠀㈀㈀䈀　䐀䌀㘀䐀䌀㄀㐀䈀䄀䌀㌀㈀㤀㐀䔀㌀㄀㤀㜀㐀䔀㘀䄀䔀䘀䄀䌀䔀㈀㤀㐀䄀䔀㠀㔀䌀㘀㘀㔀㘀㤀㄀䌀㘀䘀䔀䈀㘀䈀㔀㄀䄀䌀䐀㤀㄀㘀㘀㌀㜀㠀㘀䄀䌀䄀㌀䄀䔀䔀㤀䌀䌀䐀　䐀㌀㜀㐀㔀䄀㘀㘀　㜀　㠀㤀㈀㌀䄀䘀䄀㄀䌀㐀㄀䌀㄀㘀㠀㠀䌀㐀　㜀㌀䌀㌀䈀䔀㄀㤀㈀㄀㈀䌀䐀䄀㠀㔀䈀䈀㐀㤀䐀㠀㔀䄀㜀㄀㌀㈀䘀㌀䐀㠀㐀㈀䘀㤀㜀㌀㘀䌀䄀䄀㌀㠀㌀㘀䈀㈀㠀䄀䐀䄀㔀䐀䄀䔀䈀　㔀䔀䄀䘀䘀㐀䐀䔀㄀㌀㤀䔀䌀㔀㤀㌀　䘀䄀䘀㔀㜀㤀㠀㘀㘀㄀㔀㌀㔀䔀䌀䔀㔀㄀㠀䄀㤀䐀㠀㤀㌀䘀㐀㄀䔀㘀㔀㌀㄀㘀㈀㄀㔀㌀㔀㜀䈀䄀㄀䐀㈀㄀㤀䐀㌀䔀䌀㠀㘀㤀䔀䈀䈀㈀䄀㘀䘀㌀䈀㠀㘀䈀㠀㜀䐀㌀㌀㈀㌀䌀㈀䔀㈀㔀㈀㘀䈀䘀㔀䌀㔀䈀䌀㤀㤀㔀㔀䈀䔀㤀　㌀㜀䈀㐀䐀㘀䔀䐀　㈀㘀䔀䈀䌀䈀㤀㐀䈀㜀㠀㘀㜀䄀㘀䔀䔀䐀㌀　䔀䐀䔀䄀㔀㘀䘀䄀䔀　䐀䌀䘀㌀㜀䈀㔀䌀䄀䐀䄀䐀䄀　䐀㈀㤀䄀㤀䄀䘀㤀䈀䄀䌀㌀㈀䔀䄀㄀䌀䐀㄀㜀䈀㐀㌀㠀䐀㘀㄀㄀㔀㌀　㌀㐀㤀　䈀㄀㔀㈀䄀㄀㐀䐀㘀㠀㐀㜀㄀㌀㐀㘀㌀㐀㄀㤀㈀㠀㈀㈀㘀㠀㌀䔀㘀䔀㄀㌀䌀㌀㠀㜀䈀䈀㜀㠀䌀㘀㈀㠀䌀䔀　䔀㔀䔀㐀㘀㐀㜀㌀䄀　䐀㐀㈀䄀䈀㠀㤀㌀䔀㘀㜀䌀㐀㐀䐀㐀䘀㠀　㘀䌀䐀㈀㔀㔀㤀䌀䐀㔀㜀　㤀䘀㔀㤀䌀䈀㄀䈀㘀䈀䔀䔀㈀㌀㌀㠀㐀䔀䐀㈀䔀䘀䔀㠀　䘀㄀㤀䄀㐀㤀㐀㜀䄀㄀䐀䔀䐀㄀䐀㐀䘀㔀䄀㘀㐀㠀㤀㠀㈀䐀　㐀㔀㘀㠀㈀㄀䈀䌀㄀㜀䐀䄀㘀㠀㜀䘀䌀㈀䐀䐀䐀　䌀䈀㠀　㄀㤀　㜀㌀䈀㤀㠀㄀㄀　䄀䌀䌀㘀䌀䈀䘀㤀䄀㌀䌀䄀䘀䘀㌀䈀㄀㄀䌀䈀㜀　䈀㔀䌀㔀㌀䘀㌀䌀䔀䄀㤀㌀㘀㜀㘀㠀䌀䔀㜀䄀㐀䌀㜀㠀㄀䌀㔀䈀　　䄀㤀㠀䄀㤀㠀㠀㐀㠀㐀䘀䈀㌀㠀䌀㘀䄀㐀㜀䌀㄀䈀㈀䌀䌀䔀㠀㤀㔀㤀㄀䔀㈀㘀㐀䘀䄀㐀㌀䘀㘀㄀䐀䌀䄀䌀䌀㄀㈀䌀㜀䔀㈀䈀㤀䄀䘀　䔀䄀㐀㠀㔀㄀㤀䔀㔀㔀䄀䌀䈀㈀㜀㈀　䄀䌀㌀㌀㐀䌀㘀㔀　㄀䐀㌀䌀㐀㤀㐀䈀㐀㌀䈀䔀㔀㌀　㘀㔀㜀㘀㈀㘀䐀䈀䐀　㈀䔀䈀䄀䄀㐀㘀䌀㌀㈀㤀㐀㜀㌀㠀㌀䌀㈀䄀㔀㌀㘀㄀䄀㐀䔀㐀䘀㜀㜀䄀㈀㘀　䈀䈀䈀㔀㐀㐀㘀䘀䔀㜀䈀䔀䈀㈀　㤀㤀䔀䈀䔀㈀㘀㜀䘀䌀㠀㤀䔀㈀䘀䐀䔀㘀㄀䈀䈀㌀䈀䔀㔀㤀䘀㄀䔀㔀䐀㄀䈀䔀䈀㈀㘀㠀㘀㄀㌀䌀䈀㜀䈀㤀䔀㠀䐀䐀䐀㜀䐀䄀㜀㈀䘀㤀㄀㈀㜀㔀㌀䌀　㠀䌀䔀㔀㌀㐀䌀䘀䘀㄀䈀㠀䐀㔀㔀䌀㤀㜀㘀䌀䔀㈀䄀㐀㘀㌀㤀㠀　㔀㠀䌀㘀䈀䘀㠀䐀㄀㈀㌀䄀　㠀䌀䄀㌀㤀㌀䈀　㈀㐀㠀　㠀㔀㜀　䘀㜀㠀㠀㌀　㄀㐀㌀㐀㜀㈀㌀㘀㤀㔀䈀㄀　䔀䄀㜀㌀䌀䐀䌀㈀㠀㤀　䌀䔀䔀㔀㐀㘀㠀　㜀㔀䌀䌀　䔀　䌀㤀㐀㄀䈀㐀㤀㄀㈀㌀㘀䌀䄀㌀䈀㠀㐀　㄀䔀䈀㜀䘀䐀㘀䔀㠀䈀㜀䔀㠀㈀㈀䔀䔀㔀㔀㜀䄀䐀㜀㠀䐀　㔀䐀㤀㐀㄀㠀䄀㘀䔀　㜀㄀䐀䌀㔀䈀䐀㠀䄀䔀㌀㔀䔀䄀䈀䈀㘀䈀　㌀㌀䘀㔀㐀㘀㜀䘀䘀　㜀㐀䄀㔀㤀㌀　䔀㠀㠀㐀㄀㄀䈀㠀䐀㠀䐀㘀䐀䘀㌀㐀䌀䔀䘀䐀㄀䐀㔀㌀㠀䄀䈀㐀㄀㜀㠀䐀㠀䈀　㌀　䘀㔀㤀䘀㘀㜀㄀㔀䘀㌀㐀㄀䘀㠀㈀㠀㜀䌀㤀㤀㐀䐀䈀　㄀䌀㜀㄀㤀㘀㠀㤀㠀䔀䘀䈀㔀䌀㤀㔀䌀㌀㄀㔀㐀䄀　䈀䐀䘀䈀　㠀䌀䌀　　㘀䌀㘀㤀㤀㤀㤀䐀䘀䄀䄀㈀䌀㈀㠀㄀䈀㤀㘀㌀䐀㄀㜀䔀䄀䘀䔀䈀㤀㈀䄀䈀㜀㈀㌀䘀㔀䌀䐀㜀䐀㠀䄀䘀㜀㄀䄀㤀㔀㈀㤀　䄀㔀䔀㌀䄀㔀䈀㤀䐀㠀䈀䌀㤀䌀䐀㄀㔀㠀㜀㔀䈀㔀䐀䄀㌀䔀㠀㌀䐀㐀㈀䘀㄀㌀䘀䄀㘀㌀㐀㈀㈀㔀㐀㤀䔀㘀䄀䄀㔀㐀䔀䄀㌀䌀㤀㘀㔀䔀㘀㌀㄀㔀㘀㄀䐀㄀䔀㐀㜀䐀㤀㔀䘀䄀䄀㜀㈀㤀㠀㠀㠀㈀㄀䔀㔀㘀㔀㈀䄀㤀㌀㔀㜀䐀㤀䔀㠀㔀㌀㌀㤀䈀㄀㐀㤀㐀䄀㤀㤀䄀㐀䌀㔀䘀䄀㄀䘀㜀䐀䌀䐀㐀㠀㜀㄀䈀䐀䐀䄀䔀䄀䐀䐀㜀㈀㐀㘀㐀㘀䘀㄀　㔀㈀䄀㘀䘀䔀䄀　䄀㘀㄀㠀㌀䈀　㐀㔀㜀䘀䌀㌀㜀㈀㤀　㜀㘀䈀㘀䐀䄀䔀䄀䐀䈀䐀䌀㐀　㘀㈀㔀㠀　㔀　䌀㈀㌀䄀　㘀䈀䘀㠀䔀㤀䄀㐀㜀䔀䌀䄀㈀㈀㘀䌀㄀㄀㤀䐀　㜀䔀㔀䄀㠀䈀䈀㐀㜀䐀䌀㐀㐀䌀䘀㄀䔀䈀㄀䐀㘀㔀㌀　䔀䈀㤀㜀䘀㠀㠀䐀䔀㐀䐀㤀㤀㄀䐀㌀䄀　㤀䈀㌀　䐀䐀㠀㈀㘀䘀㜀㜀㌀㐀䈀䄀㜀㜀䘀㠀䘀㤀㔀㠀㈀　　㐀䄀䘀㈀㌀㠀䄀㔀㠀㌀　䔀㠀䄀㄀㈀㌀㌀㄀䄀　䈀䐀㈀㌀㄀䄀㌀㜀㄀䐀䐀　㔀㜀䄀䔀㘀㤀䐀㤀㔀㐀䔀㐀㤀䔀㌀䌀㜀䌀㐀㠀㄀㐀㘀䈀㠀䈀㜀䈀䔀䄀㌀㤀㌀䘀䐀㔀䔀㘀㤀㠀䄀䄀䌀㠀㔀䈀䈀䌀㤀㤀䌀㘀㜀䄀䐀䌀䌀䌀㜀㘀䔀㐀䄀㌀㌀㠀䐀㜀㔀㜀䘀㠀㔀䈀㌀㔀㠀㘀㔀䔀㌀䔀㔀䘀　　㈀䄀㔀㠀䘀㘀䘀䄀㘀㔀䈀㈀䈀㌀㌀㐀㌀㠀㜀㐀㘀㌀㠀䄀㈀㐀㐀䄀㔀䌀㌀㈀㄀㔀㐀㔀䐀㘀䘀䔀㈀䔀㤀㠀㘀㘀䐀㐀㄀　㤀䔀䈀㘀䔀㌀㜀㘀䘀㔀㐀䈀㠀㜀㔀㈀䔀㈀㘀㜀㜀䐀　䘀䘀㤀䔀㈀䘀㠀㐀䌀䈀䌀䔀䄀䄀㠀䈀㘀䐀㄀㔀䌀䘀䈀䘀㔀㤀㈀㤀㔀㐀䘀㠀　㘀䐀䄀㤀㜀㠀䔀㔀䄀䌀㜀䔀䔀㠀䐀㔀㠀㘀㤀㄀䌀䈀㠀䄀㜀䌀䄀䘀䔀㔀㔀㈀䄀䘀䈀䘀㄀㄀䄀㔀㈀㈀㈀　㐀䘀㄀䔀　㐀㜀㤀䐀䐀㜀㤀䐀䌀䄀㐀㤀䐀㤀䈀䈀䌀㈀䐀㘀㤀㤀㈀㐀　㐀䐀㜀　䐀㔀㘀㈀㤀㠀䌀㤀䈀䐀䌀㜀㈀㄀䔀䄀䈀㜀㠀㌀㄀䘀㐀䈀䌀㐀㠀㜀㤀䐀䄀䌀䘀㈀䄀㜀㘀䘀㈀㐀䔀䐀㔀䐀䈀㘀㘀䘀䄀䄀䔀䄀䔀䌀䐀　䐀㈀㐀㠀㘀㔀㔀䌀　㐀㐀　䐀㌀䘀㤀㔀㠀㤀　㘀㤀䘀䈀㔀㌀㜀䄀㌀㜀㔀䔀䄀㄀㘀㤀㈀䘀㜀䄀㠀䐀　㄀㜀㔀䈀䔀䈀㈀㤀㠀㜀䐀㄀　㠀㌀　㘀㔀㜀㘀㄀㠀㜀㔀䔀㠀　䌀䈀　㐀㠀㜀㐀㐀䔀㄀䄀䐀㔀㄀䈀䘀㐀㄀䔀　䐀㠀㘀㠀䔀㠀䌀㜀㈀㄀㜀䈀㜀㠀䄀　㠀㈀䄀㐀㘀䌀㘀㘀㠀㈀䌀䌀㠀㠀㠀㤀㠀㄀䄀䐀㜀䄀䐀䐀㔀㌀䈀㜀䔀㤀䄀䄀㌀䘀䈀䄀㐀㘀㔀㐀䘀　䄀㤀䐀䐀㌀㐀䘀㠀䘀䔀㐀㤀䐀㌀䐀㜀㐀䐀䘀㔀㤀㠀䈀㠀䐀㜀㐀㤀䘀㤀㄀㜀㐀䈀䔀㔀㔀䌀䌀䌀㜀䄀䐀　䄀㠀㌀㌀䌀䌀㜀䐀㌀㄀㜀䐀㄀䐀㄀䌀䌀䈀㈀䌀䄀㐀　㜀　䌀䈀㔀　㘀㘀㤀㄀㤀㤀㤀㤀䄀㤀㜀　㜀㤀㠀䘀䐀㤀　㤀䐀㘀䐀㤀䔀䔀䐀䐀䌀䔀䌀䈀䐀　㄀㤀㌀㔀㘀㜀㐀㘀䈀㘀㔀㘀䘀䄀㜀䌀㄀㘀㄀㄀㔀䐀㐀䌀㘀䔀䄀㈀㌀㐀䈀䄀㤀㄀㈀　㘀㤀㘀㐀㈀㘀㜀㌀䄀㠀䐀㈀䘀㐀䈀㠀䔀䄀䌀䌀㤀䐀㘀㐀䈀㜀㘀㌀䘀㜀㜀㠀㜀㜀㤀䔀䘀䔀䈀䔀㐀㄀䐀䘀䄀䌀䈀㔀䘀㄀㄀䈀㔀㈀㌀䔀䄀㐀䘀㐀䐀䔀䄀㘀㌀㈀㐀䈀㐀䘀䔀㔀　㐀㌀䈀㔀㠀㈀䈀㤀㌀㘀㐀㈀䄀䘀䈀㌀㤀䌀䄀㜀䈀㤀㌀㔀䈀㐀䔀䐀㈀䔀　㠀䌀㈀㈀㠀䄀㘀㘀䐀䄀　㜀㘀䐀　㘀㘀㄀䔀㠀㐀㘀䈀㠀䌀䈀㤀㐀䄀䔀㄀䈀㔀㔀㘀㘀㘀㤀㤀䈀㄀䈀㐀㠀　䌀䄀䈀㠀　䄀㄀㔀㄀㜀㐀䄀㌀䔀㄀㠀䘀䔀䔀㄀㄀䄀䘀　䄀䈀䘀䔀䈀㐀䔀㌀㤀㐀䌀㌀㄀㄀䔀㌀㘀䄀　㤀䐀䈀㄀㘀　䌀䄀㐀䌀㜀䐀䐀䈀㌀䄀㌀㜀䄀䌀㌀䄀䔀㘀㈀㌀䌀㘀䌀㄀　㠀䌀䘀㘀㠀䔀䌀䐀㘀䌀　㔀䘀䄀䘀㜀㤀䘀䘀㤀䌀㤀䄀㜀䈀㈀㤀㌀㌀㐀㌀㈀㜀㜀㠀㤀㄀䔀䔀䈀䈀㄀䔀㈀㘀䈀㈀㌀䐀㐀䐀㘀㠀䔀㜀㘀㈀㤀㈀㌀䐀㐀　㌀㠀㔀㜀㔀䘀㘀㠀䄀㌀㠀䐀　㠀䈀䈀㐀㄀䐀㌀䄀㤀㤀㠀㄀㌀㌀㔀䄀㐀㐀㐀䌀　䄀㐀䄀䌀㤀䐀䔀㜀㤀㄀㔀㤀㔀䘀㔀䄀䔀㘀㤀䘀㘀䔀　㠀䈀㜀䌀䔀㈀䐀㈀㜀㐀㈀䘀　㘀䐀㌀㘀㠀㔀㌀　䄀䌀　㈀㈀㘀䄀㌀䌀㐀㘀㐀㌀㄀㈀㜀㠀䌀䌀㠀　䈀䄀䐀㤀䌀㐀㄀㐀䐀㄀㘀　㠀　䈀㈀㄀㌀䐀㘀㔀㄀䌀㘀　㐀䘀㐀㔀㐀䌀㌀㔀　㄀䐀㌀䌀䔀㠀㔀㘀㄀䌀䄀　㠀㌀㔀䈀㤀㌀　㄀䌀　䘀䈀䈀㌀㌀㄀㘀㌀　㔀䈀㐀　䔀㄀䐀㜀䔀䔀㔀　㌀㔀㘀㜀㄀㘀㔀㠀㘀䔀㜀㐀㜀㈀㐀䐀䈀㤀䄀㐀㈀㘀䘀䌀䈀㄀䈀䄀㔀㤀㘀㐀　㤀㠀　䈀䔀㘀㐀㜀䈀䔀䈀䔀䌀䐀㈀㌀㄀䈀䄀䌀䐀㘀䌀㤀㜀㠀䘀㐀㜀㘀䐀㌀㐀㜀䈀㤀㐀㌀㄀㘀㐀㄀㠀㔀㘀　㄀㄀㌀㔀䐀㘀㘀䈀㈀㔀㤀㠀䄀　䔀䌀㤀㤀䄀㤀㤀㐀㘀　䘀㈀䈀㄀　㔀䐀㄀㠀㌀䄀㤀䈀㠀　䔀䔀㠀㐀㐀䔀㠀䈀䌀㈀㄀㄀㐀㔀㘀㜀㤀㌀　䈀㐀㌀㘀㜀㜀㜀㄀　㌀　䈀　㐀㐀䌀䔀䈀䌀䈀　䄀䐀䘀䐀䈀䘀䄀䐀㘀㐀㌀䌀䄀㈀㜀䐀㄀　㈀䌀　　㤀䐀㤀䌀䔀㔀㠀䄀䐀㌀䈀䐀䔀㠀㈀㐀䐀䔀㤀㈀䐀䌀㘀㜀䈀䐀䈀䔀㐀䄀䈀䘀䘀㜀㔀㘀㜀䄀㌀㄀㌀㜀㐀　㤀㄀䔀㠀㄀䔀䐀㠀㔀㠀䘀䔀㄀䌀㘀㤀㄀㔀䈀㌀㌀　䌀䐀㈀䄀䐀㜀㤀㐀䈀䘀䐀㐀㜀䈀䔀㤀㐀㄀㔀䘀䈀䘀䐀㘀㌀㜀䐀㄀㔀㔀䄀㌀䈀䈀㔀㤀㐀㐀䐀㄀䐀㤀䌀㐀㤀㠀䌀䌀　䄀䌀䘀㔀　㈀䌀㤀䘀䄀　䘀㐀䔀䐀䄀䐀䈀㈀䘀㌀㜀㐀㠀䔀㈀㠀䘀䘀㘀㜀䄀㤀㌀䌀㘀　㔀㔀㘀䔀㔀　㌀㤀䐀䔀䄀䘀㌀㐀㄀䌀䄀㌀䈀㐀䐀䔀䄀㤀㌀㈀㔀䐀㘀㐀㤀㔀䈀䈀㐀䐀䘀䘀䘀䔀㤀㜀䄀䄀㠀㌀㈀㤀㜀㜀㌀㠀䐀㤀㌀　㘀㌀㔀㠀　㔀㐀䌀㜀㐀㤀㤀㐀㤀㘀㜀㐀㈀　㠀㌀　㌀㌀㠀㄀㄀㔀䄀　㘀㌀㐀㘀㄀㜀㠀㘀䔀㠀　㈀㄀㠀㘀㄀㘀㤀䐀㐀䌀䘀䈀㈀䌀䄀㌀䔀䄀㠀䌀㤀㠀㔀䄀㄀䈀㌀㌀䈀䘀䌀　䘀㠀㌀㠀㄀㜀䔀　㌀㈀㔀㈀䄀㤀䐀䌀䈀䐀䐀㐀㔀㠀㈀䔀㠀䐀䄀㤀㈀䌀䔀䌀㐀㘀㠀䔀䔀　㜀䄀㌀䐀䐀䄀䐀䔀㜀䘀㄀㌀䔀㘀㤀㜀㤀㘀㈀䘀㠀㄀㘀䔀㔀䄀㘀䈀䈀䔀㠀䐀䌀㐀㤀䔀䘀䌀䌀䈀㜀䈀㈀㤀㌀㐀㘀㘀㘀䌀㄀㔀䐀㔀㌀䈀䔀㐀　䘀㜀䐀㌀㠀㌀䈀䔀㠀䔀䈀㄀㠀䄀㔀㔀㜀㈀㔀㜀㠀䐀䔀䔀㘀㘀㜀㄀㔀䘀㘀䈀㘀㘀㐀䌀䘀㘀　㠀䌀䘀㤀䌀㠀㈀䐀䘀㔀㐀䔀䘀㤀　　䔀䈀㜀㤀䐀䘀㈀㠀㌀䌀䈀㜀䌀㐀㘀㜀㜀㠀㌀㔀㔀　䄀㔀㐀㤀㐀䌀㔀　㠀㐀　㜀㐀㔀䐀㌀　㔀　㌀䈀䄀䈀㤀䌀㔀㄀㜀㐀㌀䔀㈀䐀䘀㤀㄀䔀㈀㄀　㘀㘀䈀㤀㐀㌀㜀䌀㄀　䐀㄀㄀㠀㘀㔀㔀䌀　㐀㐀㤀㜀㤀㤀㜀㐀㔀　㐀㘀㔀䄀㌀䄀　䔀　䐀䐀㤀㠀䘀㘀䐀㜀㔀㄀㜀㠀㘀㈀䌀㄀㌀䔀㠀䄀䌀㌀　㄀㐀㌀　　㤀㌀　　䐀䔀䐀㔀䌀㄀㠀㌀䄀䈀䈀㠀㌀㜀　㘀　㠀㘀䌀㈀䌀㠀㐀䔀䌀㜀㐀㌀㠀㠀䔀䐀䄀㄀䔀䘀㔀㈀䐀㜀㤀㘀䈀䔀㄀䈀䐀㔀䄀䌀㔀䄀䈀㈀䄀䌀㐀䔀䔀䔀䘀䈀㠀㤀㠀　㈀䈀㄀㐀㄀䘀　㈀䌀㜀㄀䐀㤀㐀㌀䘀䄀㐀㜀㜀䔀㠀䈀䌀䌀䌀㤀㐀㈀㈀䈀㌀䔀　䄀䔀㈀㤀㐀㤀䐀䘀㜀䔀㌀㘀䘀䄀䄀　㈀䘀㘀㘀㈀䐀　㠀㤀㠀䔀㠀䄀䄀䐀㄀䐀䐀㈀䌀䈀㘀㘀㌀㐀䌀䔀㈀㌀㌀㘀㘀㘀䔀䘀㌀䄀䐀㜀㈀䔀㌀䈀㤀䌀㈀㈀䄀䐀䈀㈀㤀㌀䘀䈀㠀䌀䌀䔀㄀䄀䌀䌀䄀㈀䐀㜀䄀㤀㜀㌀䌀䈀㈀㠀㜀㠀㘀䔀㔀䐀㔀㠀㠀㤀㔀㌀㘀㐀䄀䌀䈀㘀䈀䈀䔀㠀䘀　㜀㤀䈀㐀㔀㜀㜀㤀䐀㄀㤀　㌀㠀䌀㘀㄀㄀㔀㌀　䄀㤀䌀䈀䌀䌀㄀㐀㜀㔀㈀䔀　䌀䈀䈀㐀㔀䌀䄀䔀䔀䐀㐀㘀䐀㠀㈀䄀䄀䈀㌀㄀䐀㔀䄀㤀　䘀䌀䘀䘀㤀㤀㤀䄀䘀䈀䄀㤀㔀䔀䄀㜀㈀䔀㜀䐀㈀㤀䌀㌀䐀㌀䌀䔀㌀㔀䄀㔀䔀㌀㤀䈀䔀㄀㜀㜀㤀䄀䐀䔀㈀㘀䌀㘀㈀㐀㜀䐀㄀㘀䔀㌀㘀䐀䔀㜀㘀䄀㌀㐀䈀㈀㈀䄀㈀䌀㜀䈀㤀㠀䄀㄀䈀㄀㈀㐀㐀㐀㜀㠀㈀　䌀㐀㄀　㜀䔀䄀㤀㠀䐀㤀㈀䔀㌀䄀㌀㤀㘀㌀㄀㔀㐀㄀㠀㔀㘀　㄀㤀㌀䐀㄀㌀䘀㠀㠀䘀㘀㐀㐀㘀　㌀㈀㘀䌀㤀㐀㌀㈀　㘀　㐀㔀㤀䌀　㘀㐀䘀㐀㄀䄀䔀䔀㤀䐀䐀䘀䐀㄀㘀㐀䄀㌀㤀㐀㌀㄀㠀㐀㄀㠀㔀㐀　㄀㠀㌀　㈀㄀㘀㌀䈀㄀㜀㄀㐀䈀㈀㐀䌀䘀㤀䐀㌀㠀㌀䄀㜀䐀　䈀䈀䈀䌀䐀㔀䌀䄀䈀䐀㄀䈀㈀㠀㜀㐀䐀㄀㘀㄀䘀䌀㈀㐀㌀䌀䌀㌀㌀䔀　㜀㤀䄀䘀㘀䔀㘀㈀䔀䔀㌀䌀㌀㔀㘀㘀㘀㜀㌀䌀㔀䌀㔀㤀㐀㄀䘀㤀䐀䌀䔀䔀㤀㌀㔀䔀䘀㌀㄀䘀䐀䘀㜀䌀㌀䈀㜀㔀　㤀䄀䄀㈀䈀㌀㐀　㄀䘀㠀㌀㜀䔀䄀㔀㘀㤀㐀㌀㄀㘀　䌀　䘀㌀䄀　㤀㘀䌀㘀䘀䈀䔀䐀　㘀㔀㜀䄀䌀㠀　㌀䘀㐀㌀㐀㠀䌀㄀㄀䘀䈀㐀㤀㐀䔀䈀㌀㜀䄀䐀㘀䄀㔀㠀㤀㌀䄀㠀㜀　㔀㐀㌀䘀㤀䌀䐀䄀䔀䔀㔀䔀㠀䔀㘀䈀㄀㠀䔀䌀㈀㤀䔀㘀䌀㘀㌀䈀䈀㠀㤀䐀　䘀㤀㄀㌀㌀㤀㌀㤀䈀㈀㄀䈀䘀䄀㄀䘀䈀　㔀䈀㄀㜀　㔀㜀䔀㌀㐀㜀㐀㠀䐀䐀䘀䌀㈀䐀㐀㌀㔀㄀㤀䈀㠀䄀㈀㜀䈀䐀䄀㐀䘀䈀䘀䐀㄀㠀㔀㐀㄀㄀䄀䈀　㐀䌀䘀㐀㘀㔀㘀㜀㌀㐀㜀㘀䄀䌀㠀䈀㘀㜀䔀㠀㌀　䄀㠀　㈀㠀㘀㈀㤀㌀㘀　㘀㜀㔀㈀㜀㔀䈀䌀㤀㌀䔀䄀㐀䘀　䘀㌀㜀㤀㘀㠀㄀　㌀　㌀　㈀㠀㘀㘀䐀䘀㘀䈀㈀㔀㐀䈀䌀㌀㄀㘀㜀㘀㄀㐀䄀䐀㐀䌀䐀㔀䘀䘀䐀㤀㐀䄀㈀㄀䌀㔀㈀䔀㔀䔀㤀㐀㤀㤀㔀　䌀䌀㌀　㄀䐀㈀㠀㠀㤀㌀㄀㠀䄀䘀䌀㠀䄀㤀㔀㜀㘀㐀㔀㈀㠀㔀䄀㘀㄀㘀　㌀䔀㘀㄀㤀㔀㔀䈀䌀䈀㜀䘀䈀㄀㔀㈀䔀㠀䘀䌀䄀㜀㤀㔀㐀䔀㤀䔀㘀㠀㜀㠀䔀䌀㐀䈀㐀㄀䘀　㜀䐀㐀㐀䔀㄀䈀㈀　㔀㄀䔀　㘀　䄀䌀㄀䌀㌀䌀㄀㘀㜀㌀　㈀㤀䈀　㌀　㈀㠀㌀㐀䔀㜀㔀䈀䔀㤀㤀䘀䔀㔀㐀㔀㠀䄀㤀㜀　䔀㠀㜀㜀㈀㄀㤀㠀㘀　㔀㐀䄀㤀䌀㠀䔀㜀㐀㤀㈀䐀㈀䈀㈀䌀　㐀䄀㈀㄀䔀㔀㤀㠀㘀㜀䄀㔀㜀㈀䘀㜀㘀㌀㔀㘀㌀㈀㔀㤀㌀　㌀㄀䔀䌀䌀䘀㐀㄀䈀㜀㠀㄀㈀㈀㤀䈀㠀䔀䘀㠀䈀　䐀㈀䌀䄀㠀㄀䘀㐀　㜀㔀䈀䄀䈀䌀䈀㐀䌀㌀䄀㈀㔀㠀䐀䐀䐀㌀䈀㐀㄀㄀㌀㠀㔀㜀䐀㤀㈀䌀䄀　䌀㠀㄀䌀㌀㤀㘀㜀䄀㄀㐀䈀㠀䔀㠀㔀䘀㔀　㠀䔀䄀㌀㐀䘀㐀㄀䘀　㐀　㠀㌀䔀䘀䄀䘀㜀㈀䄀㌀㠀㌀䄀䐀䐀㈀㜀䐀䌀䔀㄀䄀㐀㈀㤀　䈀㄀㌀㐀䐀䄀㐀䄀㜀㤀䈀䔀㔀䄀䘀㄀㘀㄀㈀䈀䈀㐀䈀㔀㔀㔀䄀㜀㘀㐀䈀㘀㌀䈀㌀㤀㄀㈀㠀㔀䘀㜀㤀㌀㄀㐀㌀㜀䘀㤀㌀㤀䌀䐀䐀䄀㤀䘀㄀䌀㜀㤀䄀㄀䐀㈀䘀䄀䈀　䐀㈀䈀䔀䈀䈀䌀䄀㄀　㜀㌀　䐀䔀䄀㜀䌀㔀㜀㤀㔀䐀䐀䐀䐀䌀䄀䘀䘀䄀㔀䐀㘀䔀䄀䈀㈀䘀㐀㈀䔀䔀㔀䘀䐀㄀㔀㔀㘀　䄀㘀　䐀䔀㔀䐀㘀㠀㘀㔀㌀䈀䐀䄀㐀㔀䔀㔀䔀䐀　㈀䌀䄀㘀㤀㜀㘀䈀䔀㠀䘀　㘀䈀㐀㤀㜀㈀䈀㠀䌀㔀㤀䌀䄀䘀䈀㠀䈀㤀㐀　㜀䈀㜀㔀㄀䐀䄀㔀㜀䔀㔀㐀㘀㜀㠀䄀㜀䔀㠀㌀䐀㘀㠀㜀䔀㌀䘀㐀㌀㘀㤀㘀㠀㌀　䄀㠀　㈀　㘀䐀　䌀　䄀㠀䐀　㈀㔀　䐀䌀䘀㄀㄀㄀㠀㌀㐀㔀㠀㌀䘀㘀㠀㠀䐀㔀㤀㠀䘀䐀㌀䄀㔀㜀䔀㤀　㄀䄀　䐀㄀㌀㌀㘀　㔀䐀䄀㤀㘀　㘀　䌀䔀㔀㠀䈀㘀　㜀㈀　㌀㌀㐀㄀䄀㌀䐀䄀㌀　䐀䌀㈀㘀㔀㌀䘀㠀㔀䘀㜀㈀㔀㠀㔀䌀㄀䌀㘀㌀䌀㄀䄀㈀㌀㤀䐀㠀䐀㜀㈀䄀㐀䄀㌀㌀　㌀䄀䐀㄀䘀㠀㘀㄀㘀　㤀䔀䄀㜀䐀䘀　㠀䌀　䘀㤀㔀㘀㌀㘀䌀㘀　䘀㔀㤀䐀㤀㤀㤀㐀䘀㔀　䈀䄀㘀㠀㜀㐀㜀㐀㔀㠀㘀㘀　㜀㔀㠀㌀㜀䐀㌀㈀㄀㌀䔀㘀㤀䄀㔀䔀㌀䄀㠀㌀㔀䌀䄀㄀䘀㤀䐀㠀㈀㠀㘀㄀㠀　㔀　䌀㘀㤀㔀䐀䄀䔀㜀䌀㌀㄀㌀䈀㐀㌀㄀㠀䈀䄀㌀䈀䌀䌀㜀㤀㔀㘀䈀㤀㤀䌀䈀䌀㐀䐀䔀㔀㤀㌀䈀䄀䌀䌀㤀䌀䄀㔀㜀　㄀　㐀㐀㠀䘀㔀䄀㌀䐀㠀㔀　䐀䔀䈀㠀㘀㄀　䈀㤀㔀㔀㘀㔀㜀㈀䄀㜀䐀㈀㠀䔀䌀䐀䐀㘀㜀䘀㔀㤀䐀㤀㐀㄀㌀㄀㘀䔀㜀㐀㐀䄀㄀䘀㈀㄀　䌀㠀䐀䈀䘀䈀䐀䌀㈀㌀䘀㔀㄀㜀㤀㤀䌀䄀䈀㜀㐀㔀㈀䘀㘀㜀㐀㈀䔀㤀㠀䄀䌀　㜀㤀㐀㜀㜀䘀㜀㄀㈀䐀㠀䔀䔀䔀㐀䌀㠀䐀㤀㐀䄀䐀䈀㐀㌀㔀㘀㄀㤀㔀㈀㤀䄀㌀㔀㤀䘀㄀䌀㐀㤀㄀䄀䈀㘀㔀㐀㤀䌀㌀䈀㔀㠀䐀㔀㜀㤀㠀㤀㜀䈀㈀䈀䌀㔀㠀㤀䈀㌀䄀䐀㘀㌀䘀㐀㜀䘀䔀䄀䈀㈀䐀㐀㐀䘀䈀㤀㠀䌀䌀㘀㤀䐀䐀㌀䄀䌀䘀㈀　㌀䘀䌀㌀㔀䐀䐀㌀䘀䐀䔀㔀䄀㘀㤀㜀㘀䔀㈀㜀㜀　㌀㔀䄀㘀㠀䘀䔀㔀䈀䄀䌀㄀㈀䄀䔀䔀䔀㠀䄀㤀㐀㌀䌀䈀㌀㠀㜀㘀㠀㤀㄀䔀㈀㐀㄀㈀㠀㈀㌀㠀㠀㜀䌀䘀䈀㐀㈀㄀㘀㌀　㜀䐀　㈀㄀䄀䌀㤀㌀䌀㈀䈀䄀䐀㔀䘀䄀㤀㔀㐀㌀䄀㜀㤀䈀㐀䘀䐀㠀　㘀䔀䄀㔀㘀㌀䌀㌀䈀　㔀　䈀㄀䈀　㈀㄀　㜀㔀䄀䄀䈀㔀㔀㈀䄀䘀㐀㈀㠀㄀䐀䔀㌀䌀䐀㜀䄀㤀㜀㄀㤀　㜀㈀㌀㌀㘀㤀䐀㤀䐀㠀㘀㐀䌀㠀㌀㌀䈀㌀䈀㜀䌀㐀㌀　㌀䄀㜀　㄀㌀㌀㄀㌀䄀㄀　㄀㌀䄀㠀㔀㜀䌀㤀䈀䔀㈀㜀㜀㌀㜀㠀䘀㜀㐀㠀㘀㌀䐀㤀㈀䘀㐀㌀㈀䄀䄀䐀㌀　㠀䘀䘀䐀䔀䌀䄀㔀㄀㤀䌀䈀㐀䐀㌀㘀㠀䄀㄀䐀㈀䔀㤀㐀㠀㐀䘀䐀㄀䈀㜀㠀㐀䘀㔀㘀䔀㈀䈀㌀䈀䈀㘀㔀䈀㌀㠀䐀㌀㔀㄀　䔀㔀㘀䈀㠀䌀䔀㔀䔀䐀㄀㤀㠀䔀㜀䔀䄀㔀䐀䘀㈀㜀䘀㤀㔀㔀㔀䔀䔀㌀　㘀䘀䈀㄀㠀䄀㘀䔀䄀㘀㤀㌀䔀䌀䄀䄀㌀㠀䄀㈀䌀䈀㐀䌀䐀䘀䈀䌀㜀㜀䈀㌀䘀㈀㔀䐀㐀㜀㘀㄀㄀㌀䌀㜀㜀㄀㔀㘀㄀䐀㘀㤀㜀䈀㠀　䌀㈀㜀㐀㘀㌀㐀㔀㌀㜀㄀䈀䘀　䐀䘀㠀䘀㠀㜀㌀㈀　　䐀　䐀　䔀䔀䌀㜀㄀㠀䘀㠀㜀㈀㠀㈀㌀㐀䔀䐀㘀䔀䐀㔀㘀㤀㤀　㄀䈀㔀䄀䘀䈀㤀㌀㈀㌀䄀䘀䈀　㠀䄀䈀䔀㔀䔀㘀䐀䐀䐀㤀䐀㄀䌀㐀㤀㜀䄀㄀　䔀㈀㜀㌀㔀㐀㤀㘀㄀䔀㌀㜀䔀㄀䐀㈀㄀䔀䔀䄀䈀㘀㈀㐀㌀㠀㘀䐀㜀䔀䈀䘀䐀㈀㐀㈀㤀㤀䈀䔀䐀䔀㈀䄀䔀㌀㐀䔀䌀䄀䌀䐀䐀䐀䄀㐀㌀䔀㘀䌀䄀㌀㘀㤀䘀㘀䐀㐀㠀　䐀㘀㄀㄀㔀䐀㤀㄀㤀㈀㜀㜀㤀㘀㔀䄀䈀㐀㈀䐀㘀㘀㠀㤀㄀䈀㈀㜀㘀㤀㌀䈀䐀㈀䔀䄀㘀䐀㤀㠀　㘀㄀㘀㠀㌀㈀䄀㘀　䄀㠀㤀㐀䘀䘀　䌀䘀䘀䐀㜀㔀㔀　䄀㌀㐀㌀㔀㈀䔀㈀㌀䄀㤀㔀㠀㄀䄀㠀㜀䈀䈀䈀㈀㠀䌀㌀㐀㈀䐀　㈀㠀䄀㠀㘀㠀㠀㠀　䘀㠀㈀䈀䄀䈀䄀䌀㜀㄀㄀㄀㘀　㔀㐀䈀䔀䄀䘀䔀䘀䐀䐀㐀㠀㜀　䈀䄀䘀䔀䘀㈀䌀䔀㐀㘀㜀䄀㠀䘀㠀㘀䘀㄀㈀㌀䐀䐀㠀㜀　䔀㜀㘀　䈀䔀㐀㜀㠀㘀㈀䔀㌀㔀㜀䘀㐀㤀㜀䐀㄀䘀㈀㌀㄀䄀䈀䌀䔀㐀䄀䄀㘀㘀㄀㘀䔀䄀㠀㜀　䐀䐀㘀㌀䘀䘀㐀䌀䄀䈀䄀䌀㜀㈀㤀䈀㐀　䄀㜀㘀㔀㜀㤀䈀㜀䄀㤀䌀㈀䄀䈀㌀㌀䔀㜀䄀䘀㌀㌀㐀㈀㘀䌀㌀䄀㜀㤀䐀　㤀㄀㔀㈀䐀㠀㄀䘀䈀㈀䌀㤀㐀㔀㄀㌀䈀䐀㌀䐀䐀㤀㈀㜀㐀㜀䐀㘀㄀㤀㐀㈀䌀㘀䈀㠀㤀㤀㄀㄀䈀㈀䌀㜀䔀㜀㌀㐀䄀䈀㈀䘀䔀㜀㌀䄀䔀㌀䌀䔀㐀䘀㜀㔀㤀㤀䄀䔀䔀䘀㔀䄀䌀㘀䘀䘀䌀㜀䄀　　䄀㤀㠀㘀䔀䐀㄀㐀㤀　㄀㠀㠀㈀　䄀　㜀㄀䘀䘀䌀㐀㔀䄀　䘀㈀䈀㜀㌀　㜀䐀䔀㈀㤀㘀㈀㐀㜀㔀䔀㘀㤀䘀㔀㔀㠀㘀㄀䌀䐀㔀㠀㄀㘀䌀㈀㠀䘀㘀㤀㠀㠀㜀㄀䈀㜀䘀䈀㌀䔀㐀㔀䐀䔀㐀䔀㌀䘀㌀䔀㌀　㌀䈀㐀㌀㐀㤀䐀䘀㈀㐀䌀㐀㜀䈀㘀㄀䐀䌀㌀㤀㈀㔀㌀㄀䌀䌀　㈀㠀㘀㈀㤀㌀㘀㐀䌀　㌀䄀㌀䐀㄀　㔀㌀㘀䐀䄀㄀㤀䈀㜀㈀㌀㐀䔀䔀䈀㔀㌀䄀　䄀㐀㤀䌀䄀㤀㈀䈀㘀䄀䘀䈀䐀䐀䄀㔀㈀㌀䌀䈀㄀䌀㜀㜀䘀䘀㔀㠀䌀㜀㔀　䈀㐀㌀䈀㐀㠀䄀䌀㔀䈀㔀㘀䌀㌀䐀㄀㈀䈀㌀㘀　㜀䄀㄀䘀㜀㜀䌀䐀䐀㌀䈀㐀䌀㘀㤀㠀㄀㤀䐀㜀㄀㔀㜀䄀㈀䌀䔀㔀㠀䄀㔀㠀䌀䌀䐀㐀㐀　䘀㌀㘀䔀䈀䐀㘀㈀㠀㌀㈀　㔀䌀䈀䐀㐀䘀㤀㔀㘀䔀䄀䌀㈀㌀䌀㌀䐀䔀㌀㜀㄀㐀㔀㠀㤀㘀䔀䄀㜀䐀䐀䔀㄀㜀㈀䐀㤀㘀㐀㘀㄀㄀㈀㌀　䄀䌀　㈀䌀㘀䐀䐀㔀䐀䌀㈀㌀㐀䈀㄀䄀㘀㤀䔀㘀㜀䄀㔀　㈀㄀㔀㐀㔀㘀䄀㘀㐀㌀㔀㔀　㈀䌀䈀䄀䐀㄀㄀䔀㤀䄀㜀䘀㄀䄀㈀㤀䘀㐀㈀䌀䘀䄀　㤀䐀䘀㘀䔀䌀䘀䘀䈀䄀䌀㤀㤀㜀䐀㤀䐀㠀䐀㈀䔀㠀㌀䄀㔀䌀䔀㈀䈀䘀㔀　䐀㠀䌀　　㐀䌀㄀㄀㠀㈀䌀㘀　䐀㄀㐀㤀䐀㄀䐀㐀㄀㘀䘀㠀　　䔀䔀㐀䔀㔀䔀㄀䐀䔀　㤀㜀䄀㤀䘀㘀㔀䐀㤀　䌀㌀䐀䔀㜀㠀㈀䔀㔀䘀㠀㤀㤀䈀㔀㄀䔀䘀㐀㜀㘀䈀䄀䌀㈀䄀䌀㘀㌀㜀㌀㜀㠀㄀㜀㠀㔀㈀䐀㄀䐀㘀㔀㤀㤀䘀䔀㘀䘀䌀㜀䔀㘀㔀　　䔀䔀㠀㈀䔀㈀㈀䌀㌀㜀㐀䈀䄀䘀㈀㠀　㌀㈀㤀㐀䌀䔀䌀䐀㤀㈀　　䔀㘀㠀㐀䐀㌀　㈀䐀　㐀㄀䈀　㄀㐀㠀䈀　㘀㤀㔀㤀㄀䈀㄀㄀㤀㔀㄀㄀䌀㜀㔀　㜀㤀䈀㤀㄀㐀䘀　㐀㠀㘀㄀䈀㜀䐀㜀䄀䐀䔀㘀　䐀㔀䄀　䘀㄀㄀㜀㈀㤀㄀䘀䐀㄀㈀㠀㄀㈀䌀㔀㈀㠀㔀㐀䘀䐀㜀䐀㈀䄀䘀㜀㌀䐀䘀㔀䐀䔀㄀㤀　䄀䔀㌀㜀㠀䄀䈀㌀䌀　　㐀䔀㔀㜀㜀䄀䐀㄀䘀㄀㌀䌀㐀䘀䘀㔀䈀㈀䄀㜀䘀䔀䘀䘀䈀㤀䌀㈀㠀䔀䄀䔀㐀㐀㔀㤀㄀䔀䔀䐀䄀䔀㌀㈀䘀㔀䘀㌀㠀䌀䔀䄀䐀䌀㜀㈀㄀䔀䄀㠀䈀㈀䐀䌀㔀㠀㜀㤀㠀䈀㐀㘀㤀㜀㘀㤀䈀䐀䐀　㐀㘀䐀䌀㈀㔀䄀㠀㄀䈀㤀㐀䐀㈀㔀㘀㄀㠀㔀　䔀㘀㔀㤀㌀㌀㐀䈀㌀㔀㘀㈀㄀㔀䔀䈀䌀㐀䄀　㜀㔀㠀㐀䔀䄀㤀㠀㜀㐀䄀㄀㐀㜀㜀㈀㈀㘀㘀䌀㈀㠀㌀　䌀䌀　㈀䌀㘀䘀㌀㐀㘀䔀㜀㤀䌀㘀㜀㤀㔀䔀䈀䌀㘀䌀㠀㘀䄀䌀䌀䈀㜀㠀䄀㌀䐀䄀　㜀㌀䐀㈀䔀㄀㘀㄀㈀㄀䄀　㔀㈀䘀䐀㄀　㈀䔀䈀䔀䄀㌀䌀㄀㈀㌀㌀㠀㘀㠀㌀　㌀㐀㐀㐀㄀䄀㄀㜀㠀䐀㄀㘀㐀㔀㈀㄀㐀䈀㈀䌀㄀䄀䌀䌀䔀䔀䘀䄀䐀䘀　䐀㄀㐀㐀䐀㜀㄀㘀䐀㤀䔀䐀䌀㠀㌀㔀㄀㠀　㠀㔀㠀　㤀㔀㜀㄀䄀㔀䄀㈀㄀䈀㐀㘀㤀䔀㘀䈀䄀䐀　㜀䈀䐀㄀㄀　䘀㐀䄀䌀䐀㌀䄀㌀㘀㠀㜀䌀㘀㐀䔀　㜀㠀㐀䘀㘀䌀㘀䄀㌀㔀䈀㈀㜀㌀㘀䌀㜀㔀䐀㘀㈀㐀㘀㠀㘀㈀㤀㄀䄀㘀㜀㌀䄀䘀䌀㠀　䈀㄀䔀㤀䔀㄀㔀䔀㄀䐀㘀㌀㜀㌀㠀　䐀㈀㔀㈀㜀㜀䈀　㔀㤀㌀䌀䔀䘀㈀㜀䔀㘀䌀䐀　䘀㤀䐀䌀㌀㔀䈀㔀䈀㌀㐀㠀䄀䄀㐀䔀䌀㤀㜀㔀䈀䔀䈀䄀㄀㜀㘀㜀㐀䔀䔀㘀㜀㈀䈀䔀䐀㠀㜀㔀䈀䌀㔀㠀　㔀㄀䌀㘀㜀㜀䄀㤀㠀䌀䄀㠀㤀㌀㄀䘀㈀䈀　䐀　㠀　㘀㄀㐀䐀䌀㌀䈀䐀䈀㘀㠀㔀㜀䄀㈀㈀㠀㜀䘀䐀㄀䈀䈀㈀　㐀　䔀㠀䘀㠀㤀䘀䈀　䐀㄀㘀䔀㌀㤀䈀䐀䘀䔀㤀㤀䐀㄀㘀　㠀㤀㤀䘀䌀䔀㘀　䐀㈀㜀䄀㠀㤀㈀䔀㐀㄀䐀䐀䄀　㜀㐀㌀䈀㤀㔀䐀䘀㔀㜀䄀䌀㤀㤀䄀㔀㠀䄀䄀䌀㄀㌀㠀㈀㄀　䌀㄀㠀㈀䌀㈀䘀㜀㘀䘀䄀䌀䈀㈀㈀䌀䈀䘀䌀㠀㠀㘀䔀㐀䐀䌀䔀䌀㘀㄀㄀㔀㌀　㠀䌀䐀䌀㠀䌀䌀㐀䔀䌀㌀㄀㘀　㐀㐀䄀㄀㔀㌀䌀㌀㜀䔀䐀　㤀㠀㈀㈀䄀䈀㄀㄀㠀䐀䘀㘀䔀㠀䄀䌀㔀　䌀䘀㜀㐀㔀㈀㜀㜀㠀䈀㌀㠀㐀㌀䔀䘀㈀䔀䐀㌀䘀䘀㜀䌀䌀㌀　㠀䌀㘀㈀㠀䈀䔀㤀㌀䔀䔀䐀䘀㄀䘀䔀㈀㜀㔀　㌀䌀㔀㜀㤀㔀㘀㤀㔀䔀䐀䌀䌀䔀㐀㄀䔀㌀㐀㈀㘀㤀䐀䘀㄀䔀㜀　䄀㠀㌀䌀䔀䘀䔀䈀　㔀㔀㈀䔀㄀㠀䔀㌀㐀㄀㘀䘀㜀㐀䌀䔀㈀㘀㌀㘀㠀㜀㐀㘀㜀㤀䈀㠀䈀䔀䔀㜀䈀䐀㘀䔀䐀㠀㄀䌀㔀㜀　㠀㌀䈀䌀㌀䔀㐀䌀㈀䌀䈀㤀㐀㔀㜀㄀㐀㤀䈀㜀㐀䔀㈀㘀䈀㤀㐀㠀䔀㄀䈀㄀㐀㘀㘀㄀䐀㘀㌀䔀㌀䈀䔀㠀㌀䔀䈀　䔀㌀㘀㌀䈀䐀䈀㔀䄀　䘀㠀䌀䘀㌀䈀䌀䘀㤀㘀䌀㠀䈀䈀㈀㜀　㠀䈀䘀㜀㔀䈀䘀㐀䌀䌀㄀㔀䔀䌀䔀䔀䈀㘀䘀㌀䘀㔀㜀䄀䐀㜀䐀䐀㜀䄀㌀䄀　㌀㄀㘀㜀㜀　㈀㈀䘀㔀㈀䈀䔀㌀㜀䈀㐀㘀䄀㄀㤀㐀䄀䐀䄀㔀㈀㔀㜀䄀㈀㔀䔀䄀㘀㔀䔀䔀㜀㜀㔀㘀䔀㌀㤀䈀䐀䘀䔀㤀䐀䐀㤀㐀䈀㠀䐀㈀䔀䐀㌀㜀䄀㤀㤀㄀㤀䐀䔀㜀㌀㠀㌀䐀㈀　㜀㄀㐀㔀䘀㌀䈀㤀㘀㈀䄀䈀㈀㐀䔀䘀㜀㈀㤀䐀䌀䘀䐀䄀䐀䐀䄀㌀㘀䔀㄀㐀䌀䐀㠀㔀　㘀　㔀㠀　㔀　䌀㘀　㐀䄀䈀䔀䐀　䌀䄀㌀䌀䘀䄀䐀䄀䘀䔀䔀㜀䌀㤀㌀䈀㐀䐀䄀䌀䌀㘀䄀䘀㤀㈀䘀䘀㘀㤀㌀䌀䔀䌀䘀䔀䘀䐀䄀㤀䘀䔀䄀㜀㔀㌀㈀䔀　㠀䌀䘀䔀㌀㤀㐀㌀㘀㄀䄀㈀㠀䐀㘀㄀㤀㐀㈀䐀㈀䐀㠀䐀䔀䄀㤀䐀䘀㜀㔀䘀䄀㤀㐀䈀䄀㠀㌀䐀䔀㤀䄀䐀㠀㤀䌀㜀㌀㘀䌀㜀䌀㐀㠀䄀㜀䔀　㤀䘀䄀䘀㜀㤀　㜀䌀㄀䔀㔀㤀䐀䈀䔀㄀䈀㠀㌀䌀䄀㜀㠀䈀　㄀㤀䘀䈀㘀䔀㄀　　䔀䄀㤀㈀㄀䔀㔀䌀䘀䄀䌀㤀䔀䌀㤀㠀䄀㈀䌀㈀　㠀㈀㄀㌀㘀㄀㐀㈀䌀㜀䄀㔀䐀㌀䐀㄀䐀㤀䌀䔀䈀㔀䘀䄀　㌀䐀㘀䐀䄀䔀㤀䐀㘀㈀㘀㠀㈀㈀䈀䘀㔀㤀㜀䄀㔀䔀㌀㘀䌀䘀䐀䄀䔀䄀䈀㤀㜀㘀㠀㤀䌀㄀㤀　䐀㐀䄀㌀䈀䈀㄀㔀㐀㄀㄀　㌀䔀䈀㘀䘀䈀㜀㄀䈀　䌀䈀㌀㠀　　㄀㈀㤀㐀㌀㌀㌀㔀䔀䐀　㔀㤀䄀　䈀䌀䈀䈀䘀㔀　　㌀㜀　䌀䈀㠀㜀䄀㠀䌀䔀䘀㐀䘀㤀㘀㜀䈀䌀䔀䌀㤀㌀䌀䈀㠀㘀䐀䄀㈀䈀㠀㜀㌀㤀䌀䐀䘀㜀㔀㘀㈀䄀㤀䄀㘀　䌀㠀㘀㔀䐀䌀　㐀䌀㄀㘀㄀　㔀㈀㔀㌀㐀㤀䈀㠀㠀䌀㄀㜀㐀䈀㘀䌀㜀㈀䌀　㠀䌀㜀㌀䐀　㠀䐀㈀㈀㈀㜀㘀㌀㘀　㄀䈀㜀㠀㘀㐀　㄀䐀㌀䐀䔀㐀䘀䔀䘀䈀䄀㠀㠀䈀㌀㄀䐀㤀㔀　䐀䔀㌀㠀㌀㐀㈀㤀　䈀㔀㜀䈀㌀䈀㌀䄀㤀㠀䘀㜀䔀㘀㔀㠀䄀䈀㘀㜀䈀㤀㘀䔀䌀　㌀㜀㘀䘀䈀㈀㔀㈀㘀㜀䘀㈀㜀䈀䌀䈀䌀㠀㤀㠀㘀㐀　䌀䄀䈀㠀　㐀㄀㄀㄀㠀㜀　㤀　　㄀䐀䌀㠀　䐀䌀䘀䄀　㐀䄀䔀䈀㘀㠀㔀䌀㘀㘀㈀㘀㈀㠀㈀㜀䔀㤀㤀㠀㈀㠀㘀䌀㜀㜀䈀㌀㠀䄀䈀㈀㠀㐀㤀㈀䘀䔀㤀䔀㤀㔀㐀㈀䔀　㜀㠀㌀䐀㐀㜀㌀㜀㌀　䄀㈀䘀䈀㐀䔀㤀䘀㌀䄀㜀㔀㠀㤀㠀㈀㤀　䐀㌀䘀䐀㔀㠀䈀㜀䈀㌀㐀䌀䐀㠀㔀䄀䘀㄀䔀䔀䄀㌀㌀㐀䐀㐀䌀㔀㠀㤀㔀㈀　䘀䈀㘀㠀㌀䘀㔀㌀䔀䈀䄀㄀䐀㘀㠀㐀䄀䔀䌀㠀㄀㔀　㠀䔀㐀㈀䄀㜀䈀㈀㐀䈀㄀㠀䔀㔀㈀㈀㜀䈀㐀㔀䐀㈀䐀㌀㈀㤀㔀㤀㤀㈀䄀　䘀䈀㠀　㌀㈀䈀䘀㔀䈀㘀㤀㐀䈀䘀䐀　䐀䄀㌀䘀㐀㘀㐀䄀㤀䔀㄀䈀䔀㜀䘀䐀㤀㈀䐀㜀䈀䈀㐀㜀䔀䐀䘀䄀㠀䘀䌀䔀㘀䐀㤀㔀㤀㐀㘀㐀䘀㌀　䄀䌀　㈀䌀㘀䔀䐀㜀䌀㔀　䈀㈀㌀㈀㔀䈀䘀　䌀㌀䈀䈀䔀䄀㘀㠀㔀䌀㄀㠀　㄀㘀䌀㘀䘀䔀㠀䌀　㜀㐀㌀䌀㌀䄀䈀䐀㔀㌀㤀㘀䔀䌀䘀䈀㔀㠀㘀䈀㄀㔀㐀䐀䌀䄀㜀㌀㌀䄀㌀㄀䌀㈀䌀㐀㐀䐀　䄀㈀㈀㜀㔀㠀㤀㜀㈀㠀䘀　䔀㐀䘀　㜀㠀㜀㈀㤀㐀㈀㘀䘀䘀㌀㄀䄀㠀㔀㔀㄀㄀㜀㈀㜀䘀㄀䌀　䔀㐀㌀　㐀㌀䘀㄀䐀㌀㄀䐀㔀䐀㄀　㈀㄀㜀㐀䐀䌀㔀㠀㤀㄀䈀䐀㄀㈀　㠀㤀䔀䘀㐀㜀㐀㐀䄀䔀㈀㘀㌀䔀㘀䔀㌀㤀㐀䔀䘀䌀㔀䐀㘀䔀䄀㘀䘀䐀㠀㈀㤀㜀㤀䐀䘀　㠀㠀㠀䐀㈀㄀㐀䌀㄀䔀㌀㔀㐀㌀㜀㜀㄀䘀䌀㐀䔀㘀㤀䌀䔀䌀㠀㤀㠀㜀㐀　䌀䄀䈀㠀　　㄀㐀䔀㤀䘀㌀䄀㤀䄀㘀㠀䐀䌀㔀㤀㜀䄀　㘀䄀䐀㐀㠀㘀㜀㘀㌀　䘀㠀㜀㔀㌀㤀㘀㜀䔀㐀䄀䐀䘀㠀㠀㤀㔀䌀䌀　㘀䐀䘀㈀䔀　䐀䔀㄀䄀㘀䐀㐀㈀㔀㌀㌀㄀䔀㌀㘀䐀㈀㈀㄀㌀㠀㄀　㜀㈀㜀䔀䐀䄀䔀㄀㔀㘀　䐀㜀㄀㈀㈀㌀䌀㔀㠀㤀䄀䌀䌀䈀㔀㠀䄀㌀䔀㜀䔀㔀㈀　㠀㄀㌀㘀㄀䈀㠀䄀䈀㔀㔀㄀㐀㜀　㜀䄀㌀䄀䔀㔀㌀㐀㠀㔀䔀㜀㜀䔀㜀　䐀䐀䈀䘀㠀䐀䘀䈀㄀䈀㜀㘀㐀䄀㌀䔀㜀䄀㤀㐀㈀㌀䈀䔀㘀㜀㔀㠀㐀㔀㜀㔀㌀㌀㠀㌀㐀㄀㠀　㔀䔀㘀㜀㜀㤀䘀㜀㘀䄀䌀㘀㈀㐀㘀㌀㔀㠀　㔀　䌀㤀䐀䐀㔀㜀䐀䐀䔀㐀䔀㠀㘀㘀䔀䄀㔀㠀㤀㈀㘀䄀䐀䄀㌀㈀䔀㌀䘀㌀㈀㠀㄀㜀㠀䌀㘀䈀䈀㠀㌀㌀㌀㌀䄀䈀㌀㘀䄀䘀㈀㌀㜀䈀䌀㈀　䘀䌀䔀䔀㘀㐀䘀㐀㤀㠀㤀㄀㌀㄀㈀㤀㄀㠀㔀㘀　㄀㤀㌀㤀㄀㤀㄀䐀㄀　㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䌀㠀　㈀㈀㘀㈀㌀㈀㌀䄀㌀㘀㜀䔀㠀㄀㜀　㄀　㌀㈀㔀䘀䌀㌀㘀㈀䈀㜀㜀䈀㐀㠀䔀㔀㠀䈀㔀䌀㜀　㐀㈀䈀䐀䔀䈀䄀㔀䐀䄀㘀䔀䔀㈀㤀㤀䔀㠀䐀㘀䌀㜀㔀㠀䔀㠀䄀㜀䄀㜀㄀㈀㐀䌀㐀㐀㐀㄀䐀㈀䌀㠀㄀㘀㄀㌀䈀㐀㘀㘀㐀㌀㈀䌀䄀䄀㐀　䔀䔀䔀䐀　䔀䈀㄀㈀㤀䈀㌀䌀㤀　㔀㘀䈀㘀㄀㔀㔀　䐀㘀䐀　䘀㘀㌀㠀　㈀䄀䘀㘀䈀㌀㜀䐀　䘀䈀㘀䌀㈀㌀䄀㠀㌀䈀㄀㈀㠀㔀㜀㘀䐀䄀㜀㐀㘀㐀㐀㤀䈀䈀㄀䐀䐀㤀㈀㤀㘀㈀㌀㠀䘀㌀䄀䌀䐀䌀㘀䔀㜀　㔀㌀䘀㈀㐀䔀䈀㜀㌀䈀䌀䌀　㤀　䈀㌀䘀㐀㜀䔀䌀㘀㔀䘀䄀㤀㄀䘀㔀㄀㤀䘀䄀㐀㔀䌀　㔀　䄀㄀㔀㐀㌀㘀䌀㜀㠀㤀㔀㈀㜀㄀㘀䘀䈀㜀䌀䄀䈀䈀㌀䌀㐀䔀㠀㄀䐀㠀㔀䈀䌀㈀㐀㘀㌀㌀㄀䄀㠀㤀㄀䘀䌀䔀䌀䔀㤀䔀㄀㌀㈀䄀　　㌀䘀㄀䈀㤀㜀䔀䄀䐀䐀䔀䐀㄀㐀㄀㘀䐀㘀䈀　㤀㠀䐀䄀㐀㜀㈀㜀㔀㄀䔀䌀　㤀䌀㄀㈀㈀㤀䄀㌀䌀㈀䘀䐀㌀㌀䐀㜀㘀䌀㌀䈀㈀䔀䘀㠀㐀　䔀䌀㈀䄀䔀㔀㤀㜀㜀㤀䌀㐀㐀㐀㌀䘀㌀㠀㌀䐀䔀㠀䘀㔀㈀䈀䌀㌀㠀㄀㔀䐀䄀㔀䄀㘀㤀㔀㤀䄀㄀㘀㜀㐀㜀㔀䈀䔀㔀㘀　㠀㤀㄀䐀䈀䈀䌀䘀㔀㜀䘀䄀䐀㠀㈀　䌀㜀䄀㘀䈀䄀㐀㄀㌀䐀㐀㘀㘀㐀䈀䔀䌀䄀　䘀䌀䄀䘀䈀㌀　㘀䈀㜀㘀䄀㐀㐀㐀䐀㤀䘀㠀㐀㘀㐀　䘀䔀䘀䄀㘀䔀䔀㄀㐀㔀㈀䄀㔀㜀　䘀㠀䘀䘀䄀㜀䄀䄀㔀䌀䄀㤀㐀䐀䐀䌀㜀㜀㐀㐀㈀㜀䌀䄀䔀䔀䌀䄀㠀㌀䄀䈀䌀㐀　㘀㤀㤀䔀䄀䐀㜀㐀䐀䌀䄀㐀㌀㐀㐀㐀㘀㜀㔀　䘀䈀㔀㤀䔀䈀㘀䔀䔀㠀䐀㌀㄀㔀㤀㜀㌀䈀㜀䐀䈀䄀㔀㔀㘀㤀䈀䔀㐀㌀䔀㤀䄀㔀䐀䌀㘀㈀㤀䈀㜀㄀㠀㜀㔀㠀䘀㌀㔀㐀䈀䔀䘀䈀䄀㤀㜀䌀㈀㤀䈀㜀㘀㔀㔀㘀㄀䐀㔀㤀䈀㈀㠀㄀䌀䄀䔀㜀㈀㐀䔀㔀䐀䘀㠀䘀㈀䐀䌀㄀䄀䘀　䔀㜀䈀㤀㄀䔀㈀㤀㄀㈀㔀㌀㜀㔀㤀䔀㔀㜀䘀　㘀㄀䘀㌀㜀㘀䌀䈀㘀㘀㐀㈀㜀䘀㜀㔀䄀䐀㔀䐀䘀　㄀　䄀㤀䘀㐀䐀㤀㘀䈀䔀䈀㌀㤀䄀㜀㘀䈀㠀㠀䘀䌀㈀䘀㤀䈀㄀䔀䔀䌀䘀㔀㈀䈀䄀䘀㜀㔀　䈀㤀㔀㈀䈀䘀䈀㐀䌀㄀䄀㜀㈀㤀㠀䔀　㜀䄀䌀㌀䄀㠀㘀䌀㜀䐀䈀䔀㤀㘀㔀㈀䄀䄀䘀　㌀㔀㐀䄀䔀㤀㐀㌀㔀䈀䈀䌀䄀䔀㌀䘀㄀㈀䐀䔀䈀㄀䐀䘀䐀㈀㈀㘀　　　㔀䈀䐀䄀㈀㤀㔀　㄀䄀㈀㜀㤀㔀䔀㌀㠀㜀㔀䌀䐀㄀㤀㄀䔀㠀䈀　㌀㠀㈀㈀䄀㈀䘀㈀㌀䘀㘀䈀㘀㔀䄀㔀㔀　㔀㄀䔀䔀㄀㤀　䌀　㤀㐀䔀　㌀㘀㜀㜀䈀㌀䘀㄀䐀㤀㘀㐀䄀㐀䘀㤀䐀㐀㐀䈀㤀　䘀㄀㌀㌀䄀㌀㌀㌀䈀㔀㤀　䘀㔀㈀㔀䌀䔀䔀㄀　㠀㤀㔀㤀䐀㌀　䘀㄀㔀䘀㘀㐀䄀䈀䐀㠀䘀㤀㜀㌀㈀㄀䄀㈀䔀㤀㔀㐀㜀䌀㌀㐀㜀　㠀䘀㠀㈀䔀䐀䄀䘀㠀㠀䌀　䄀䄀㘀䐀㈀䄀㤀㜀䌀㔀䌀㄀䘀䈀䌀䐀㘀　㘀䘀䈀㄀㠀㄀㄀䘀㈀㜀㌀䄀㤀䌀䄀㤀䌀㜀㐀㌀㘀㌀㤀㔀㈀㈀㈀㘀䌀㜀㜀㔀䄀㐀䔀䈀䔀㜀䌀䈀㜀䈀　㔀㤀䄀䈀㤀㌀㈀䐀㐀㘀㘀㠀㜀㜀　㈀䈀㔀䄀䈀䌀䄀㠀㄀䘀㈀䐀䄀㔀䌀䈀䘀㤀䘀䄀䘀䘀䌀㘀䌀㘀㐀㤀㔀㔀䘀㄀㔀䘀䌀䌀㐀㐀㐀㘀㜀㔀　䈀㌀㤀㈀䘀䌀㤀　㠀䘀䌀㜀䄀䌀㜀㈀䘀䄀㠀㐀㜀　䌀㌀　䌀䔀㈀䄀㤀㐀䄀䔀㌀㌀㔀䐀㘀䐀䄀㘀㘀㜀㘀䐀㜀㜀㔀㤀㔀䘀㈀䔀㜀䌀䔀䄀䄀㄀　㈀䄀㐀㜀㔀䈀㜀㔀䄀䌀　㠀㠀㈀䌀㈀㐀䘀　　䘀　㘀㌀㐀䈀㌀㘀䐀㜀䈀㜀䔀㤀㤀㄀㈀㔀䈀㐀䈀䘀䐀㤀㔀㘀㤀㤀㤀　㄀䌀㄀㠀䌀䄀　㠀䄀㄀䔀䄀䈀䈀䈀㌀㜀䐀㘀㜀㌀㔀䔀㔀㠀㠀㘀　䘀㤀䄀䄀䐀䔀　㄀㈀㌀㐀䄀䘀䈀㤀䔀䈀䄀䌀䘀　䔀㜀　㠀㐀　㌀㘀䐀䐀　㤀䐀㤀㤀㘀䐀㘀㈀䘀㔀䔀䐀䐀㐀㠀䘀㔀㄀㜀㤀㠀㔀䐀䔀㘀㄀䘀　䈀䈀䐀䐀䘀䄀䌀㠀㘀㤀㔀㔀㌀䘀　㤀㄀㠀㈀䄀㄀䐀䌀㄀䈀　㔀㄀䈀㠀㤀㜀㌀䄀㠀㐀䄀㈀㔀㄀䔀㄀㈀䌀㠀㠀䌀㈀䘀㜀㈀㤀㌀䐀㄀䐀㄀䌀㌀䘀㈀㐀㈀䌀䄀㔀㜀㘀䐀㜀㌀䐀㜀㘀䔀㔀䈀㈀䐀㔀㌀䘀㌀䄀㠀㤀䄀㈀㈀㄀䈀䄀䈀㜀䘀䔀㌀㔀䐀㘀㜀䄀㤀䌀䌀㐀㐀䌀䄀䈀㜀㘀䔀㠀㘀䔀䄀㄀㌀㐀䘀　䄀䐀䐀䈀　䌀㄀㄀䘀䘀㘀㔀　䄀㜀䈀㤀㔀䐀䔀䈀䈀㌀㜀㌀䌀㈀㌀㘀䔀㜀㜀䔀㠀䘀㐀㤀㜀㔀㘀㌀㘀㠀㈀㐀㄀㌀䘀㐀㘀㘀㐀䈀㔀䌀㈀㐀㘀䌀　㌀㔀㌀㤀㔀㈀䄀㈀㠀㄀㈀䘀䐀㘀䈀䈀㜀㄀䈀㜀䘀　䌀䄀㈀㐀㌀䌀㐀㘀㘀㌀㜀㜀　㈀㌀㔀㔀㌀䐀䘀䌀䐀㔀　㌀䌀㜀㐀㌀㠀㐀䌀㄀䔀䌀䔀䈀㌀㜀㈀䐀㤀䌀　䈀䐀㘀䐀䄀䐀䐀䔀㄀㤀㔀㐀䔀䄀㌀䘀㜀㤀㤀㘀㔀㔀㐀䔀㤀䘀䌀㠀䔀䘀㔀㄀䘀䄀㠀㘀㄀㤀䐀㤀㄀䌀㘀䈀㘀䐀㌀㌀䄀㤀䔀䈀㠀㔀䐀䈀㤀㐀㠀㜀䌀㜀䘀㐀䔀䔀㌀㈀䄀䈀䐀䄀㄀䔀㘀㤀㐀　㐀　㌀㄀䌀䈀䈀䄀㔀㄀㘀㤀㜀䌀䐀䌀㐀㘀㄀䘀㔀㤀㐀㈀䐀䔀䄀㜀㈀㤀㜀䔀䔀䔀㈀㌀䄀䌀䄀㠀㔀㌀　㐀䘀䌀䄀䘀䄀䌀䄀䄀㜀㜀䐀䘀㔀㤀䘀䐀䄀　䔀䔀䘀䐀㘀㤀㈀㠀䄀䈀䌀㜀㔀㔀㐀䔀䘀䌀㘀㔀䔀㜀䘀㜀䌀䐀㔀㘀䈀㔀䐀䈀䐀㔀㈀䄀䄀㜀㜀䐀䘀㔀㜀䔀㘀䌀䄀㜀䌀䈀㤀㔀㔀䔀䌀㈀㐀㈀㠀㠀䐀䔀䄀㌀㜀㠀䔀㈀䘀㄀㈀䐀䔀䈀㄀䐀䘀䐀㈀㈀㘀　㘀㠀㤀䌀㘀䘀䄀䌀䈀㤀䐀䘀䔀䐀䐀䄀䘀䔀㌀䌀䘀䐀㔀䐀㄀　䔀䔀䄀㔀㐀䔀䄀㈀㘀䔀䈀㘀䐀㘀䄀㌀㘀㈀㤀䈀䌀䔀㤀䘀㠀㤀㘀䈀㔀䔀㄀䄀　䄀䌀㈀㘀䈀㠀㔀䐀㈀㜀㈀㜀㔀䘀㈀㘀䌀䄀䔀㤀䔀㔀㄀䈀㤀㌀㐀㠀㘀㔀㌀䐀䈀䄀㐀㜀㄀㄀　㠀䘀㄀㄀　㄀䔀㜀㠀㔀䐀䘀㤀䐀㄀䌀㈀㤀㈀䐀㘀㠀㄀㌀䌀䘀　㜀㤀㈀㜀䈀㤀䘀䐀㌀㔀䘀㠀㐀䐀䔀㄀䔀㜀䄀䔀㜀䐀㈀䘀　䘀䌀㐀䌀䔀䈀　䔀䔀䔀䘀㐀　㤀䐀䘀䈀䌀　㠀㤀㘀㠀䈀䄀䌀㜀䈀䘀䌀䈀　䔀㄀㜀䔀䐀䐀䈀㄀㈀㔀㤀䘀䔀䐀㈀㈀㌀䌀㘀㘀㜀　䈀䔀㠀䌀㘀㈀㠀㘀㠀㠀䐀　㘀䄀䐀䄀㔀㤀䔀䐀䄀㠀㌀䈀㘀㈀㈀㔀䄀㘀䄀䐀㘀㤀䄀㤀䈀㌀㈀䔀䄀䐀䘀䘀䌀㜀㠀䐀㜀䔀㄀㄀㌀　䈀䐀䌀　㘀㐀㌀㠀㠀㤀㘀䄀䔀㜀㐀㐀㘀㤀䈀㈀㄀䌀㈀䌀　䐀㄀㈀㜀䄀䔀㄀㐀㠀㠀㤀㌀　㌀㤀㤀㌀䘀䈀㔀㄀㤀䈀㄀㠀㔀㠀㐀䔀䄀䔀䈀㔀䌀㤀䌀㄀㜀㠀㠀䘀㈀䐀㐀㄀㐀　䘀䄀㐀䌀䄀䔀㤀䈀㄀㌀㄀㈀㠀㘀㄀䔀䘀䐀㈀㈀㘀　䘀䌀䐀　㜀　䐀㘀䐀㜀㘀㌀㌀㤀䐀　䈀䌀　㤀䔀㌀㘀㔀㌀㜀䔀䄀㌀㐀䘀㜀䔀䐀㤀䌀㈀㠀䘀㄀㠀䌀䔀㔀　㔀㔀㌀䔀㐀㤀㐀　㔀㐀㠀㔀㤀　㔀䘀㐀㈀䈀䌀䌀㜀㈀㄀㘀㔀䈀㜀㜀㐀䌀㐀㌀䈀䘀㘀㈀䈀㈀㄀䐀㈀㤀㈀䐀䈀㌀䌀㤀䌀㄀㘀䄀㤀䈀㔀䌀㠀䌀㘀㜀䐀　㐀　㌀　　䐀䈀䄀䄀㌀䄀䌀㐀㤀㐀㔀䈀䘀　㠀㄀㠀㌀䄀㈀㤀㈀䌀　㌀㠀䐀㤀㜀㠀䔀　㤀㌀䐀䔀㤀䌀㜀㠀㤀㈀　㈀㐀㄀　㌀䌀䄀䔀䌀䐀㜀㜀㄀䄀䘀㄀㈀䌀㜀䐀㠀䈀㐀㈀㠀䈀㠀䔀䌀䔀㤀㈀　㠀䄀㔀㄀䔀㐀䈀㄀㘀㤀㘀㌀䘀㌀䈀䔀䈀㜀䘀㌀䄀㌀䘀㐀䄀䐀䔀　䐀䘀㐀㄀䔀㌀䄀　䔀䘀㐀㈀　㈀㠀䔀㘀䈀䔀䄀㔀㜀㠀䐀　䘀䌀䈀䈀㜀㌀㘀䔀䐀㠀㠀㄀㄀䈀䘀㔀䌀䐀䈀㄀䈀䄀㠀㜀㄀䔀　　䄀㄀䈀　㔀㘀䌀䘀䄀䘀㔀㌀㤀䄀䘀㠀㘀㘀㐀㌀䐀䐀㔀䘀䄀䄀䈀　㐀㠀㌀䈀䌀䄀䈀㘀㄀㄀㈀䈀䐀㜀䘀㤀㈀㜀㔀䄀㜀㔀㜀　㌀䈀㘀㄀㔀䔀䄀㌀䔀㜀㌀㌀㄀㔀　䘀㐀䄀㐀　㘀㜀㔀䈀㌀㈀㌀㈀㠀㘀　䄀䘀䐀㈀㈀㘀　㘀　㜀㜀䔀㠀㜀㠀㐀䔀　䐀䌀䘀䈀㜀䐀㘀䔀㌀㐀㐀㔀　㠀　㈀㄀㐀　䄀　㘀㠀㤀䐀㈀㤀㐀㈀㈀㠀䄀㄀䈀㠀䐀䈀㐀㘀㘀㄀䄀　㤀䌀㜀㔀㠀㘀　㜀㠀䄀㄀㈀䌀㔀㄀㠀㄀䐀䐀䄀䈀䐀䌀㜀䘀䈀　㤀　㄀㘀㠀䐀䘀䘀䐀䐀䌀㘀㜀㘀㘀㌀䄀㌀䈀㈀㤀㜀䔀㄀㠀　㔀㤀㐀䄀㠀䄀䌀㜀䐀䄀㌀㠀㌀䄀㠀㜀䐀㄀㐀㤀䘀㔀㌀䌀㌀䐀㌀㄀㔀䌀㘀䄀䘀䘀㐀䔀䔀㔀㄀㐀䄀㠀䈀㜀䈀㠀㘀䘀㜀㌀㌀㜀㜀㔀㠀㤀䄀䌀䐀䈀㄀䐀㘀㠀㌀䐀䈀㔀㜀㈀䄀㔀䐀㄀䔀䐀䘀䐀㌀䄀䌀㤀㔀㘀䐀䌀㤀䌀㠀㄀㠀㈀䄀䘀㐀㠀䈀㠀　㐀㄀㠀　䘀㠀䄀㄀䔀㄀䔀㤀㜀㄀㈀㈀　㠀㤀㤀䈀㤀䈀䄀㄀䘀䘀㔀㄀䐀䌀䌀㐀㘀㔀㠀㐀䄀㈀㄀㜀㐀㔀㠀㔀䔀䄀㄀䔀　㜀㌀㠀㘀　㜀䌀䐀㌀䔀㤀䐀䐀㠀㔀㤀㄀䔀㄀㐀㤀㔀䘀䈀䔀䄀㌀䐀㘀㜀㄀㘀㔀㠀䘀㌀䘀䈀㜀䔀㄀㠀㘀㘀㄀㐀䌀䌀㈀㐀䄀　㜀䄀䘀䐀㄀㠀㠀䘀䔀㠀㤀㜀䌀㔀䐀㤀　䘀㘀㜀㤀䐀㤀㘀䔀䈀㜀䐀䐀䔀㐀㄀㠀　㈀㄀㠀䌀㄀䔀䐀㈀㜀㜀䘀䌀㜀㔀䐀䄀㤀㤀㤀㤀㐀䈀㌀䌀䈀㠀㜀䐀㠀㘀䘀㈀㜀㔀㤀　㔀㔀䘀䈀㘀㔀㐀㠀　㌀㌀㌀㌀㔀㘀㘀㐀　　䈀㈀䐀㈀㌀㘀㌀㠀㠀䐀　㈀䘀　㈀㠀㘀㐀䔀䘀䐀㜀㜀䔀㄀䘀䘀䈀㄀㘀㠀䌀㠀㌀䘀䐀　䔀㄀㌀㤀䔀䔀㈀㔀㤀㜀䈀㜀㜀㤀㠀䘀㠀䔀㤀䐀䘀䄀㜀　㘀㤀䐀㈀䐀䌀㜀䘀䐀㠀㈀㘀　㜀㘀㜀㔀䈀㐀㘀䌀㘀㄀㐀㐀　䈀䘀　㠀㤀㠀㔀䔀䔀㈀㔀䌀䌀䈀䌀㠀䌀㠀㔀㠀㈀䘀㤀㠀　䄀　㈀㘀㘀䈀㈀䐀㤀㠀㔀㠀䌀㠀䌀㠀䌀㈀䔀㌀㄀㄀㔀　㐀㐀䌀㐀㘀㐀㘀䌀㘀㜀䄀㐀㈀㄀㘀㌀　㄀㤀㄀㤀㄀㤀㌀䐀㐀㌀㄀㘀㌀　㄀㤀㄀㤀㄀㤀㌀䐀㐀㌀㄀㘀㌀　㄀㤀㄀㤀㄀㤀㌀䐀㐀㌀㄀㘀㌀　㄀㤀㄀㤀㄀㤀㌀䐀㐀㌀㄀㘀㌀　㄀㤀㄀㤀㄀㤀㌀䐀㐀㌀㄀㘀㌀　㄀㤀㄀㤀㄀㤀㌀䐀㐀㌀㄀㘀㌀　㄀㤀㄀㤀㄀㤀㌀䐀㐀㌀䈀䘀　㠀㄀㠀㘀䌀㠀㌀㜀　㄀䌀㠀㐀㘀䐀　䘀㜀㘀㌀䘀䐀㠀　䔀䔀㄀䈀䈀䘀㘀䌀㌀㜀䄀㠀㘀㜀㌀䄀㈀㄀䘀䔀㠀㜀䘀㤀䌀䘀䄀䔀　㠀䄀㜀　㠀㄀㤀㔀䐀䔀䌀㌀㜀　㄀㜀㠀㠀䔀䐀㄀㄀㜀㘀㐀㐀㔀䘀䈀㘀䐀㈀㠀㔀㈀㐀䔀䘀㘀㄀䔀䈀㠀㌀䘀䈀㐀㐀　䌀㄀㄀㤀䘀䄀㠀㜀㠀䈀　㄀䈀䌀㈀㄀㘀　㠀䐀㜀　䄀䐀䘀䈀㐀䐀㈀㜀㤀䐀㈀䔀䈀㠀䄀䔀䈀㘀䘀䄀䌀㌀㐀㄀㤀㜀㠀㤀䘀㤀㔀㈀䔀　䘀䄀㌀㘀㌀㈀㤀㈀䌀䈀㈀㜀㄀䘀㐀㠀㐀㐀㔀㌀㔀㜀㘀㔀　㤀䘀䈀㐀䐀㈀㘀㘀㠀䄀㜀䈀䐀㠀㈀䄀䈀㄀㤀㄀䔀䘀㘀㌀㔀㘀㄀䄀㔀　䘀䔀䄀䐀㤀㔀䐀㘀䐀䄀㔀㠀㜀䄀㜀䘀䄀㤀䈀㠀䘀䔀䄀㈀䈀㠀䘀䔀䐀䈀㐀䄀㜀䈀䄀㐀䈀㜀㔀㠀䔀㤀㐀㐀　㤀䌀㜀㐀㠀㌀䘀㔀㔀㤀䌀㄀䔀䔀㘀䈀䘀㔀䈀㘀㤀㔀㐀㄀㤀䘀㌀㠀㈀㈀䘀㤀䈀㌀䘀㈀䈀䄀䔀䘀䘀䈀　䐀㈀㠀㠀㤀㈀䘀䌀䔀㈀㄀䄀㜀㌀䘀䈀㌀㄀䔀㘀㤀㤀䈀䌀㜀䔀䐀䐀㐀䄀䄀䘀㘀䔀㔀䔀㤀㘀䄀㜀㔀㤀㘀㤀䈀㌀㐀㔀䘀䐀㤀䘀㘀㈀䄀㔀㈀㜀㌀㔀㘀䌀䈀㌀䘀䔀㐀䐀㘀㄀㜀䄀䐀䔀䈀　㌀㠀䘀䘀㈀䈀䄀䈀㄀䌀㜀㔀䔀㄀㤀㤀䔀䔀㤀䘀䄀䌀㌀䌀㌀㈀㌀㜀㌀䄀㤀㠀䌀㘀䐀䈀㄀䌀䄀㘀㄀䔀䘀㠀䘀䌀䌀㔀㈀㠀䘀㐀㈀㌀㠀䄀䘀䘀　㌀㈀䄀㠀䘀䔀䘀㈀㠀䌀䔀䘀㜀㔀䄀㔀㤀㠀䘀㌀㠀㈀䌀㜀䘀㠀㜀㤀㔀㄀㘀䔀䄀㈀䘀㔀㜀㔀䔀䐀䌀㈀㜀䘀㌀㐀䈀㤀㌀䈀㈀䘀䔀㔀㔀㐀䐀㄀䄀㌀㄀㜀㈀㜀䐀㠀㤀䐀㈀㠀㈀㌀䐀䐀䄀䌀㄀䌀㤀䘀䘀㔀䔀㘀㜀㔀䔀㌀䘀㌀㠀㠀䈀㜀䄀㠀䔀䐀㈀䘀㐀㠀　䌀䄀䔀　㄀䌀䄀㔀䐀䐀䐀䘀䌀㔀㜀䔀㠀䌀䈀㘀㐀㄀㌀䈀㜀䌀㐀䌀㘀㤀䌀㜀㤀䐀㈀㤀㘀䐀䔀㄀㠀㌀㔀㘀䐀䄀䈀　㜀㤀㌀䄀䔀䔀㔀㄀㄀䔀　䘀㔀㔀㄀㤀䔀㄀㔀䌀㠀䄀䘀䄀䈀䌀㔀㠀䔀㤀䌀　䈀䔀㠀䐀䔀㌀㜀䌀䘀䘀䌀㄀㐀䄀㤀䈀䈀㤀䔀䘀䐀㐀䄀㐀䔀㜀䔀㠀　䔀㘀㔀䘀㄀㈀㄀䔀㔀㜀䐀䄀　䐀㄀㈀䘀　㈀　㘀䄀㌀㐀　䈀䌀䄀㔀㔀㄀䈀㤀䈀㠀㘀㜀䄀　㐀㌀㈀䔀䈀　䐀㈀䘀㔀䌀㄀䘀㜀䄀䐀㜀㐀㔀䐀㐀㠀䄀㄀㘀㌀㈀㔀㐀䐀䔀㜀䄀㈀䄀㈀㘀㤀㈀䌀䘀㌀䄀䌀㘀䌀䐀　䘀䘀䈀㜀䈀䐀㜀㌀　㄀䐀㘀䄀䈀䄀䄀䔀䔀䘀㠀㐀䄀　㠀㐀㤀㈀　㤀㠀䘀　㐀䄀　㈀　㤀䌀㠀䔀㔀㈀㤀㘀㤀㐀㠀㘀　㐀㘀䈀㄀䘀㄀㌀㄀㌀㘀䄀㄀䈀㐀㘀㠀㄀㄀㐀䈀㜀㄀㤀䌀㘀㤀䌀㜀㤀㘀㐀㄀㘀䈀㌀䈀㔀㠀㈀䈀䈀㔀㜀㘀䔀䄀䐀㠀㐀㄀䐀䄀䐀㠀㘀㤀㤀䐀㔀㘀㜀㄀㌀䄀　㠀㐀㔀䄀䈀䔀㠀㌀㠀䘀㠀䌀　㌀䔀䈀　㐀㠀㈀㔀㔀㠀㄀䘀㜀㠀㐀㄀㈀㤀㔀㈀　㄀䐀㄀㄀㈀㤀䄀㠀　䌀　㄀㔀㄀㈀㌀　　䘀㐀㈀　㠀　㄀㤀㈀䔀㘀㐀㄀䔀㜀㌀㜀䔀㜀䈀䘀䔀㘀䔀䌀䈀䈀㜀㌀䌀䔀䘀㤀䈀䔀㜀䈀䈀㤀㠀㜀㤀䌀䘀䈀䈀㤀䘀䔀㌀㌀㜀㜀䔀䔀䘀㜀㤀䐀䔀䘀㤀䌀䈀䐀䐀㜀㔀䔀㜀䈀䔀䘀䈀㔀䘀㜀㔀䔀䄀䘀䌀㌀㠀　䄀㄀䔀㌀㤀㠀㔀䌀　䌀㔀　　㘀㄀㄀㈀㤀㄀㔀　㠀䄀　䄀㐀䔀㌀䐀䘀㘀㜀㐀㔀䐀䔀㔀㌀　㐀䌀㄀㔀䘀㔀㠀㤀㤀㘀䔀㤀　㌀㐀　䐀䔀㐀䐀㘀㈀㔀㠀䄀䘀䄀㐀㘀㈀䈀㠀㈀㈀㄀㘀㜀㘀㜀䈀㐀㄀㄀䄀㔀䌀䐀㘀㐀㘀㐀䈀㈀㈀㌀䐀　䘀䔀䐀　　䄀㈀㄀䌀㐀㌀㔀　㘀䐀䈀㜀㘀㤀㔀㠀㔀㈀　䘀㤀䈀㈀㄀㔀㌀㤀㔀䌀䌀㤀䌀䈀㐀䈀㌀㐀㌀㔀㄀㄀䐀㘀㐀㐀㔀㐀㄀㌀䈀䌀㐀㤀䔀　䔀㔀䈀　㄀㔀㐀㄀㤀㜀㜀㜀㘀㔀㘀㔀㤀㈀䌀䐀䔀䘀䘀㄀䄀䌀㈀䐀㐀㐀㔀䄀㌀㌀㜀㄀㤀㠀㄀㠀　㐀㐀㔀㌀㈀㜀㤀㔀㜀㠀䐀䈀㌀䌀䐀㤀㜀㘀㘀䈀䌀䄀㐀㐀䐀　䌀㜀䌀㈀㈀䌀㄀㜀䘀㐀䘀䘀㔀㈀㌀䈀㠀㈀䔀㔀㌀㌀䈀䈀䌀㘀䐀　㠀䌀䐀㈀㜀㄀㌀㔀䔀䘀䌀䄀䄀䘀㠀㌀㔀㐀䐀䔀䐀㠀㐀㠀䘀　㐀㠀㌀䈀䔀䌀㜀㠀䄀㘀　䐀　䈀㜀䄀㠀㔀䔀㈀㘀　䘀　㈀䘀㔀㐀䈀㘀䄀䘀㌀䐀㔀㈀䄀㠀䈀䌀㔀㠀㄀㐀㤀䘀㤀㜀䔀䘀㄀㠀㄀㐀㤀㌀䄀㘀㈀䌀㔀　㐀䔀㌀䈀㤀㄀㌀㈀䄀㜀㠀㌀䐀䄀㌀㠀㈀䌀㘀㘀䈀䘀㐀䈀䌀㠀䘀䐀䘀㐀㌀㈀䈀䈀䔀䄀㜀䘀䐀㌀㌀㐀㌀㤀䘀㌀䘀䄀㘀䐀䘀䔀　　㜀㜀㤀㤀䘀䐀㜀㈀㜀䘀㜀䈀䔀㔀㜀䘀㔀䘀䐀䈀㤀㄀㔀㠀䈀　䐀㐀㈀䔀䔀㄀䌀䈀㔀　㌀䔀㄀㐀㤀㤀䘀䈀䘀㔀䐀䔀㔀䈀䌀㐀䄀䈀䌀㤀㠀㈀㜀㄀䔀㄀䘀䄀　䘀䄀㐀㤀㠀䘀㐀䄀㤀䘀㈀㌀䔀㠀䌀㤀䄀䌀䌀㜀　㈀䘀㘀㤀㌀㄀䄀㜀䄀㌀䔀䐀　㠀㌀㄀㜀㘀㤀䘀㘀䌀㔀㐀㤀㠀䈀䄀䔀　㠀㄀㠀㐀　㈀㜀䈀　㔀䄀㌀㌀㘀㠀㤀㤀䄀　䄀䌀㤀㈀㤀㜀㔀䈀㤀㄀㈀㜀㠀㘀㐀㄀㐀䘀㠀䔀㄀㜀㌀䄀㠀䌀㌀㐀㤀㌀䔀䌀㘀　㔀㠀㘀㤀㤀㄀䘀㘀　䌀㌀䌀　㘀㈀㌀䄀㤀㄀㤀䐀㠀㤀㔀㤀　䐀㐀㤀㤀㈀䌀䘀㜀䄀䌀㄀㘀䔀䌀㠀㘀㔀㠀䘀䐀㌀䐀㔀䈀䐀䄀㘀㘀㈀䈀䈀㌀㤀䔀㄀㄀䌀㄀䌀䌀㠀　㘀㔀㐀㔀㈀㐀㘀㜀㐀䈀㔀㌀䌀䌀䐀㈀䔀㤀䄀㈀㠀㜀䘀䄀㌀䔀㘀䄀䌀㔀䌀㐀㈀㘀㠀㌀㌀䐀㈀䈀㄀　㠀㈀䔀㐀㄀䘀䄀䌀䔀　㈀㔀㘀㔀䈀　㄀㈀㄀㄀㈀䌀㜀㤀㜀㈀㠀䘀䘀㘀䄀㘀㘀㔀㔀䔀䄀䔀䔀䘀㘀㤀㔀䈀㔀㠀䘀㔀㄀㠀㘀㐀　㠀㔀㔀㠀㐀䌀㘀䘀䐀䄀㈀㜀䐀䄀䌀㘀䐀㈀㘀㤀　䘀㐀㌀䄀㄀䈀䌀䐀㐀䈀䘀䘀　䐀㄀䄀㐀㤀㜀㈀㐀䐀㜀　㈀㤀㐀㈀　䌀㈀㄀㌀㔀㌀䘀㘀㤀㄀䈀㜀䌀䈀䔀㐀㐀䘀㜀㌀㌀㤀㄀㐀㠀㜀㘀䌀䐀䄀䔀㠀㈀㜀㐀㤀㈀　㠀㘀㌀　㐀㈀㔀　㈀㠀㘀䐀䐀㄀㜀䌀㈀㠀䈀　㤀䌀䈀　㐀㘀㔀㠀㈀㄀㄀㌀㤀㌀䔀㈀䌀㜀䔀㌀　䐀㤀䔀　㌀㜀䘀䌀㐀㜀㄀㠀䈀䘀㔀㌀䌀䘀㘀䐀㔀㜀㤀䐀䘀䘀䄀㜀䐀䘀㠀䔀䄀㤀䔀　䘀㔀　㤀㄀㔀㌀㐀㄀䔀㘀㔀䈀䐀㤀㄀䘀㘀　䘀㌀䈀㄀　㈀㘀㌀㠀㐀㈀䘀㔀㔀䔀䐀㔀䈀䘀㐀　䘀㐀　㈀㈀㈀䔀㐀㐀㤀䘀㌀䘀㄀㄀䐀㈀䈀㜀㈀䐀䌀䔀䔀㄀㔀䌀䘀䐀㠀䄀㤀䈀　䐀㌀㐀㄀䄀㠀㈀㄀　㐀㐀㠀䌀㌀㠀㄀㄀　䈀䘀㐀䘀䘀㐀㜀䘀㌀㐀䄀㤀䌀䘀䌀㜀䐀㔀㔀㌀㘀䄀䘀䈀㘀䘀䄀䄀䔀䐀㤀䔀䐀㤀㈀䔀䄀㜀䄀㜀㄀㜀㈀䘀㜀㘀䐀䄀　　䄀　㐀䈀　㈀㠀㘀䌀䔀㈀㜀㘀㄀㌀㘀䐀䈀㐀䌀䔀㠀䈀䄀䐀㠀㠀䄀䔀䐀㌀㤀㠀䌀㘀㘀䈀䈀㐀㤀㘀㜀䐀䘀䄀㤀㘀䈀䄀㐀㔀㠀䔀㐀䄀㠀㐀㄀䄀㜀㔀䔀㘀㄀㘀㔀㔀䔀㔀㘀㔀㘀㜀䈀　㘀　䐀㐀㜀㈀䌀䈀㘀䄀㜀䘀䘀䐀䄀㔀　㄀䘀㤀㌀㠀㔀㔀䐀　㈀㤀㌀㠀䌀䌀㤀䈀㌀䄀㐀䔀㄀㔀䔀　㘀㈀㔀䄀㤀㈀㈀㔀㤀㘀䐀㔀㠀䄀㔀䐀㠀㤀㔀䘀　㜀䄀㤀　㠀䈀䄀䌀㐀㠀䌀䘀䌀　䔀䔀䔀䈀䐀䐀㈀䄀㠀䈀䐀㔀䔀䐀㌀㐀㌀䐀㜀㌀䄀㈀䌀䄀䘀㘀䄀䌀䘀䄀㐀䐀㘀㔀㈀䔀䌀䐀䐀䄀㐀㈀　䄀㠀㤀㠀䐀䄀䄀㠀䈀䄀㌀㠀䐀㐀㜀㤀㠀㠀䘀䈀㔀䌀䐀䘀　㤀㈀㔀䐀㐀䔀䌀䄀㐀䈀䄀㈀䈀㤀㤀㤀㈀㐀　䌀㘀㐀㠀㐀㈀䌀䔀㤀㈀㘀䌀㠀㐀䈀䌀㌀䔀䔀䔀䐀㤀㤀䄀䌀㘀䐀　䔀䐀䄀䌀㐀㤀㄀㠀㄀㔀䐀　㠀䔀㤀㈀㜀㜀㠀㄀㌀䌀　㌀䐀㘀䄀㄀㜀䈀䈀㈀䘀㐀䘀㘀䘀䌀㄀䔀䔀㠀㤀㔀㔀㜀䈀䄀䄀䘀㠀䌀㈀䄀㐀㐀㐀㐀㠀㜀　䌀㐀㈀　㘀㤀㄀㠀䈀䈀　䘀䈀㘀䘀䘀㜀㔀㤀㤀䘀㄀㜀㈀䈀䔀㈀䌀䄀䌀䄀㄀䈀㄀㄀㜀䐀㈀㌀㘀䌀䌀㐀䘀䄀䔀㤀㌀䈀䔀䔀㌀䌀　䄀䌀㘀䐀　䔀䔀䄀㘀㈀䄀㈀㜀㌀㐀㐀㐀㈀㈀　䈀㈀㌀㌀㌀㤀㔀䔀䐀䘀䐀㜀䔀䈀㔀㤀㘀㠀㘀　䔀㜀㐀㜀䐀䘀㈀㈀　䌀㔀䔀䄀㘀䘀㈀䄀㘀䄀㤀㐀䐀　㠀䄀䈀㄀㄀㈀䈀　㐀　䌀㐀㜀㌀䔀䌀䘀㔀㜀㤀㐀䐀㌀䌀㌀䈀㌀䈀䐀㜀㠀㌀㄀䔀㤀䐀㄀㈀㔀　㄀䌀㌀䄀　䔀㔀㠀㠀　㄀䔀㌀䐀㤀䄀䐀㜀　䘀䔀㐀㐀㠀䘀䌀㄀　䄀䌀　䐀㤀㤀㠀䄀䌀㘀䘀䄀䌀㤀䔀㘀䌀㘀㌀㤀㤀䈀　㘀䌀㜀㜀䌀㤀㐀䌀䌀㜀㤀㘀䘀㈀㈀㈀㈀䈀㈀㘀　䈀䘀䄀　㠀㈀㘀㈀　䈀䄀㠀䔀㜀㌀㄀䄀䔀䄀㘀㈀㈀㈀䈀　䔀㈀䈀㌀䘀㔀㈀㘀䘀㄀㄀㌀䘀䄀　䈀㈀㘀㌀㐀㄀㌀㤀㤀㘀䐀㌀䐀　㌀䔀䄀㌀㌀㔀㘀䔀䌀㐀䌀　　　㌀㠀　㤀㔀㠀䌀　㤀䌀㌀　㐀䘀䄀䈀䌀㄀㔀䌀㈀㠀㤀㐀㄀䌀㌀㘀䔀㠀㘀䐀䐀　㄀㈀䈀㄀䔀㌀䈀㌀　　㘀㄀䌀䔀㜀㜀㤀㜀㈀䌀㐀㤀㈀䄀㌀䘀㔀䐀㌀㔀㘀䈀䔀㘀䄀㈀㈀㐀㔀㔀䄀㈀㘀䌀㜀㌀㘀㈀㘀䐀㌀㠀㔀㐀㤀㔀䈀䈀䔀㘀㠀䔀㔀㠀䈀䔀㠀䌀㠀䌀䔀䔀㜀㜀㤀㜀　䄀㘀㠀䌀䈀㄀䌀䐀䐀㐀䌀㌀　䔀㈀㐀䔀㔀䔀㔀㌀䄀䘀䐀䌀㘀㠀䄀㠀䐀䄀　㠀　䐀䘀㐀䌀䄀㘀䄀䘀㠀㠀㠀䔀㄀䌀　㠀㠀䈀䐀䘀㔀　㄀䐀　㠀䄀䄀䔀㔀䔀㈀　㌀㐀㜀　㐀㜀㘀㤀㈀㔀㜀㔀㤀䈀㄀㄀㌀㐀㐀㌀㠀㈀　㔀䌀㌀㠀䈀䔀㄀䐀㈀䄀㄀䔀㈀㈀䐀㐀㄀䔀䐀㌀㌀䐀䔀㐀䌀㄀㈀㄀䘀㄀㄀㘀㌀䈀䐀㐀㜀㜀㔀㠀㌀㔀㜀㈀㔀䔀㔀䘀㔀㈀㐀㄀㈀㌀㌀䈀㌀䈀　㐀㌀㤀　䈀　䔀㄀㌀䘀㘀　䈀䐀㤀㜀㜀㜀㠀㤀㜀䘀㘀　䘀䌀㤀䐀㠀㄀㤀㔀䘀䘀㐀䐀㄀㈀䔀㜀䐀㐀䘀㔀㌀㤀䌀㜀㈀㈀䘀㜀䐀䌀㔀㌀㄀㠀䔀䔀㌀䌀㤀䈀㌀䄀㈀䘀㄀　㈀䐀㔀䌀㤀㜀㄀䔀㘀㔀㘀䐀㄀㜀䘀䄀䈀㜀䔀䔀㜀㄀䄀㜀䌀䄀㜀䌀䘀㌀㤀㄀䄀䈀㈀㌀㌀㔀㤀䄀㌀䘀㈀䌀㠀㐀䐀䌀㐀㤀㄀㤀㘀㄀㜀　㘀䌀䔀㐀䐀䔀䄀㐀㠀䔀㤀䈀㄀㌀䔀㜀㠀㌀㄀䔀㤀䐀㄀㄀㔀　㄀䌀㌀䔀䔀䔀㐀㌀㔀㄀㔀䐀㜀㔀㤀　㄀䐀㠀　㄀㌀　㤀㄀㔀㠀㈀㤀䌀㤀㈀㠀䌀㜀　䄀䌀㈀㘀䔀　㜀㐀㄀䌀㐀㠀　䘀䄀㐀　䘀㘀䌀䌀㘀㜀䘀㐀䘀䘀㠀㈀䔀㐀䐀䄀䐀䘀㈀㘀㤀䘀䐀䘀㔀㜀㔀㄀䌀䘀㠀㜀㄀䄀㘀㠀䘀䈀㤀㘀㤀㔀　䄀䌀㄀㠀䘀䔀䈀　䘀㜀䌀䈀㔀䔀㈀㔀䔀㔀㘀㔀䔀䈀㈀䘀㈀㌀㄀㤀㠀㄀㄀㔀㘀㈀㠀㘀㔀㄀㄀㠀䄀㐀䌀㔀　䐀㜀㘀㔀㜀䌀㔀䐀䘀䘀㘀䘀䄀䌀㈀㠀䘀㌀㤀㈀䄀䌀䈀䌀㐀䘀䐀㔀䐀　㌀㐀䐀㘀㌀㘀㜀㌀㈀䌀䌀䄀㜀㤀　㤀㤀㠀㄀㐀䔀䘀䈀　㌀㈀㈀㄀㤀㘀䄀䘀䔀䄀㜀㤀䘀䄀㐀䔀䔀䔀㔀䘀㤀㤀㜀䌀䈀䘀䌀㔀㐀㘀㄀䘀㈀㤀㌀㤀䌀㈀䈀䌀㈀㔀㜀䈀㠀㘀㐀㤀䌀㐀䌀㐀㌀䘀㈀㐀䄀㤀䘀㌀㜀䌀䘀䐀䌀㘀㤀㄀䔀䔀㄀䘀䘀㔀㤀㤀㠀㔀䔀㐀䌀䐀䘀䄀㔀䌀䌀㜀䔀䈀㈀䄀㄀䄀㠀䘀䌀㤀䔀䄀䈀䈀㌀㈀䘀䈀䘀䔀㠀㤀䔀䌀䘀䈀㄀㔀㔀㘀　䐀䔀䄀㔀䈀㔀㠀㜀㄀䐀䐀䌀㜀㤀䄀㄀䘀㔀䈀䌀　䄀㔀䘀䄀㐀䈀䌀㄀䐀㄀　㜀㘀㄀㐀䄀㄀䈀㄀㄀㠀䔀䌀䔀　㜀䔀䘀㌀䈀㜀䘀㜀䈀㐀㈀㔀䔀㠀㜀䐀㌀㔀㌀䌀㜀㠀䈀㠀㄀㐀　㔀㜀　㐀㐀䌀㄀䐀䈀㘀䐀䈀䔀㠀　㐀䔀　㜀㐀䔀　䌀䘀䄀䐀䈀䈀㜀㠀㐀䔀㜀䘀㄀䈀㤀㌀㘀䈀㔀䐀㜀㤀䔀㌀㐀　䌀䔀䌀䈀㄀㐀㐀䐀㠀㤀䌀䐀㔀䘀　䌀㤀䌀㄀䘀㄀㌀㠀㄀䈀㘀㘀㠀䄀䌀　㌀䌀㈀㘀䌀㐀㌀㄀䘀䘀㜀䈀㄀㈀䈀䔀䌀䘀㈀㤀㠀䐀䌀䄀䘀䔀㠀䈀䄀㠀　　㤀　㐀　㈀㤀㌀㄀㠀㔀䐀㄀㄀㌀　㘀䌀㜀䘀㌀㄀䄀㜀䔀㘀䘀䔀　㌀㤀䌀䌀㄀㔀㌀䐀䘀　䈀䘀㐀㄀䄀䔀㠀㘀　䐀㠀䈀䄀䄀㈀㠀㌀㐀㄀㄀㄀㠀㠀䌀㤀㄀㘀䌀㔀㌀　㜀䄀㠀䌀　㌀䘀㐀㈀䌀㘀㜀㘀㌀㐀䌀㠀䄀㈀㠀㠀䄀䐀㄀㔀㤀㜀　䘀䔀㐀㜀䐀㜀䘀㈀㄀㄀㈀䈀㜀䐀㘀䐀㜀㠀㠀䔀㄀㔀　䄀䌀㔀㈀㔀㤀㘀　䘀㜀㐀　䌀㈀㠀㐀䌀䐀䐀䘀䘀䄀㐀䌀䔀㘀㜀㠀㄀㘀㌀　䌀䌀㜀㈀㌀㤀㐀㜀㌀　㜀㔀䈀䘀㤀㄀䄀㔀㘀㠀䔀㐀㈀㤀䌀䈀㜀䘀䘀䌀㘀㐀䄀㔀䘀㄀䐀㘀㠀䘀䔀㔀䐀䐀㄀㠀䘀㐀䔀　㄀㜀㌀䘀㈀㈀䄀䐀㔀䔀㜀㌀䔀㈀㤀㔀㠀㠀㜀䘀䔀㈀䄀㈀㤀　䈀㄀䘀㤀㤀䔀㌀䘀䄀䄀　㄀㌀㔀䐀䌀㠀㠀㠀　㔀　㈀㄀䐀㐀㘀㔀㜀　㐀　䌀䔀㘀䈀䄀㈀䄀䘀䘀　㄀㤀　䘀䄀㔀䔀䄀　㘀　㐀㌀㜀䈀㠀䘀㘀㤀　䘀㜀䘀㄀㤀㈀㘀㈀㄀㄀㌀㄀㐀㐀䐀㌀䘀㔀䄀㜀䈀　㐀　䌀㔀㘀㄀㐀䌀䔀䌀㐀㤀㠀㄀䈀㄀㄀　㘀　㠀　䄀㈀㘀㌀㘀䄀䘀㜀䔀䌀䐀㜀䐀㘀䐀㌀䔀䄀㐀䈀㈀㄀㄀　㠀㐀䌀㔀䌀䌀䌀䄀䐀　㠀㠀㤀㈀㘀㤀䘀　㔀䄀䌀㈀㤀䘀㠀㐀㔀䔀　㌀㜀㠀㄀㌀　䌀㐀㄀㈀䔀　㘀䘀㠀䘀㔀䌀㘀㘀䄀㌀㜀䐀㜀㔀㄀　㘀䔀㈀㠀㄀㔀㜀㄀㜀㈀㐀㌀㔀㄀㠀䈀　㌀㄀䔀䔀䘀㈀㤀㐀䔀㜀䐀㔀㈀㔀㘀㘀㔀㘀㔀䄀㄀㈀㠀䈀䐀䄀䄀　䘀㌀䄀　䘀䈀㘀㐀　䄀　䔀㌀䔀㠀㠀䄀㠀　　㄀㔀㔀䘀䔀　㌀㔀㔀䈀䔀㄀㜀㐀䌀㜀䔀㜀㘀㈀䌀䔀䘀䈀㔀䐀㈀䌀㜀　　㠀㄀㠀㐀䌀㤀㤀㐀　㤀㠀䐀㈀㔀㠀㔀䐀䐀䌀䘀㌀䄀䘀䐀䄀㄀䐀㐀㘀㔀㤀㈀㈀㌀㘀㠀㔀㈀㔀䘀㤀䈀㐀䘀䄀䈀㈀䌀䘀䌀㄀䄀䈀　㈀　䔀㄀㔀㠀䔀㔀㈀䘀䌀䐀䔀䄀䔀㔀䈀㌀㤀　䘀䄀㈀䄀㜀　㠀䘀㤀䈀㐀䐀㄀㄀㄀䌀㜀㠀䐀㔀䈀䄀䄀䘀　䔀䐀㘀㄀㌀㤀㐀㜀㤀䔀䌀㜀㠀㄀　㠀㐀㔀㠀㘀㄀䈀　㄀䌀䄀㐀㌀䔀㈀㤀㔀䈀㐀㔀㠀䘀㤀㜀䈀㔀㜀䐀　䌀㜀㐀　㘀　㈀㤀䐀㐀㘀㤀㜀　㐀㐀䌀㤀㔀䘀䘀㐀　䔀䔀㜀䈀㜀㄀䄀䔀䔀䔀㘀㔀　㈀㘀㌀㌀㈀㐀㐀䔀㌀䌀䔀㌀㄀䔀㐀㜀䌀䐀䐀　䈀䘀　㔀䘀㘀　㜀㈀䔀㈀䈀㌀㠀　㔀　䌀　䘀䌀䌀㠀　䔀　㐀䐀㜀䘀㘀䐀㐀䐀㜀䌀㘀㄀䐀䄀㔀䘀䔀㔀㜀䔀㔀㜀　䔀䐀㘀㔀㈀䄀㘀㌀䈀䌀㌀䔀　䈀㌀㠀㘀㌀䔀㔀䈀䔀㌀䄀䘀䌀㐀㜀䘀㠀㜀㄀䐀㐀㐀㄀㠀㠀㔀㐀䘀㤀䄀㐀䄀䌀䌀䈀䌀䄀䔀㤀㤀㜀䌀䔀㐀　䄀　䐀㌀䔀㠀㤀㈀㠀　　㄀䄀㤀䘀䘀　　㌀䔀㄀㘀䈀㤀䔀䘀　㔀㈀㘀㐀㈀㈀㘀㄀䄀㈀䈀㌀䈀㌀䔀㈀䄀䘀㠀㌀䔀䔀　䌀㐀㐀㔀㌀䈀㌀㠀䌀㈀㌀　䘀㤀䘀㄀㠀㄀䐀㠀䄀㔀䘀䈀㄀　㈀䄀㄀䌀㤀䈀䘀　㐀䘀䌀　䈀䈀㌀㔀䘀㔀䈀㔀䌀㄀䐀䈀㤀㘀㔀䐀㄀㌀㜀䄀㄀䘀㜀㘀　㐀　㠀㠀㄀㌀㜀㠀㠀㠀䔀䘀㄀䘀䄀㈀䌀㔀　　㜀䈀䄀㈀㐀䘀㜀䐀㔀䘀㤀䘀䈀䔀䌀䘀㜀㈀㘀㤀䘀㤀㐀㄀㐀䘀䐀䐀㈀㄀㤀　㠀㜀㐀㄀䄀㔀䐀㄀㄀㌀　㤀㠀䘀㤀䔀䄀䘀䌀　㜀㄀䌀䈀㤀䔀䘀　㔀㔀㠀䄀䌀䘀䘀㄀䘀㐀㤀䄀䔀䈀㤀䈀㌀㄀㤀䄀䔀䘀㘀䄀䌀䘀㐀㈀㠀㐀䄀䐀䐀㌀䌀㔀䈀䔀㔀㘀䈀　㌀㔀䌀㄀　㔀䌀䄀䔀䘀䘀䐀㜀㘀㐀䈀䘀㔀㜀䘀㤀㈀䌀㜀　㤀䌀㌀㤀㌀䘀䈀䈀　䘀䔀䘀䐀㠀䐀䌀㔀㜀　㜀䄀㐀㐀㈀䄀㤀䌀䔀㈀㜀㈀㔀㈀䐀䄀䈀㔀䘀㌀䄀　㌀㠀㄀㐀䔀䄀㌀㈀䈀　㈀䄀㘀㈀䐀䘀㐀䔀㌀㔀㈀㌀䔀䐀㄀䔀㠀䌀㜀㔀㜀䄀㜀䌀㤀㈀㜀㈀㔀㄀　㄀㠀㄀㠀　䌀䈀䄀㠀　　㤀　㐀　㈀䘀䈀㄀㄀㈀㄀㘀　　㈀㠀㄀㐀　㘀䈀　㠀　㄀㄀㌀　㠀　㐀㔀䄀㐀㌀　㠀㤀㠀㐀　㈀　䐀　㄀䄀㐀㈀䌀　　㐀　㈀㠀㄀䐀㘀㄀　　㈀㈀㘀㄀　　㠀䈀㐀㠀㘀㈀䔀　㤀㄀㠀㌀䌀㜀㌀㜀㄀䘀㤀䌀㜀㈀㤀㠀䔀䌀　㐀㐀䘀㈀㠀㠀㤀　㜀　䄀㤀㤀䘀䐀㐀㠀㄀㜀㠀䈀䈀㄀㈀㌀䌀䘀㠀䄀㐀㐀䐀㈀䌀㐀㠀㄀䌀㐀㔀　䌀䐀　䈀㜀䘀㔀㤀䐀㈀㐀㔀㔀㜀㠀　䌀㘀㌀㠀䄀䌀㘀㘀㌀䘀㜀䈀䔀䔀䌀㜀䔀䘀䌀㔀㜀㌀　㔀㄀䄀㜀㐀㤀㤀䈀㈀㠀䔀㌀㐀　㌀䐀㤀㜀䘀䘀䐀㘀　㐀㐀㈀㄀䈀䘀　䄀㤀㈀㄀㌀㘀　䈀㤀㌀㌀㘀　㄀㤀　䔀㐀㐀　䈀㤀䐀䐀　㈀㠀㄀㐀㤀㠀㈀䄀䔀　㠀㄀㠀㔀㈀㈀㈀㄀㈀㜀㄀㠀䌀㈀㌀㄀䐀　㤀䄀㐀䘀㄀㘀㐀㈀㔀㈀㄀㌀㜀　㤀㠀㜀䌀㠀䄀䐀䔀㈀䌀㈀　㘀䄀䘀㔀㜀㐀䘀㤀㤀䌀㠀䐀䘀㘀䈀䘀㐀㌀䈀㐀㄀㤀㈀　㐀㄀㠀㄀㈀㄀㐀䌀㠀䔀㐀㐀㜀䐀　㜀㠀䐀　㈀㈀㈀㄀　㌀㄀䈀䘀㐀㄀䘀䄀㜀㌀䈀㐀䘀䘀㌀　㠀　㠀㤀㘀㈀㐀䈀㐀　　㘀㄀㌀㄀㐀䈀䘀㔀䌀䌀䐀㄀㜀㜀䄀㈀䈀㠀㐀㤀㘀㌀䌀㤀㔀䈀　㜀㄀　㌀　　㠀䈀㄀䈀㜀䄀㤀㜀䔀㘀㈀䄀㔀䌀㠀㠀㘀㜀㜀㤀㄀䔀䄀䄀㄀㔀䌀㠀㈀㄀㐀　㤀㔀䔀㐀㐀㈀　䌀䌀㔀　䈀㤀㜀㠀㈀㘀㄀㌀　㄀䔀䐀㔀䔀䈀㠀㜀㠀　㘀䔀㌀䌀㤀䘀䈀㐀䄀䐀䐀䈀䘀㔀㌀䘀㔀㔀　　㘀䌀㈀㠀䄀㠀䌀㘀䄀䄀䘀䐀㜀㌀䐀䌀㐀㌀㄀㔀䐀㈀䌀䈀䄀䘀　㈀㈀㐀㘀㔀　㤀㄀㤀㈀㄀㌀㘀䘀㘀㄀㄀䌀　㠀㌀䐀　䌀　㈀䌀㄀㐀㔀㌀㈀㈀㌀　㐀䌀䘀㔀㘀　䈀　㐀㌀䄀㠀㐀䄀䔀　㠀㄀㠀㠀㐀　㔀䌀㈀　㌀㈀㄀㐀㄀㘀䌀　䔀㤀㌀　䈀㘀䘀㔀㠀䐀䔀㄀䌀㠀　㤀㜀㈀䔀㤀㄀䐀　㐀䌀㜀　䐀㈀㌀㔀㈀　㔀㐀㠀㠀㌀㈀㘀㘀䘀㈀㈀㌀㠀㠀㄀　㈀㠀㄀䈀㜀㐀䘀䘀　䄀㌀䐀㠀㌀㐀　㜀　䌀䘀㘀　䄀㈀䄀䘀㐀㤀　䐀㐀㤀㌀䌀㄀㌀㄀㌀㤀䄀㤀㐀㤀㠀䄀㐀㔀㜀㘀　䌀㜀㠀㌀㄀　㘀㌀㠀㈀㄀㌀䔀㄀䘀䌀㤀䌀䌀䄀㘀　䈀㈀䘀㌀㤀䄀　䘀㤀㈀㘀䄀㄀㌀䄀　㜀㠀㔀䌀㐀㈀㈀㜀䔀䔀䘀䘀䔀䌀㈀㈀䘀　䌀㈀䌀㔀㔀㌀䘀㜀㈀䌀㈀䈀㌀䌀㜀　㈀㤀䘀㜀㌀䄀䐀䐀㜀㌀㐀㠀㔀㈀䔀䔀　㔀䈀䄀㄀㜀㄀䄀㄀㄀䄀㈀㠀㐀㈀䐀㤀　㔀㘀㠀㈀　䌀㜀　䔀䘀㄀㄀㄀䐀　㠀䈀　　㜀㔀㐀䘀䘀㔀䐀䄀䄀㤀㜀䔀䘀　㐀㔀䈀㄀㈀㈀䔀䌀㄀㄀䈀　䘀䌀㠀㘀䌀㐀䘀㠀㐀㌀㔀䔀㄀㄀　䔀䌀㘀䄀㘀㘀䄀䈀㔀䌀䐀㈀㐀㠀㄀㈀　䌀㠀䄀㠀㜀㌀㄀　㈀䘀㐀㔀䄀　䈀　㐀㌀䄀㠀㐀䄀䔀　㠀㄀㠀㔀㘀㘀㤀㔀䔀㠀㌀㐀㄀䐀㐀㌀㐀㌀㤀㘀　㜀　䈀㄀㈀㜀㐀㤀㌀㐀㈀㤀㄀䈀㄀　㌀㘀䄀㐀㈀䔀㈀　㈀䄀㤀䄀　㤀　䔀䌀䐀㄀䌀㌀㤀㤀㠀䔀㠀䌀㐀　㤀䈀㄀䘀㈀䈀䘀㐀䔀䐀䘀㌀㤀㠀㈀䈀　㈀䈀㘀㄀㈀㈀㈀㌀㤀　䐀㠀䘀㔀㌀　㌀㄀㄀㜀䔀㤀㌀㤀㠀㐀䐀㠀　䌀䐀㔀䌀㤀　㐀㘀㔀㐀㜀㐀　䔀㐀㌀㈀䈀㄀㌀䔀䔀䌀㄀䔀㤀㠀䘀　䌀㐀㌀㜀䌀䐀䐀㜀㜀㜀䌀㈀㄀㘀㔀㈀　㄀䌀㌀㐀䔀䔀㔀㈀䔀䐀㔀㐀㄀㠀䄀㠀㘀㠀㔀㄀㔀䔀㔀䌀䔀䌀㠀䌀䄀㜀䐀㐀㐀㌀㐀㤀㈀㈀䐀㜀䘀㠀䔀䐀䄀㐀㘀㄀䌀㄀㔀䘀㤀㘀䌀㄀　㘀㠀䔀䌀㘀㐀㠀㠀㤀㤀㈀㈀　䄀㤀䈀㤀㐀㠀㤀䌀䈀䄀䐀　㠀䘀　䄀㐀㄀䔀　㐀㈀㜀㜀㄀㐀䈀㄀䘀㐀䌀㘀㠀㈀　䌀䔀䔀䄀㜀䄀䐀㄀㠀㠀㄀　㄀䈀䈀㘀㐀㈀㐀　䔀䔀　䘀䄀䘀䔀㔀㐀　䄀　㄀㄀㔀䐀㄀㄀㌀　䔀䌀　　㤀㠀㈀㐀䄀㐀㘀　㐀　㜀㠀䈀　㄀䈀㘀　䄀㜀㐀㈀㈀䔀㄀㠀䌀䘀䐀㐀䘀䔀䈀㠀㜀䔀䔀㜀䄀㠀䌀　䐀㄀㠀　㘀㌀䌀䌀㐀䄀㌀䐀䌀䈀䌀䄀䌀䐀䄀㐀䔀㜀㜀㠀㐀㈀䄀　㈀㈀䈀䈀㄀㘀㠀䔀㐀䔀㄀䌀㠀㔀㌀㠀㤀㘀䈀　䐀㈀㄀㌀䄀㌀㐀㐀䔀䌀䐀㈀䈀䘀䄀㤀㐀䔀㠀㐀㄀䄀㄀㌀㤀㐀　㐀䌀䔀䄀㐀㐀　㜀㠀䌀㄀䌀䄀㔀㜀㐀䘀㜀㠀㜀䔀㔀㔀㄀㈀㔀㤀㄀䘀㤀㤀䐀　䌀㤀䔀䘀䔀㠀㠀㠀䐀㠀䔀㄀㄀　㤀䘀㐀㐀㐀　䔀㈀㈀㄀㈀䄀䐀㜀㜀㌀䘀㐀䌀䔀䌀㠀䌀䄀㈀㔀㈀㈀㤀䈀㌀㐀　䈀㐀䘀䄀㤀㔀䌀　㐀䌀㄀䔀㜀㐀㐀䐀䘀䄀㌀䈀䄀䐀㜀䌀㄀䄀䔀　䌀㐀㄀㠀㤀㜀　㤀䈀㈀䔀䘀䄀㔀䘀䈀　䐀㄀㌀㠀㔀　㜀䌀㐀　䐀㠀㄀㈀䄀㤀䌀䐀䄀䔀㘀䘀㤀㌀䘀㠀㄀㈀　㠀㜀㐀　䄀㔀䐀㄀㄀㌀　䔀㠀　䔀䌀㠀㐀　䌀㜀䄀䄀䌀䘀䌀㐀㐀㐀㘀㠀㜀㠀䘀㈀㘀㜀㔀㜀䘀㈀㤀㈀䈀㈀㠀　䐀䐀㐀㠀㤀䄀䔀㌀䐀㔀䐀䘀㤀䄀䌀㠀㄀䘀㐀㤀䈀㐀䐀㤀䈀㄀㄀　㐀䐀㠀䐀㜀　䐀㠀㤀㌀䐀㔀䌀㄀㔀㄀㘀㈀㠀䄀䌀䄀　㜀㄀䌀㐀㌀㄀　㌀䄀㜀䈀䄀䐀　䌀㐀䄀　㐀䘀䔀䐀䄀　䘀　㈀㄀䔀䄀㜀㈀㔀䘀㔀㜀㌀䐀䘀㤀䘀㈀㘀䘀㜀㈀䐀䐀㜀䘀䘀㈀䘀㈀㘀䔀㔀䈀䄀㌀㈀䐀㠀㜀㌀䈀㠀㔀　㈀䔀䈀䈀䄀㤀㤀㤀㐀㤀䈀䐀䈀䌀　㔀㠀　䐀䐀䐀㌀　䔀䐀䐀䘀㌀㈀㔀㔀䐀䘀㜀㐀㐀䐀䈀㌀㜀䄀䈀䈀䌀䔀䐀㘀䄀㄀䘀㜀㠀㘀䈀㜀㈀　䘀㠀㈀䌀䐀䐀㌀㌀䌀㔀　　㘀䌀㈀㄀㠀㤀䐀㐀䌀䐀㔀㘀䈀㌀㠀　㈀㠀㄀䘀䐀㠀䄀䄀䔀　㠀㄀㠀䔀　㈀䘀䌀㘀㜀㈀㔀㐀㔀㤀㠀䘀䘀㈀　㐀䐀㈀㘀㤀䌀　䄀　㐀䘀䔀　㌀䄀䄀䈀㔀㌀㔀㔀䘀㈀䔀㤀㄀䐀㔀㘀㠀䘀㌀䐀䈀㘀䄀䘀㤀　㄀䄀㐀䘀䈀㤀㤀㐀䘀㄀㘀䌀䘀㘀㜀䈀㔀㌀㈀㈀䔀䌀㘀㜀㄀䈀㜀䔀䄀㌀㈀䌀㠀㐀䌀䈀㤀㘀䄀㐀　䔀㠀㐀㘀㤀㔀㜀㄀㈀㠀䈀　㜀　㈀䄀㌀䐀　㈀㔀　㄀㄀㌀䔀㠀　䘀㘀䈀㈀䐀㄀　㤀㠀㈀㐀　㠀　㄀㄀㌀　㠀　㐀㔀䄀㐀㌀　㠀㤀㠀㐀　㈀　䐀　㄀䄀㐀㈀䌀　　㐀　㈀㠀㄀䐀㘀䐀　㄀㔀　㄀㐀㌀㔀䔀䐀䐀䐀䘀䈀㄀䌀㈀㄀㤀　䐀㠀䘀㔀㐀㄀㐀䈀㔀䘀㠀㤀㤀㌀㐀㘀㔀㜀䐀䔀㌀㔀䔀㜀䌀㐀䈀䈀䔀㌀㄀㠀㘀㜀䄀䈀　䈀㘀䔀　䘀㔀㜀䈀㘀㜀㜀㘀㄀䐀䄀㜀䈀䈀㈀㄀㈀䈀㄀䌀䘀㠀㤀䌀㄀䔀㈀䌀㔀䄀㈀䘀㈀㐀䐀㜀㤀䄀䌀　㈀䈀㔀㜀㤀㘀㔀䈀䔀㄀䈀㌀䐀㈀㈀䈀㔀㌀㔀䐀㄀䐀　䐀　䈀㔀㐀　㘀㔀䔀䌀㠀䘀䘀㤀㤀䘀䐀㠀㘀䌀㌀㄀䐀䘀䔀㌀㤀䈀㐀㄀㔀㘀㔀㌀㠀㌀䔀㌀䔀㈀㐀　　㈀㜀㤀㄀䘀㠀㐀㐀㜀㠀䔀䘀䐀㈀㔀䔀㈀䌀㔀㜀　䘀㔀㔀䘀䌀㐀㘀䐀䐀㌀㠀㌀　䔀㈀㄀䌀㜀㠀䈀㜀䄀䔀䔀㔀㘀䐀䄀㠀㘀䈀㄀㌀䐀㜀䘀㄀㌀㐀䄀㘀䄀䘀䘀㈀䘀䔀㐀䌀㤀䘀㘀㤀䈀䄀㘀䘀䈀䌀㐀㠀䌀䈀䔀㜀㜀㔀㌀㈀䈀㠀　㜀䄀䌀䈀㘀䘀㘀㤀㄀䘀㘀　䐀㌀䌀㄀䐀䈀㈀䘀䔀䌀㘀㔀　㄀㌀㜀　䈀䐀㈀　䌀㜀䘀㐀䄀㐀䘀㌀㜀㔀䔀䄀㠀䄀㠀　䔀㄀㘀㔀䔀㘀㤀㠀㔀䈀㌀㄀㈀㔀䔀㌀䄀㜀䈀㈀䐀㈀　䄀㔀㜀㜀䈀㄀䌀䔀䐀㜀　㈀㠀䌀㌀䌀䌀䌀䈀㌀䈀㠀㔀㜀　䈀㤀䄀㜀䘀㌀㄀㠀㌀㠀㐀䌀㠀㘀䔀㔀㔀㘀㌀㠀䐀㄀䔀㄀䄀㤀㠀䈀㠀㜀䔀䈀㈀㄀䈀䄀㠀㜀䌀㤀㠀䄀㤀㌀㄀䄀㠀䔀㜀　㜀㜀䔀䈀㜀㤀㤀䔀䌀㄀㔀䐀㤀䘀䄀䌀䘀䔀䌀㜀䔀䄀㌀㜀䌀㈀　㘀㄀　㔀㈀㄀䔀䘀㌀䌀㐀㐀　㘀㐀　㈀䌀㌀㤀㜀䐀㤀䄀䄀㜀䘀䄀㄀㤀䔀䌀㔀㔀㤀䔀䔀㌀㠀㈀䈀㐀䐀䌀䈀㤀㠀㤀䘀㄀㄀㠀䄀䘀㠀䄀䈀䈀㠀䐀㤀㜀㤀㠀㜀䔀㠀㈀㄀㔀㤀㌀㤀㜀䔀㈀䔀㐀䌀㄀㐀㈀㘀㈀䘀䌀䔀㜀㘀䄀㜀䄀䄀　䔀　㘀　䄀䐀䔀䈀㤀䈀䌀䌀䌀䔀䐀㜀㄀䐀㔀㐀㌀㜀䐀㌀䘀㄀㈀䐀䐀　㜀㠀㠀　䘀䄀䘀㄀　㜀䐀　㠀䈀䄀䄀㔀㈀䄀䘀䈀㄀䈀䄀㈀䔀㔀䐀㜀䄀䌀㄀㐀㠀㈀㜀㠀㄀䔀䘀䘀㔀　䔀㔀䘀　㄀䈀㜀䔀㌀䄀㤀㠀䌀㜀䈀㄀㌀㐀㈀䐀㄀㄀䘀䘀䄀㘀䔀㠀㜀㤀䘀䌀㠀㄀㄀㘀㠀䈀㄀䘀㐀䌀䈀䌀㜀㌀㐀㐀䐀㌀㌀㐀䐀㄀䌀䄀㌀㌀㐀䌀㜀㈀䌀䌀䔀㄀㠀㐀㈀㜀㤀䌀䄀䈀䈀䄀㘀㜀䔀㠀㜀㜀䔀㜀㌀䐀㜀䌀㈀㐀䐀䌀䔀㄀㈀㐀㈀䈀䘀䌀㜀㘀䈀㘀䄀䄀㜀䐀㔀㠀䈀㤀䘀　㔀䘀㐀㈀㐀㠀㔀䔀㈀䘀㄀䄀㜀㤀㌀䐀䌀䈀㘀䔀䈀㔀　㜀㌀䄀㘀㜀䔀㤀㔀䔀㜀䘀㘀㘀䄀䐀䘀㠀㤀䄀䐀䔀㜀㜀䄀㜀䘀㠀䌀䄀䔀㜀䌀䐀䔀㈀䐀㌀㔀䔀䘀㔀㈀䐀㄀㘀䈀㠀　䈀㐀㔀䘀㌀䈀㌀䘀䄀㘀䐀㠀䘀䘀䄀㜀㤀䄀㤀䘀䄀㠀㈀㌀㘀䘀㠀䘀㠀㔀㠀䄀䈀㌀䔀㠀㐀䄀䔀䐀㔀䄀㈀㘀㄀㐀㔀㐀㈀䔀㌀㄀㄀㔀㤀㜀㤀䔀䈀䌀㔀㄀㌀㘀㠀䘀䈀㤀㤀䐀䄀䔀　㘀䔀㄀㌀㌀䔀䌀㘀䘀㠀㐀䌀䔀㈀㜀㔀㄀㘀䄀㘀䘀䈀㔀㐀㌀䔀䔀㔀䐀䐀䄀䘀㜀䔀䔀㔀䐀䐀㔀㠀㌀䘀㔀　㤀㤀䘀　䘀䈀㐀䐀㈀䄀㠀㌀䘀䄀䘀　㜀䐀㌀䄀㐀䘀䔀㔀㐀㌀㌀㌀䄀䔀　䐀㘀㜀䄀䄀㌀䌀䔀䄀䄀㌀䘀䘀㜀㄀䈀䔀㐀㐀䔀　䌀䔀㄀㌀㄀䘀㜀　䐀䌀䘀䌀㄀㜀䘀㄀㤀䈀䈀䔀㘀㌀㘀䌀㤀䐀㤀㈀䘀㐀㈀䈀㐀㈀㄀㤀㘀䘀䔀䔀䌀䔀䄀㄀㈀䈀　㈀㈀㘀　㜀㠀䔀㘀㌀　㠀　䐀㈀㘀㌀　㄀䐀　䄀㐀㌀䔀㤀㘀㠀㄀䌀䐀　㘀　䘀㈀䐀㔀䘀䄀㐀䔀　㜀䐀㌀㈀㤀　㠀　䌀　㘀㈀　㤀㌀　䐀㐀㜀䈀㐀䐀䈀䘀㔀㄀䈀㤀䐀㠀㔀䘀㐀䐀䘀䄀㄀㘀㜀㄀㘀䔀䄀㌀䄀㤀䐀㠀㤀㠀㜀䘀　㄀㈀䐀䐀㠀䘀㠀㌀㄀䔀㌀㄀㐀　㜀㠀䐀䄀䈀䄀䘀㜀䔀䐀㘀䌀㤀㔀㌀䈀㔀㌀䌀䘀㄀䔀㘀㔀䌀㔀㈀䔀䌀㈀㐀䐀䌀㈀　䌀㄀䌀㌀䌀㠀㜀㄀㤀㔀㠀㜀㠀䐀䔀㈀㈀㠀䌀㤀㠀㈀　㐀䌀㌀䌀　㐀　㄀㠀㌀㄀㔀䘀䘀㄀㔀㠀㐀䐀㄀㄀䘀㠀䈀䌀䔀㐀㜀䐀㔀㄀䔀　㘀䔀㈀㈀䌀㌀䐀䈀䈀㔀䐀䘀䘀㄀㜀䄀㤀䐀䌀㔀㤀䄀䄀㘀㜀㤀䐀㘀㠀䄀㜀㔀䐀　㠀㔀䘀㈀㘀䌀㔀㔀㐀㔀䐀㘀㌀㠀㜀䌀㌀㘀㐀㄀䘀䈀㈀䌀㈀䔀㜀㠀㘀䄀㐀䔀㈀㌀䈀㐀㔀㈀㜀㐀䔀㠀㘀㐀䈀㔀㔀㤀㘀　䈀㄀䘀㠀㐀䌀㈀䘀䘀䄀㠀㠀䐀㈀䘀㄀㜀㜀䘀䔀㄀䔀㌀　㘀䐀㔀䔀㌀㠀㈀䔀㤀㜀㠀䘀㄀䌀　䘀㐀䘀䘀　㐀䐀㔀㐀䐀䘀㠀　㈀㐀㈀㘀　㜀䄀䌀㈀㐀㜀㤀䌀　㠀㤀䘀㄀㌀㠀䘀㄀㄀㠀䌀　㠀㐀䔀㈀㘀䘀㄀㤀㄀㜀䄀㄀㘀㌀䔀㈀㌀㄀䌀㔀㘀㔀䈀㌀㤀㈀㤀㤀㜀䔀㤀㔀䄀䘀䄀䌀䌀䈀㘀㠀䄀䘀䈀㤀㘀㔀䈀㌀㄀䄀㤀㄀䔀㄀㌀䐀䘀㄀㜀䄀䄀㜀䐀䘀㜀䄀㠀㐀䐀㤀䈀䌀㔀㌀㜀㠀㐀䌀䈀㄀㤀䔀㈀㄀㄀㜀䌀㤀䈀㤀䘀䐀　䘀䔀㤀㐀䌀䄀䐀䌀㈀㘀㌀䄀㔀㤀䈀㠀㤀㘀䄀㠀㐀䘀䄀㘀㈀㘀㌀㐀䌀䔀䄀䌀㈀㠀䌀䘀㈀㜀㌀䄀䘀㜀㠀䘀䄀㠀䐀䘀䐀㈀㌀㄀䘀㘀㜀䄀㔀䐀㠀㌀㘀㜀　㠀䔀㄀䄀㜀㔀㔀䐀㘀㔀䌀䘀㔀䌀䐀㔀㤀䄀㈀㠀㌀䈀㈀㠀䘀㐀䔀䘀㠀䘀䌀㜀㈀㌀䐀㘀㜀㈀䄀㤀䘀㜀䔀䈀䄀㐀㔀㜀䌀㠀㔀㘀䘀㌀䘀㄀㔀㔀䘀䌀䘀㔀㔀㜀䘀㈀䐀㔀㘀䐀㤀　㠀㜀䈀䌀㘀䔀㌀䔀㤀㔀㘀䌀㘀䄀㈀䄀㔀䘀䐀㜀䄀䄀䌀㠀㔀㠀　㄀㤀㄀㌀㤀㠀䄀㠀㜀㐀㈀㘀㄀㌀㘀䘀㤀㜀䄀䔀䈀㄀䈀䄀㌀㈀㔀　䐀㠀㘀䐀䘀　䄀㘀㐀㐀　㘀㠀㌀㌀䈀䌀㠀䐀㄀䈀㄀㌀　㤀㤀㈀㌀䌀䐀㌀㐀䘀䐀㤀䐀䄀䔀㘀㜀䄀㜀㈀㘀䌀䘀䈀　㔀㌀䄀㈀㈀㌀䔀㤀㘀䌀㌀䄀㤀㈀㠀㄀㌀㐀㐀䘀㜀㔀㄀䐀䄀㠀䘀㈀㠀㠀㘀䘀㘀㈀㠀㔀㘀㘀　㈀䄀䔀㔀㜀㤀㤀㜀䘀䄀㘀䌀䘀䘀䔀㌀䈀㠀㌀㠀㤀䌀㄀㜀䘀䈀㘀㜀䔀㐀䘀㔀䘀㠀㐀㐀㘀㤀㤀　㐀㐀㔀䈀㈀㤀䐀㘀㔀㘀㔀䔀㔀　䐀㤀㄀䔀䔀㄀㤀䔀䌀㤀䔀䌀㔀䌀㜀㔀㠀㄀㤀䈀䌀䘀㤀㔀䈀㔀㘀　㘀㐀䈀㌀㈀㠀㠀㄀　㠀㘀㘀䈀䐀㐀䄀㘀㌀㔀䄀㈀㤀㜀䈀㜀㔀㐀㌀䔀䄀㔀䔀㜀㐀㜀䄀䌀㄀　䈀䌀䘀㌀䘀㐀䘀㤀䘀㜀䘀㔀㜀䘀䈀㘀䔀㠀㐀㐀㌀㠀㌀㈀㌀㤀㐀䘀䐀㌀㌀㌀䔀䔀㜀㐀㐀㠀㄀䐀　㠀㘀䄀㜀䘀䄀㜀㄀㈀　㌀㜀㜀㘀㘀㐀㈀㤀㌀㐀㜀㠀㤀䔀䘀㄀㔀㜀䐀　䘀㠀㤀㜀䘀䔀䘀㄀㈀　䘀㌀㜀䔀㤀㌀䔀䔀㜀䔀㌀㤀　㄀㔀䌀㈀㘀䌀䄀䈀䘀㠀䔀䐀㌀䈀䌀㈀㈀㌀䐀㔀㐀䘀䔀䔀䌀㤀䔀䌀㘀䐀㜀㔀㄀䔀䐀㌀㈀䘀㌀䈀㤀㌀㘀㜀㠀䔀㔀　㌀䐀䔀㤀㜀䐀䘀䌀䈀䔀㔀㘀䈀䘀䄀䐀㔀㘀㤀㤀㜀䈀䌀㔀䐀㌀䈀㤀䈀䄀㜀䘀䄀䘀㤀㔀㐀㄀䄀䈀㈀㘀㤀䔀㘀䘀㔀㜀䐀䐀㜀䈀䌀㔀㤀䘀㘀㌀㔀㐀䌀㘀㐀㄀䔀䄀㈀䈀䌀㘀㄀　㈀㄀㄀㠀䄀䘀㐀䔀㘀㠀㌀䌀㌀㠀㈀䈀䌀䘀㘀㤀䔀㐀䐀䄀䘀㐀㠀㐀㈀㜀䔀㤀㄀㠀䄀㌀䌀䐀㐀䈀㔀㔀㌀㘀　㈀㘀㌀㠀䔀䔀䄀㜀䔀㔀　㜀䐀　㌀䈀䐀䔀䔀㌀㄀㘀䔀㐀㤀㄀㤀㔀㌀㐀㐀㠀䈀㤀㜀䔀䘀䔀㄀㈀㔀　㜀㠀㤀㄀㘀　㐀㄀　㠀䈀㄀䐀　䈀　䌀㠀㈀䌀䄀䌀㜀㄀䈀㜀䌀㐀㜀㈀　䘀㤀䔀㈀䈀㘀䌀䐀㐀㘀䘀㜀㘀䈀㘀㜀䐀㄀㈀㔀　㄀䌀㌀䄀　䈀䐀㔀䄀㤀䘀䄀䘀䐀㈀䘀䘀䄀䄀㌀㌀䘀㌀㌀䘀㔀㤀㜀䘀䈀㠀䌀㔀䌀㘀㠀㘀䘀㄀㤀䌀㤀㌀䘀䘀䈀䄀䔀㈀䐀䄀䘀㜀䘀㐀䐀㜀㠀㐀㄀䈀㤀㈀䌀䘀䔀㤀䌀䄀䘀㌀㄀䘀㜀䐀䐀㐀㌀㤀䄀䌀䈀䘀䈀㄀䔀　䈀䈀㌀䐀㜀䔀䘀䘀㔀㘀䌀䐀䘀㔀䄀䈀㘀䐀䔀䌀䘀㠀㔀䄀䘀㈀㄀㤀㠀㄀䘀　㤀㜀䌀㤀䘀㜀㈀㘀㄀䐀㐀㠀䐀䐀㜀䐀㐀䌀㔀䔀㠀䔀㌀　䘀䔀㜀䄀䐀䔀㠀㜀䘀㔀䔀㜀䘀㠀㜀䔀㐀㌀㤀㤀㌀䔀䌀㤀䈀䘀㘀䄀㘀㔀㈀㠀　㜀䈀㠀㈀㤀䘀㤀䘀䌀䌀䌀㄀㠀䌀䄀㜀㌀䈀　㔀㌀㈀㈀㤀㠀䐀㘀㜀㔀㠀㔀㘀㤀䐀䄀㠀䔀㔀㔀䌀㤀㘀㜀　㐀䘀䄀䌀㜀㈀䄀㤀䔀䌀䘀䌀㜀䌀䐀䈀㜀䄀䐀㠀䌀䐀㠀䔀㜀䌀㔀㠀㌀㠀䌀䐀䐀䐀㔀䈀㘀㈀䘀䈀䘀䈀䔀㤀㘀㜀䐀䔀䘀䐀㔀䄀䘀䘀䈀㄀䐀㔀䐀㄀㈀㌀　㠀㄀㐀　㄀㔀㔀㠀䐀㤀䈀䘀㘀　䐀䐀㐀䄀㐀㔀䌀㄀㤀㄀　㜀㜀䐀　䄀䈀䈀㠀㜀㠀㤀䘀㐀䄀㈀㘀㘀㤀㜀㌀㌀㘀䌀䌀㔀　䔀㘀㔀㈀　䐀　㔀㔀　㄀㤀㌀㘀䄀䘀䐀㔀㄀䘀㐀䈀㄀㜀㔀㘀㘀㈀䈀㠀䄀㠀㐀㈀㜀㌀䐀㐀㈀㘀䄀㘀㤀㄀㠀㠀䘀㠀㔀㠀　䐀㐀　䐀㈀㌀㔀㘀　䌀㤀㐀㈀䄀䌀䌀㔀㐀䈀㤀䔀䌀㐀㐀䘀䄀　㤀㄀㜀　　㘀䌀䄀㄀䐀㄀䈀㔀㜀　䌀㐀㐀㄀㄀䘀㜀㌀㔀㌀䘀㘀㌀䈀䘀䄀　䌀㔀㘀㌀䔀㔀㘀䔀㐀䈀㄀㔀㠀䈀䔀䘀䄀　㔀䐀䈀㜀䔀㠀䔀㌀䘀䔀㠀㠀㔀㔀䔀　䄀㘀䈀㐀㤀㌀䘀䄀㠀䈀㌀㐀䔀䄀㄀䐀㌀㠀㄀㐀䘀㌀㜀㔀㘀㌀䌀㠀㌀㘀䔀　㘀䐀䐀㠀㜀㔀䈀䐀㈀㌀㠀㌀䔀䈀㠀㜀䔀䔀䄀㐀㜀䐀㘀㄀䌀䐀䔀㔀㄀㌀㜀㘀䔀㜀䄀䐀䐀㤀䈀䄀㈀㔀䘀㠀䈀䌀䐀㤀㘀㤀䄀䔀䈀㘀䔀㐀㔀䔀㈀䐀㠀㜀䌀㤀㠀䔀㠀䔀　㌀㠀㠀䄀㠀　䈀䌀䐀㄀㜀䄀㠀㌀䄀㌀　䘀㐀㜀䄀㐀㌀䈀㘀䐀　　䐀　㄀㔀　㄀㠀㌀㘀㈀䌀䐀㤀㔀㔀㠀　䌀㈀㈀㤀㐀㠀㔀㤀䌀㘀䘀㌀㤀䐀㌀䄀㈀䘀㠀㘀㈀㔀㈀㜀㈀䌀㘀䘀㘀䔀㐀㔀㈀㘀䔀㘀㤀㘀　㈀䈀䌀㤀㠀　㜀䌀䈀㔀䔀䔀㐀㔀　㜀㠀　㠀㈀䔀䐀㔀㤀䘀䐀㌀㄀䔀㤀㤀㤀䔀㠀㤀䌀䔀㜀㔀㄀㄀㘀䈀䔀䐀䈀㠀䄀㌀㘀䄀㌀䌀䌀㐀㐀㈀䈀䌀䘀㌀㤀㄀䄀䐀䐀　㈀㈀㘀䌀㔀㐀㔀䈀䄀㄀䘀䈀䐀　㈀㐀䄀㔀㠀㄀㐀㜀㤀㈀㠀㌀㘀䈀䘀䄀䘀䐀䘀㠀㘀䄀䌀㌀㠀　㜀㜀㌀㘀㘀㘀㜀䐀㈀㜀　㔀㐀㐀䈀㌀㌀䔀㠀㜀㄀㔀䔀䔀㜀䌀䌀䘀䌀䌀䘀㔀㘀㔀䄀㠀㈀䈀㘀㠀㠀䘀㘀㔀䘀䐀㘀㌀㔀㔀㘀䄀㠀䘀㤀㈀䄀䔀䘀㤀䈀䈀䄀䔀䔀㄀㘀㄀䐀㈀䌀　䐀䔀㠀㜀㤀㠀䔀䈀㘀䐀㈀㌀䄀㜀　㠀㜀㘀㠀䄀㐀䔀䌀　䐀㘀䄀䔀䈀䔀䐀㜀䄀䌀䔀䄀䐀㈀　㘀䌀䐀㌀㔀㄀㠀䔀㘀㈀㠀㔀㐀㄀䈀㠀㄀䌀㈀䔀㔀䔀㔀　㘀㘀㔀䈀䐀㘀㄀㈀㜀㠀㜀㘀䄀㘀㔀㔀㔀䈀䄀㜀㌀㘀䄀䄀㜀䘀㌀㘀䄀䄀䌀䐀䌀䔀䄀䈀㔀㌀䌀㔀㄀㌀㄀㘀㠀㘀㈀㔀䔀㈀㌀䘀㤀㌀䘀㄀㠀䘀䌀㐀䄀㜀㠀㌀䐀㔀䌀䔀㄀䘀䄀䈀㜀䘀㈀䔀䈀㘀㔀㈀㈀㄀㠀䔀䐀㔀䔀䐀㔀䔀䘀㔀㠀㜀㔀䈀　㘀㄀㤀　㜀　㠀䐀㐀㜀䈀䐀㐀㘀㘀䄀䔀䔀䘀䐀㈀㜀䘀㄀䘀㌀㜀㈀㜀㠀㠀㤀䘀䔀䈀䘀㔀㄀䐀䄀㄀㠀㈀㔀䔀䔀䈀㈀㘀䄀䈀䈀㘀㈀䌀䌀㄀㤀㜀㌀㌀䌀㐀㌀䈀㜀㐀㘀䌀㌀䔀㄀䔀䔀㜀㈀㔀㘀䐀䐀䘀㈀䔀䘀䄀䔀䔀㔀㄀㌀䈀㔀䌀䔀㄀㜀䄀㠀䈀㤀㔀㄀㘀䈀䔀䔀㌀䌀㔀䈀䈀㌀㌀䌀㔀㤀䘀㤀㌀㔀㐀㈀㘀㔀㄀䘀　䔀䌀㜀㠀㄀㠀㘀㜀㈀㌀㔀㘀㠀䌀㤀㜀㤀㌀䘀㐀㜀㤀䈀㄀㤀㔀㔀㘀㐀㘀䌀䄀㘀　䌀䌀㜀㘀㘀㤀䐀㜀㌀㘀㈀䔀㜀㐀㐀㔀䌀　䌀　㜀㐀㌀㐀䔀㜀　䌀㘀㐀㐀䌀䄀䘀㐀䌀㈀㘀㌀䄀㠀㐀㠀㤀㠀㠀䄀㈀　䔀㤀㌀㄀䌀　㌀㤀㈀　㤀㐀㐀䔀㜀䐀　㜀㤀　㠀㄀㔀　㘀㈀㠀㤀䐀䈀㐀㐀䄀䘀㜀㌀㈀㤀㤀㜀㜀䔀䈀䘀㌀䌀䘀䄀䌀䈀㐀㠀㠀㠀　㔀䐀䘀䄀㘀㌀㌀㔀㘀㔀䌀　䈀㄀㐀㈀䄀㄀䘀䘀㘀　㜀　䈀䄀㌀㤀㤀㄀㜀䄀䌀㤀㠀䄀䌀㜀　㐀㜀䔀㔀䔀䌀䘀㌀㌀䈀　䐀䌀㤀㐀䌀䌀䌀㐀䌀㈀　䌀䈀㤀㔀㤀㜀㐀䔀㘀㈀㤀㌀䄀䔀㜀㠀䄀䄀䔀㈀㜀䘀㐀䐀㤀㜀㐀㄀䘀䐀䘀㄀䘀䐀㔀䈀㔀㈀㜀㐀㐀㄀䈀䔀㔀䈀䌀䌀㈀㐀䄀㠀䈀䌀䔀㄀㌀㈀䄀䌀䘀䄀䐀㌀䄀䐀　䌀㘀㐀㐀䘀䘀䄀㤀䄀䔀㌀㌀䌀㤀㔀㠀䐀㔀㄀㤀䈀㐀䄀㤀䄀㔀　㘀㤀䔀䄀　䈀　㔀䌀䄀䈀䘀䘀㌀䘀㔀　䘀䈀㌀㄀㠀㔀䌀䔀䈀㐀㠀㤀䈀㜀㤀㘀䌀䌀䐀㄀㌀㌀㜀㔀䐀㘀㈀㤀㈀㘀䐀䌀䘀㜀䘀㐀䐀䈀㘀㘀䘀䐀㠀㄀㘀㔀䔀䄀䄀㜀㔀䘀㄀㄀䌀䐀䘀㐀䌀㌀㄀㐀㤀㔀䈀㔀㐀㔀㌀䌀䐀䘀䄀㐀䘀䄀㈀䐀䄀㄀　㄀䔀䈀㄀　㐀㈀䔀㘀㈀㠀䐀䐀䘀䈀㔀㤀㈀䈀㈀㈀䔀䘀䘀㜀䄀䄀㌀䌀㜀䘀䌀䐀䔀䔀㄀䌀䘀㄀䐀　䌀㜀　㈀䔀㌀㠀㘀䈀䔀㐀㔀㐀䘀㠀㄀㜀　㔀䈀㈀　䈀䔀㐀䐀䐀㔀䘀䐀㔀㔀㤀㘀䄀㔀䌀㌀䌀㐀䘀䘀　㜀䌀㐀㘀䘀㄀䘀㠀䘀㈀䔀㈀㠀䄀㄀㘀㄀䈀䔀㜀㠀䌀䐀㜀㌀㌀㌀㔀㐀㄀䘀㜀䐀㌀䔀䌀䐀㐀䄀　䈀䐀䘀㔀㤀䄀㈀㘀㜀㤀㌀䔀䔀㌀䐀㔀䔀㜀䘀䐀㌀㔀㔀㈀㘀㐀㜀㈀䈀　㐀䔀㤀㤀䘀䄀㠀䈀䔀䄀㔀䔀㈀㠀㤀㔀䈀㄀㤀䐀䐀䘀䄀㌀㔀䔀㤀䐀㄀㄀㔀　㄀䌀㌀䌀　㘀　㘀　㌀㈀㔀㠀㐀䘀䐀㜀䘀䘀䘀㐀㘀㠀　㈀䘀㌀䐀㤀䌀㄀㌀㠀䐀㌀㔀㌀䔀䈀䌀㄀䐀䔀䔀㐀㔀䔀　㘀㄀㈀　㌀㤀㈀㜀㘀㜀㤀㌀䔀㄀㔀　㘀㄀䄀㤀䐀䌀䌀㈀㐀䘀　　㄀䌀㌀䔀　㘀㈀䈀㈀䈀　㈀䄀㈀㌀㔀㠀㐀㠀㜀䘀㠀㤀㜀　㐀㄀㤀　㜀䐀䐀㠀㠀䄀㐀㤀䌀䐀㠀䄀䌀䄀䄀　㘀　䄀㈀䈀　㤀㌀䄀　䘀㌀㄀㄀㐀䄀䄀䌀㌀㈀　䌀㤀䌀㠀㌀㔀㐀䐀䘀㤀䄀㠀㐀㄀㘀㈀䌀㌀㠀䄀㐀㜀䈀㘀　㈀　㘀㌀䈀㔀䌀　㌀㈀䌀㌀㐀　䘀㈀㤀䌀㌀㘀　㠀㤀㈀䌀㜀㜀㐀㈀䘀䘀㔀䌀䐀䐀㌀䔀㜀䐀㐀䄀㈀㤀㌀㔀䄀　㜀䄀㠀㘀㜀䄀㤀㤀㔀㄀㘀䄀　㌀䐀䄀㈀䘀㤀㈀䌀䈀㔀䌀㄀㔀㜀䈀䐀䄀㜀䐀㔀㔀䔀㜀㠀䔀㠀　䄀㐀䈀䔀㠀㌀䄀䌀㌀㈀㘀䐀䔀㔀䄀䔀㈀㤀㘀䈀䌀㌀䄀䔀䈀䐀㐀䈀㘀䔀㐀䘀䄀㘀䔀䘀㄀　䘀㠀㄀㌀㌀㘀㈀䌀㔀䐀㄀㠀㠀䘀䄀㔀㈀㐀㜀䈀䄀㌀䐀㈀䄀䐀䈀㜀㔀㄀㤀㐀䘀㠀䈀䔀䘀　㜀䄀䈀　䌀㈀㘀㌀䔀㜀䐀䌀㠀㐀㈀䌀㈀㘀䔀䌀　䄀䐀㘀㘀㐀㜀㔀㠀䔀㤀㜀㐀䔀㠀䈀䈀㐀㌀䈀㜀䈀㠀㌀㠀䔀　㈀㤀㌀䈀㌀䈀　㐀䔀㤀㤀㌀䔀㈀䌀㌀㤀　㄀㔀䔀㌀䄀㌀䌀䔀䈀㈀㠀㐀㈀　㤀㤀㘀㔀䄀㌀䌀㜀㈀㌀㐀㜀䐀䄀䐀㜀㠀㤀㄀䘀㤀䈀䘀㔀㔀䈀㘀䄀㠀㄀㌀㐀㄀䈀㘀䐀䔀㄀䄀㌀䘀䘀䘀㌀䐀䌀䌀㤀㘀䈀䌀㐀㐀䈀㠀䘀䄀㐀㜀䘀䌀㘀㐀䄀㘀䈀䔀㄀㘀㘀䈀㔀㈀䘀䈀㔀㌀㈀䐀㈀䈀䔀㐀䐀㌀㘀䌀㤀䐀㄀㄀㔀　㄀　㌀㜀㌀㌀䘀㔀㠀㜀㄀䈀䐀㈀㤀䌀㄀䈀㔀㤀䘀㤀䐀㔀䐀㘀䈀䐀䘀㈀䈀㄀㤀㌀㘀㄀䄀㜀㠀㌀㐀䘀㔀　䌀䐀㈀　㌀䄀䐀㌀䌀䌀䈀㜀䈀㌀㤀㐀䌀㠀㘀㌀㐀䌀㤀㤀㌀䘀㌀䌀㘀㈀㜀䄀㔀䔀㌀䈀㘀㠀䄀㘀䈀㠀　㔀䐀䐀㄀㄀㔀䘀䄀㠀䌀䘀　䈀㠀䄀䌀㠀㈀㠀㘀䔀㄀䔀䌀䘀䈀䘀㔀㌀㔀䈀㐀䘀㘀䈀㈀　䔀䐀䌀䄀䄀䘀䘀䄀㜀㠀㤀㔀㘀㘀㠀䈀㤀㌀㈀䘀㤀䐀䐀㜀㤀䘀㄀䔀䘀䌀㤀䈀㔀㠀㤀䈀㘀㤀㘀䘀㐀䄀㈀㌀㌀䔀䘀㠀䘀㔀䈀䄀䌀䐀䄀䈀㈀䔀㜀㄀㘀䌀㌀㤀㔀䌀㤀䈀㔀㤀䈀䄀䐀㜀䘀㔀㐀䔀㤀㤀䈀䈀䌀㘀䔀㄀䌀㄀䔀㄀㄀㔀䌀㜀㜀䔀㠀㜀䈀䄀䄀　㌀㘀㤀䈀㈀㈀䌀㠀㄀䔀㄀䔀䌀䘀䈀㌀㜀䄀䐀㄀䔀㐀䔀䌀㌀䈀　㌀㔀㔀䈀䘀㠀䘀㈀䘀䔀䘀䔀㘀㐀䌀䐀㜀䐀㌀㜀䐀㠀㠀　䄀　㈀䈀　㈀䔀㘀䄀㔀㠀㈀䔀㜀㔀䄀㐀㤀㔀㜀䈀㤀䐀䐀䌀㤀䔀㜀㌀㐀䘀㄀㔀㐀㤀䐀㜀㈀䈀㜀㤀䘀䈀㜀㄀䌀䈀䌀㔀㐀䈀㠀䌀䘀䐀䄀㐀㔀㔀䈀䐀㘀㤀㈀㤀㜀　䄀㄀䌀㔀㜀㌀䄀䔀䐀㈀㜀㌀㈀䔀㠀䔀㠀䈀䄀㠀　㐀㄀㐀㤀䌀㜀䘀㘀㤀㜀㈀䐀㈀㜀䈀㐀䈀㈀䈀䐀㘀㐀䐀䈀䘀㠀䄀㠀䈀䐀㌀㠀䄀㐀䐀㘀㠀䐀䘀㄀䌀㘀䄀㤀㌀㐀䌀㔀㐀㈀䄀㔀㤀㘀　㐀㈀㘀㘀㤀㐀䄀㘀䘀㄀䔀㔀㜀㤀㐀　㈀㤀䐀䌀䌀㔀䌀㌀䐀䌀㌀㄀㤀㤀䘀㔀㔀㤀㌀䐀䐀䐀㘀㤀　䔀䐀䔀䈀䄀㜀㌀㌀㄀㘀䄀䈀㔀㐀㔀㌀䄀䌀㤀㄀䄀㌀䌀䔀㜀䄀㔀㈀㘀㜀㈀䐀　㄀䔀㠀㠀㠀㘀㠀㈀㜀䌀㈀　㜀㄀䘀㤀䔀㌀㔀㌀㘀䈀㄀䄀　䔀䘀䘀㄀　䈀䄀㤀㠀䄀㐀䘀䘀㈀㔀㠀㈀㌀䐀䄀㔀㔀䐀㜀㜀䘀㈀䌀㄀㈀䘀㐀　㔀䈀䈀䈀　䘀㄀㔀䄀㜀㔀䔀䄀䔀㈀䄀䌀㜀䄀䐀㄀㌀㜀㄀䔀㠀䌀㈀㔀䄀㘀㘀䐀㔀㈀䄀　㈀䈀　㈀　㘀䌀㔀㄀㘀䔀㜀䘀㌀䈀䄀㄀㠀㄀㤀䌀䔀䘀㔀㈀㠀　㄀䐀㄀䐀䌀䈀㌀㘀䄀㤀䘀䄀䐀㜀䈀䐀㤀　䄀㌀㌀䌀㠀㌀䐀㌀䔀　㠀㘀㔀㘀䌀㔀䐀㤀䌀　䄀㘀㜀㘀㠀㔀㜀　㈀㐀䘀䐀㌀㌀㌀㔀㠀㌀㜀㔀㈀㘀䈀　㈀䔀㜀㜀㐀䌀䔀䘀䘀㜀㜀䄀㤀䔀䌀㔀㌀㐀㐀㐀䈀㤀㔀䔀㔀　㐀䌀㔀㈀㌀㤀㌀　䈀㌀䐀　㠀㜀䄀㄀㘀䈀㜀㐀㠀㜀㄀㘀䔀䘀㜀㜀㠀㄀㐀㤀㐀䐀㄀　㠀　㄀　㘀㈀㄀㤀㌀㄀　　㄀䈀㤀䌀㠀䌀䄀䈀㠀䄀㈀䐀䌀㜀䄀㠀㘀　㜀䔀䔀䈀㄀䄀䄀　䘀䈀䄀㤀㠀　䌀　䘀䄀㤀㈀䐀䐀　㤀㠀㔀䄀㈀䌀䈀　㜀䄀㈀䌀䈀　㘀䄀䄀䈀㄀㐀䌀㜀㐀㄀㠀䔀㜀㄀㘀䘀䈀㔀䐀㄀䈀㄀㔀㔀　㠀䄀䈀䘀䘀䐀㈀䘀㜀㈀䐀䄀䄀　㌀䔀㄀䌀㌀㘀㐀㔀䈀㈀㈀䐀䄀䔀㄀䘀䘀㐀㤀䔀㈀㄀䈀䘀䘀䐀㜀䄀㤀㄀䔀䔀㜀㐀㤀㠀䄀䐀㤀䔀㈀　㌀㐀㜀㌀㘀㜀㐀㔀䈀䔀䘀㄀㜀　䘀㌀㘀㠀㠀㈀䘀䄀㐀　㜀㌀䐀㌀㈀䔀㄀䔀㄀㐀㘀䐀䐀㌀㜀㔀㔀䘀䐀㐀　㜀䈀䐀㄀㘀㔀　䌀䐀㤀㘀㠀䔀䈀䐀㘀㔀䌀䈀㔀䔀㌀㔀䔀䐀㔀䘀䐀㐀㘀䐀㄀㤀䄀䐀㈀䔀　㜀㄀㐀䔀䘀㜀䄀㠀䄀䔀㈀䄀䌀䈀㄀㤀㄀㘀䌀㄀㔀䔀㔀㘀㄀䐀䔀䔀䐀䐀䄀䌀㌀㈀䈀䌀䄀䐀㈀㌀㔀㘀㘀䐀䐀㔀㐀㄀㈀䘀䘀㐀㐀䔀㈀䈀䘀䄀㜀䈀㐀㠀㜀䌀䄀㌀㜀䐀䄀㜀䄀䄀㜀䘀㤀䔀㔀㈀䘀㤀㈀㜀㠀䄀䘀㘀㐀㌀㐀㔀䘀㜀䈀　㄀㔀㜀䐀㔀䐀㌀㔀㘀㘀䔀䈀㘀㈀䐀䄀㄀㘀䄀䈀䐀䐀　㠀䌀䘀㘀䈀䄀䐀䐀㤀㌀䌀䐀䘀㔀㤀㜀㐀㐀㔀䌀　㌀　䈀㠀㌀䐀䌀䔀䄀㈀㈀䄀㐀㘀　㘀㘀㘀䄀㌀㌀䘀䔀　　㠀㜀㌀㠀㘀䈀䔀㜀㌀㈀䘀　㌀㠀㜀䌀㄀䔀㠀䐀䈀䘀㜀㈀䄀㐀䈀㠀㤀䌀㜀䄀㤀䈀　㜀㌀㘀　㐀㈀㌀　䄀　㄀䔀䐀㄀㌀䐀䘀䌀䔀㘀䐀㘀　㐀㈀㘀㈀㜀㠀㈀㘀㄀䈀㔀䔀㠀䔀㄀䐀䌀䌀䔀䌀　㜀㈀㠀䈀㐀䐀㘀䔀㌀㤀㌀㤀㔀䔀䘀㜀㌀　㈀㄀䘀　䌀䐀䘀㤀䄀㐀㤀䔀䌀㜀䘀䄀䌀　䌀䄀䔀㠀㤀㘀㠀㐀㔀㜀䄀䄀㈀䔀㈀䌀㄀　　䌀㄀㈀　㘀䐀㔀　䄀䐀㄀㤀䈀㔀䈀䌀䘀㔀㠀㘀㔀䈀㜀䄀䄀䌀䐀　㠀㠀㌀䔀䘀䔀㠀䘀㜀㐀䐀䘀䄀䔀䔀㄀㘀　䈀㈀㘀䔀㠀㠀㠀㄀㔀䌀䄀䐀㘀㈀䄀䄀䈀㄀㐀㤀㌀䔀䘀䌀㄀㠀㐀㌀㜀㄀䔀㔀䈀䔀㔀䔀㄀㄀㄀䌀䈀㔀㐀㌀䘀䈀㐀㔀䐀䄀㜀㌀㈀䐀䌀䌀䌀㠀䔀㄀　㘀㌀㤀㈀㘀䐀㄀㌀㄀䐀㘀䘀㔀㐀㔀䘀㌀㠀㐀䘀䐀㈀㔀䐀㄀㜀㌀䌀㌀㤀㔀㤀䔀䐀㔀䈀㈀　䘀䄀㠀㠀䌀䈀㌀䄀㐀䔀䈀䌀㐀㈀㠀㠀䈀㤀䐀㈀㄀㌀㔀䔀㌀　䔀㤀　㠀㌀䐀䘀㠀䈀㠀㤀㔀㠀㄀㤀䐀㐀䈀㐀㐀䐀㌀䈀㘀䄀㐀䌀䘀㄀　㘀䔀䔀㠀㠀䘀䌀䔀䈀㌀㔀㈀㄀㤀䘀䈀㔀　㐀㘀㠀㌀䌀㜀㈀䘀㌀䐀㘀䐀䄀㔀䔀㔀㈀㠀䈀㔀㤀䌀㄀䐀㘀㄀䘀䐀㔀㤀㜀㔀䈀䌀㘀䘀䐀㌀䈀㘀䐀㘀㔀㤀㜀㔀㌀䌀㠀䌀㘀㐀㐀㠀㘀䐀䔀㈀㌀䈀㠀㈀㜀䌀㠀㔀䔀䔀㌀䈀㐀䌀䌀䘀㜀㠀㤀䌀㤀㄀㔀䈀䐀䐀㔀㠀䄀㠀㜀䌀㜀䌀䔀㜀㘀㌀䈀㘀㈀䔀䄀㘀䌀䐀㠀㔀䘀　㈀㈀㈀䈀㐀㌀㐀㠀㈀㘀㄀䐀䈀䄀㈀㈀㘀　㄀㠀㘀　䄀㤀㄀㔀㈀㄀㠀䐀㤀㄀㠀㄀䌀㄀㌀　㤀䈀　㤀䌀㘀㈀㐀䌀㔀㠀㐀䔀㠀㤀㤀䘀㠀㄀㄀　䔀㘀㤀㜀䌀㄀　䄀㠀㠀䈀㔀㌀䘀㄀㤀㠀㈀㐀㄀䘀㈀㐀㤀㠀㔀㔀䈀㄀㘀䔀䘀㠀　　䄀㘀㔀䔀㌀䄀㤀㜀㠀㄀䘀㈀䈀　㤀䔀㐀䘀㈀䐀㌀㘀䈀㤀䔀㔀　㐀㈀䌀㄀㌀䐀䐀䐀䌀䌀㜀　䔀㠀䌀㄀㔀㠀䘀䌀㄀㤀㠀㔀䄀㄀㈀㤀㠀㄀㠀䔀䌀㌀㈀䈀㘀䔀䄀㔀㤀㠀䘀㈀䈀㌀㈀䄀䈀䈀㘀㤀䔀㈀䐀㔀　㤀䈀䘀㌀㌀㘀䔀䌀䌀㤀䈀䔀㌀㜀㔀㤀䄀㔀䈀㘀㠀㠀㠀㜀㜀㤀㘀䌀㄀㔀䘀㜀㈀㈀　䌀㄀㠀䘀　㈀㠀㠀㠀䐀㜀㔀䈀㘀㤀㤀䐀㤀䈀㈀㈀㄀䔀䔀㄀㠀䘀㠀㌀㐀　䈀䔀㔀䈀䘀㜀䈀䄀䄀㔀　㌀㤀䔀㌀　㘀㄀䐀㜀㈀㘀䘀㐀㐀㌀㄀㌀㘀㘀䘀㄀㤀䈀䌀㔀㈀㜀䔀㜀䌀㄀㈀㌀㔀㘀䔀䄀䈀　㔀㈀㄀䔀䐀㈀㐀㘀㤀㐀䌀䈀䘀㠀䐀㘀䌀䌀㄀㄀㐀䘀䄀㜀䐀䈀䈀䔀㜀䐀㐀㘀䐀䘀䘀　䈀䔀㈀㠀㌀㜀㐀䘀㌀䘀㈀㠀㤀䄀㔀㈀㄀䄀㌀䌀㜀䔀㠀㤀㔀䐀㠀䘀䈀䈀　䈀䄀㐀㤀㘀㌀㌀㔀㘀䘀䔀㄀㄀䔀䈀䌀䘀䄀䄀䘀㌀㜀䌀䐀㘀䐀㘀㌀䄀䄀䈀　䔀䐀㠀䄀䐀㌀㘀㈀䐀䐀㜀䈀㌀䘀䔀䄀㘀㠀㤀㌀㌀㐀㔀㤀㌀　䈀䐀䌀㤀㤀㔀㘀䌀㘀㐀㔀䄀㔀㌀䄀䄀䌀㜀䌀䌀䌀䐀㘀䌀㔀䈀㐀㈀䐀㔀㘀㤀䈀䐀䐀㐀䄀㌀㘀㈀㤀䐀㄀㄀㔀　㄀䌀㌀䌀䄀䈀㔀䈀㈀䔀㈀㜀䄀㔀䐀㠀䌀㐀䌀㜀䄀㜀㘀䌀䔀䈀㔀䘀䈀㘀㌀䈀㔀㤀㐀䔀㐀䐀㘀㠀㐀㄀㐀䈀㜀㔀䄀㘀㤀䈀㄀㜀㄀㜀䌀㌀㜀䘀䈀㔀䘀㠀㔀䄀䘀㔀䈀㜀䘀䄀㠀䈀㌀㤀䔀䄀㔀㔀㠀㔀䐀䘀㌀䘀䐀㌀㘀䘀䐀䄀㔀䌀㠀䄀䐀㄀㐀㜀䘀㔀㜀㔀㌀䔀㘀㘀㔀䐀㘀㌀䘀㤀䄀䔀㈀䄀䄀㔀㈀䐀䐀㐀䘀㤀䐀㤀㔀䄀㠀㠀䄀㠀㜀㐀䐀㘀　㠀㜀㠀㈀㐀㌀㈀㐀㌀䈀䈀䐀㈀䄀䌀㔀䈀㈀㔀䈀䌀䔀㌀㠀㘀䔀䄀䐀㐀䌀䄀䔀㔀㜀㔀㤀䌀䔀㠀㘀㘀䐀㘀䌀㔀㘀㤀䐀䈀䄀䈀㘀䈀䄀㔀㔀㠀㜀㄀䐀㠀㠀㠀䘀䄀䘀䈀䌀䘀䘀䘀䈀䔀䐀㜀㌀㤀　㠀䘀䐀㤀䄀䄀㤀㠀䈀㘀䄀䘀䐀㠀　　䄀　㈀䈀　㈀㈀㘀㄀　㜀　䈀　㘀㌀䔀　㠀㔀㜀㜀䈀䈀㘀䈀㜀䔀㘀䘀䐀䈀㜀㈀㄀㘀㤀㠀㐀　㠀㐀㠀　　㤀㜀㐀㄀㄀䈀䈀㈀䐀㌀　㄀　㤀㠀㈀䌀　㈀䄀㘀㔀㜀　䄀㐀䈀㌀㐀䘀㠀䔀㠀㔀　䔀䔀䄀䘀㜀㤀㜀䔀䄀㈀㔀㌀㐀䌀㌀㘀㤀㤀㈀䔀㜀䈀　㄀㔀䄀㔀㄀䘀㐀䄀㄀䘀　䄀䌀䄀㈀㌀㜀　䘀䘀㘀䄀䈀䄀䈀㈀䈀㌀㔀㜀㜀　䘀㔀㤀䈀㔀㄀㤀㄀䄀㜀䐀　㔀䌀㜀㠀䌀㄀㌀䄀䐀㤀䐀　　㐀䈀䔀䄀䔀㜀㤀㠀䘀㜀㤀㌀　㤀㈀䄀䌀䘀㐀䐀䔀㔀䔀㠀㔀㔀䐀䔀䄀䌀㘀䈀㈀㠀䐀䘀㌀䐀㘀䈀㔀䈀㄀㔀䈀䘀䈀㤀㘀䘀㠀㘀㜀䔀㘀䘀㌀㌀　㔀䄀㜀㘀㌀䄀䌀䔀㤀㔀㐀㐀㄀䐀䈀䘀䐀䐀　㔀㤀㜀㐀㐀㔀䌀　㌀　䄀㤀䌀㠀䌀䄀㠀㘀㘀㈀㠀䔀䈀㌀㈀䐀㈀㘀㘀㔀㐀䘀㜀䘀㠀㤀㤀㈀　䘀㐀㔀㄀㤀㈀㘀㌀䌀㔀䌀䘀㠀䔀㤀㈀䌀　㘀䐀㐀㈀㌀䘀䄀䘀㌀㌀㐀㠀㈀㐀䌀䈀　㌀㜀㔀㤀䄀㤀䐀䌀㜀㌀㌀㌀㈀㤀䌀䘀䈀䈀䄀㤀㤀㈀㐀䔀㐀㘀㄀㤀䌀㜀㔀㤀㤀䄀㐀㤀㠀㄀㜀㈀㠀䐀　㤀䘀㈀䈀　䄀䔀䈀㤀䐀㔀䌀㜀㐀䐀䄀㘀䄀䔀㄀㐀䘀㔀䘀㐀㤀㔀㄀䔀䐀䌀㠀㘀㄀㈀㤀㔀䌀㄀䔀䌀䔀䘀㈀㠀䘀䄀䔀䐀㠀䌀䐀䔀㌀䌀㈀　㄀㄀㄀䄀䐀䐀䔀㐀㠀㠀　㈀䐀㄀㔀㌀㌀䄀䘀㘀㄀䈀䔀䌀　㜀䘀䐀㘀㤀㤀䄀䌀䘀㌀䌀㠀䐀䔀㘀　䄀䐀㄀䈀䔀㐀㌀䈀㐀䐀䘀䄀　㌀㈀䄀㄀　䈀䄀㄀䌀䄀㈀䈀㜀㠀㄀㜀䄀㤀䔀䌀䌀㔀　㤀㔀䐀㌀䌀䔀㌀䄀㘀㘀䌀䌀䄀㜀䐀㠀㌀䐀䄀䔀䐀㈀㘀䐀㌀䐀䐀䔀㈀　䘀䄀㘀䔀䐀㌀㐀㄀㔀㈀㘀䘀䌀㐀㘀䄀㄀㜀䈀㠀䄀䌀䄀㜀䘀䄀䐀㤀䔀㐀㄀㌀䘀㠀㐀㤀㈀㜀㔀䄀㌀㤀䔀䘀䈀㘀䘀䘀㄀䔀䌀㔀㠀䘀㄀䄀䐀䄀䄀䈀䌀㐀䐀䔀䄀㔀㌀㄀㐀䌀䐀㈀㠀㐀㠀䄀䘀㄀㔀㈀䐀　䈀䐀㐀㄀䔀䘀㐀㌀䄀　㠀䔀㌀㌀䘀䈀　㐀㈀　㤀㤀䔀䈀䔀䈀㐀䌀䔀䐀㌀㘀䘀㐀䔀㔀㜀㤀䐀㄀㜀㔀㠀䔀䘀㄀㐀㤀䌀㘀䔀䔀䄀䘀㘀㌀㐀㤀㔀　䘀䄀㠀㄀䘀㌀䌀䔀㠀㜀㌀䌀㠀䄀䄀䘀䈀䐀䘀㤀䘀㠀㌀䐀㜀　㠀㜀㜀㠀䔀㘀䄀䌀䈀䄀䌀㜀㐀㜀䐀䄀㠀䔀㈀㔀㌀㄀䄀㠀㠀䐀䄀䐀㐀　䘀㔀䐀㜀㈀䐀䔀㤀䌀㔀　㜀㐀㐀㔀䌀　㌀　㘀　㌀㄀䔀䘀㈀㄀㌀　㤀㠀䈀㠀㘀㤀䘀䄀㐀䈀㄀㐀㘀䘀　㠀㄀㐀㈀䌀㌀㄀㜀㐀　䄀㠀㌀㠀䌀㐀㤀㠀㔀㌀㤀㌀㠀㌀㔀䄀㤀㜀䄀䔀䌀　䈀㄀䐀䌀㠀㈀　䌀㐀㐀䌀䌀䄀㘀䔀　㔀㈀㜀㈀䈀㜀㘀　㌀　㠀㄀㌀㠀㐀㠀㜀㤀䈀㔀㈀䌀䘀㔀㘀㌀㤀　䌀㌀䌀㈀㘀㈀䈀㘀㜀㜀䘀㈀㘀㘀䔀㘀䄀䔀㘀㘀㘀　　㌀㄀䄀㤀䐀䐀㐀䌀䔀䈀䌀㄀㘀䐀䘀㠀㜀㔀㜀㠀䈀䄀䌀㜀㌀㤀㄀㔀䘀㐀䔀㘀　㄀㠀㤀䄀㤀䌀㤀䐀㄀㄀㌀㘀㜀㠀㌀㜀䔀㠀㌀䘀䐀䔀　㠀䈀䄀㜀䘀㤀䌀䌀䐀㌀㘀㠀㠀㈀㄀㄀㤀㔀　䐀䌀䐀　䌀㔀䄀䄀䌀㌀㔀㄀䔀㐀㔀㠀䔀㘀㔀㠀㈀　㄀䌀䐀䔀㐀㌀㤀㈀䘀䄀㄀䐀㤀䄀䐀㘀䔀㘀䔀㌀㈀㐀䐀㘀㤀㠀㐀　㜀㐀䌀㠀㠀䄀㌀䐀㔀㌀㜀䔀㜀䐀䄀䔀㠀㌀㐀㤀㌀　㠀㐀　㜀䘀䈀㜀䘀㘀㠀㤀㐀㤀䈀䐀㘀㐀䔀㜀㈀㌀㄀㠀㄀㄀䈀㌀䔀䈀䐀䈀䄀䐀㐀䌀㘀㌀　㤀䐀䘀䔀䔀䄀㠀㈀㤀䔀䘀　　䘀㄀䔀䌀㌀㐀䈀㔀㘀䘀㤀䐀䔀䐀㠀䈀㤀䐀㘀䄀㜀㌀㘀䔀㐀䐀㘀㄀䄀䌀㤀䌀䄀䌀䈀㈀㔀㠀㈀㐀䐀䌀㤀䌀䐀䌀㤀㐀㠀㈀䐀㌀㐀䐀䐀䐀㘀㤀㤀䄀㐀䄀䈀㌀㘀䄀㤀㌀㜀㤀䐀䔀䘀䘀㜀㜀㔀㠀䔀㤀㄀䔀㜀　㘀㐀㠀䘀㜀㘀䔀㔀㠀㄀䄀㠀㐀䐀䘀䐀䘀　㜀㌀㄀䈀㔀　㜀㐀㐀㔀䌀　㌀　䐀㄀㤀㠀㐀　䄀䌀㌀䌀䄀䌀　䌀㘀㤀䘀䄀㐀䈀㈀㘀䈀䔀㤀䈀㘀㐀㌀㤀　㘀䘀䐀㤀㈀䘀䔀㄀㠀㔀　㘀䔀㔀㈀㘀㔀䄀䈀㜀䄀㠀㈀㤀㔀㤀䔀㤀䈀㘀㘀䄀㔀㔀㤀㜀㜀䌀㐀㐀䄀㔀㌀㈀㔀䄀䈀䄀㄀㤀䈀㔀㈀㄀㄀㔀㐀㘀䘀䐀㌀㜀䐀䈀㌀㔀㐀䔀㘀㠀䘀㘀䐀䈀㐀䌀㤀㤀㐀䘀䈀䐀䌀㜀㐀㤀㤀　㘀䈀㜀䘀㄀㠀䌀䄀㜀㜀䈀㤀䌀㔀㜀㐀㄀㘀䘀㘀䄀㤀䄀㘀㔀㈀㔀㔀䌀㘀䔀䄀㔀䌀㤀䐀㄀䔀㤀㜀㌀䘀㐀㄀㌀䔀䌀㤀㜀䄀㘀䘀㤀䌀䌀䐀㌀㘀㠀㤀䄀㘀㠀㤀䔀䄀㌀䔀䈀㤀㐀䔀㜀㤀㤀䘀㄀䄀㘀㠀䈀䄀㜀㤀䔀㜀㘀㄀㐀㔀䔀㄀䌀㤀䔀䐀　　㔀䘀䐀㘀䔀㌀㈀㜀䐀㔀㔀㐀㈀䄀㌀䈀㜀䐀㄀㐀䐀䌀䐀㐀䌀㤀　㐀㔀䌀㤀㜀㌀䐀　䘀䈀䔀䈀䄀䄀　䘀㐀䈀㤀䐀　㜀㘀㐀䐀䔀㘀㜀䄀㌀㠀㌀㔀㈀䘀䐀䘀㌀䄀䔀㠀㘀䘀㈀㤀䔀䈀㜀䐀㈀䘀㐀　䘀䈀䐀　㠀䄀䌀㠀䐀䈀䄀　䘀㠀㄀㠀䐀㤀㌀㈀㈀　䈀　㈀　㈀㘀㌀䈀㄀㤀㔀㘀㘀䘀㈀䄀㤀䄀䄀䘀㜀㄀㌀㈀䄀䔀㌀㐀㈀㔀䐀䔀䈀㤀㔀㠀㈀䐀㌀㔀䐀㄀　㌀䌀㐀䐀㈀㔀㠀㈀㠀㜀㠀㔀㘀䄀㠀㜀䔀䐀㘀䈀㌀㈀㐀䘀䘀䈀䐀䘀㤀䘀䘀㌀䈀㄀䌀㠀㘀䔀䐀㔀䐀䐀㄀㘀䄀䄀䐀䄀㠀㔀㘀　㘀㔀䌀㄀㜀䄀䄀　㠀䘀㜀䔀㄀㠀㔀㠀㜀㐀㐀㔀䌀　㌀　䈀㠀㄀㠀䄀㠀㘀㐀㈀䔀䄀㌀㄀㌀䄀䈀㠀㈀䈀䐀㘀䔀䈀㌀䘀㄀㘀㄀䐀㠀㐀㘀㤀䈀㈀䄀㔀㌀䐀㌀䔀㐀㈀䄀㘀䈀㐀㘀㤀䐀㤀㤀㌀䈀㌀㔀㄀䐀䈀㌀䔀䈀䄀㠀㌀㈀䘀䈀䄀㘀䄀㘀䐀㤀㈀㘀㤀㌀䔀㌀㠀䈀　䐀䘀㘀　㌀㔀㔀㈀㘀㘀䈀㜀　㘀㔀䘀㘀㌀䐀㌀㜀䘀䈀㜀㌀㘀㐀䄀䈀㌀㌀㘀㔀㌀㜀㠀㄀䔀㜀㌀䔀㘀䌀㄀㌀㠀䈀䐀䌀㐀䘀䔀㔀㔀㌀㌀䐀䔀䔀㘀㜀㤀䌀㜀䌀㌀㘀䘀㤀䈀䔀㌀㈀䘀䈀䈀䐀㔀㜀䄀䄀㐀䔀㐀䘀㔀㌀䐀㤀㠀㐀䄀䄀䘀䔀䄀䘀䔀㌀㜀㔀　䔀㜀㘀䐀㘀　㠀䈀㄀㌀䌀㄀　㄀㔀䐀㐀䈀㤀㔀䘀　䌀㄀䌀䈀䄀㈀㈀㘀　㐀㘀䄀䌀㔀㠀㄀㔀䘀㜀㔀䄀㈀　㌀　㄀㠀㜀㠀䐀䌀　㈀㤀䐀㄀㄀㌀　䈀䔀㈀㔀䔀䐀㠀㈀㔀㔀䄀㈀　䔀㄀䔀㌀　㠀㠀㌀䔀㈀㐀㐀䘀䐀䈀䐀㤀　䈀㔀㌀㔀㔀㘀䘀䄀䘀㤀㐀㠀䘀㠀㄀䌀　㐀　䄀㄀㈀䈀　㈀　㘀䘀䐀䌀㄀㐀㐀㔀㠀㈀㔀㌀㠀㤀䈀㜀㌀䌀䔀㐀㘀䔀㄀㠀㘀㌀䔀　　䄀䐀䘀䐀㤀㜀䄀䐀䐀㤀㈀䄀㠀㄀㐀㈀㄀㘀䄀䈀㤀㔀　㜀㌀㄀䄀㈀㠀㜀䘀㄀㘀　㐀　䈀㜀㔀㈀㜀㠀䌀　㈀　䘀䘀䄀䘀䈀㄀㐀㈀㄀　㈀䔀㄀㘀䄀䐀㘀䌀㠀㌀㔀㌀㈀䈀　㌀䈀㐀䘀䈀䘀䈀㤀䈀䄀　　䘀㠀㔀㈀䈀㐀䄀㐀㜀㠀䔀㄀㔀㤀䔀䘀㈀㄀㄀䄀㔀㄀䔀䔀㜀䘀㄀㄀䘀䄀䄀㄀䌀䌀䄀㌀䐀䐀㤀䄀䄀　㌀　䄀　㌀㠀㄀㐀㤀㠀䈀䄀䔀　㠀㄀㠀㄀㐀䄀䌀㄀㌀㘀㄀㤀㔀䘀　㜀㐀㠀㐀䔀㠀㜀　䈀　　　㄀　䌀㌀䐀㈀䌀䈀㈀䄀㤀㄀䈀䘀䌀㐀　䄀　㔀䄀䈀䔀㜀㠀㔀㐀㄀㜀㠀䄀㐀　㄀㠀㌀㄀䔀㈀　㐀㤀㤀㤀㔀㠀䄀㘀㔀　㘀㈀㈀䔀㄀㐀䐀䐀㘀䔀㘀㔀㌀㠀㔀䌀㌀㐀䈀㠀㜀㔀䌀䈀㈀䐀㈀㐀㈀㠀䘀䘀㔀　㌀䄀䄀㈀㠀䘀䌀㄀䘀䄀㜀㌀㠀㐀䐀䄀㐀㌀㜀䐀䈀㤀㠀㔀㈀㌀㠀䔀㠀䄀㠀㄀㠀㄀㐀　㔀㜀　㐀䌀䌀㐀㐀㔀䄀㈀㔀㠀　㐀䘀䐀　㔀䔀㔀㘀㠀㤀㘀㜀㘀䌀䐀䘀㌀㐀㤀㔀䔀䌀㘀㈀䐀㠀䈀㔀㈀　㄀㐀㌀㠀䐀㈀䄀㐀　㄀㠀㌀　㐀䔀㄀䈀㄀㔀䈀㐀㈀䄀㠀㔀䌀䄀㐀㜀䄀䈀㄀䘀䄀䄀㐀㔀㘀　㘀䔀㠀㐀䈀　㌀　㘀䈀䐀䐀䌀㤀䐀䘀䄀㜀䈀㤀㜀㤀䔀㜀㤀䐀䔀䌀䄀㄀㜀䈀㐀䈀㤀㠀㔀㠀㌀㌀䄀㔀䔀㘀䈀䘀䐀䌀㔀㔀　　㔀　㈀㤀䐀㐀㜀㔀㜀　㐀　䌀㈀㘀䈀䘀㠀㤀䈀㘀㐀䄀䔀㐀㤀㘀㠀㌀㌀䄀䄀䈀㠀㐀㔀䈀㤀㈀䌀㘀䘀㈀㄀㈀䄀䈀㐀䈀㄀䈀㜀䔀䄀䈀䈀㈀㌀㈀䄀㐀䌀㜀㄀䔀㠀㐀㄀㐀㌀䔀㌀㠀㤀䘀䈀㜀䐀㠀䄀㤀　㐀　㘀㄀䌀㔀䐀㄀㄀㌀　䈀䘀㐀㠀㘀　䈀㜀㠀㘀䈀㜀㘀䄀　㠀㤀㜀䌀　䌀　㈀㌀　㐀䌀䌀䘀䔀㐀㄀　㐀䘀㌀　㔀㜀䔀㈀㄀㄀　　㈀㈀㘀㄀　　㠀䈀㐀㠀㘀㄀　㌀　㠀㄀㐀　䄀　㌀㔀㠀㐀㠀　　㤀　㐀　㈀䄀䐀㈀㄀　㐀㐀䌀㈀　㄀　㘀㠀　䐀㈀㄀㘀　　㈀㠀㄀㐀　㘀䈀　㠀　㄀㄀㌀　㠀　㐀㔀䄀㐀㌀　㠀㤀㠀㐀　㈀　䐀　㄀䄀㐀㈀䌀　　㐀　㈀㠀㄀䐀㘀㄀　　㈀㈀㘀㄀　　㠀䈀㐀㠀㘀㄀　㌀　㠀㄀㐀　䄀　㌀㔀㠀㐀㠀　　㤀　㐀　㈀䄀䐀㈀㄀　㐀㐀䌀㈀　㄀　㘀㠀　䐀㈀㄀㘀　　㈀㠀㄀㐀　㘀䈀　㠀　㄀㄀㌀　㠀　㐀㔀䄀㐀㌀　㠀㤀㠀㐀　㈀　䐀　㄀䄀㐀㈀䌀　　㐀　㈀㠀㄀䐀㘀䐀　㄀㔀　㄀䘀㌀㠀㈀　㔀　㈀㠀㄀㌀㘀㌀　㘀㔀㜀䘀㔀㘀䐀䔀㄀㔀　㄀䈀㌀㔀䘀㤀㤀㄀　　㠀　㐀䐀䄀㐀㄀㔀㜀　㐀㐀䌀㈀　㄀　㤀㠀㄀㠀䘀　㐀䄀㄀䘀䐀䔀㌀㄀䌀㘀㘀䈀㜀㔀㌀㘀䐀䄀㜀䔀㐀㘀　㠀㤀㠀㐀　㘀　䈀　䌀　䈀䈀䈀㔀㜀㠀䔀䐀䌀䔀䄀䐀䐀㘀　㄀㠀㐀㠀　　㤀　㐀　㘀　䈀䈀䌀䌀㔀㜀㐀䄀㤀㜀㔀　㐀㈀㄀㘀　　㈀㠀㄀㐀　㘀䈀　㠀　㄀㄀㌀　㠀　䌀㄀㘀㜀㠀䐀䘀䐀㘀䔀㜀䄀䌀㈀㌀　㠀　㄀㄀㌀　㠀　㐀㔀䄀㐀㌀　㠀㤀㠀㐀　㈀　䐀　㄀䄀㐀㈀䌀　　㐀　㈀㠀㄀䐀㘀㄀　　㈀㈀㘀㄀　　㠀䈀㐀㠀㘀㄀　㌀　㠀㄀㐀　䄀　㌀㔀㠀㐀㠀　　㤀　㐀　㈀䄀䐀㈀㄀　㐀㐀䌀㈀　㄀　㘀㠀　䐀㈀㄀㘀　　㈀㠀㄀㐀　㘀䈀　㠀　㄀㄀㌀　㠀　㐀㔀䄀㐀㌀　㠀㤀㠀㐀　㈀　䐀　㄀䄀㐀㈀䌀　　㐀　㈀㠀㄀䐀㘀㄀　　㈀㈀㘀㄀　　㠀䈀㐀㠀㘀㄀　㌀　㠀㄀㐀　䄀　㌀㔀㠀㐀㠀　　㤀　㐀　㈀䄀䐀䔀㄀䘀䘀　㄀䐀䔀㜀䐀䈀㘀䔀㘀㘀㈀䈀㄀䄀㐀㜀　　　　　　　　　㐀㤀㐀㔀㐀䔀㐀㐀䄀䔀㐀㈀㘀　㠀㈀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 ⠀嬀猀攀琀琀椀渀最开最爀漀甀瀀开椀搀崀Ⰰ 嬀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀崀Ⰰ 嬀猀攀琀琀椀渀最开最爀漀甀瀀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀椀猀开爀攀最椀猀琀攀爀开挀漀搀攀开愀瀀瀀氀椀攀搀崀Ⰰ 嬀爀攀最椀猀琀攀爀开挀漀搀攀崀Ⰰ 嬀愀甀琀漀开最攀渀开搀漀挀开椀搀开氀攀渀最琀栀崀Ⰰ 嬀甀猀攀开愀甀琀漀开最攀渀开搀漀挀开椀搀开漀渀开渀甀氀氀崀Ⰰ 嬀搀漀挀开椀搀开昀漀爀洀愀琀崀Ⰰ 嬀搀漀挀开椀搀开氀愀猀琀开椀渀琀攀最攀爀崀Ⰰ 嬀搀愀琀攀开猀琀礀氀攀崀Ⰰ 嬀挀甀氀琀甀爀攀开挀漀搀攀崀Ⰰ 嬀搀漀挀开愀甀琀漀最攀渀开洀愀砀开琀爀椀攀猀崀Ⰰ 嬀搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀Ⰰ 嬀搀攀昀愀甀氀琀开昀漀爀洀开椀搀崀Ⰰ 嬀搀攀昀愀甀氀琀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀搀攀昀愀甀氀琀开琀愀最开琀爀攀攀开椀搀崀Ⰰ 嬀搀攀昀愀甀氀琀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀Ⰰ 嬀搀甀瀀氀椀挀愀琀攀开洀愀渀愀最攀洀攀渀琀崀Ⰰ 嬀挀爀攀愀琀攀搀开氀愀猀琀开洀椀渀甀琀攀猀崀Ⰰ 嬀攀渀昀漀爀挀攀搀开爀攀琀攀渀琀椀漀渀崀Ⰰ 嬀昀椀氀攀开爀攀愀搀开氀漀最崀Ⰰ 嬀昀椀氀攀开搀攀氀攀琀攀开氀漀最崀Ⰰ 嬀猀琀漀爀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀崀Ⰰ 嬀猀琀漀爀攀开琀栀甀洀戀渀愀椀氀猀崀Ⰰ 嬀搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀Ⰰ 嬀戀漀漀欀椀渀最开椀渀开琀椀洀攀开戀漀砀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀䴀愀猀琀攀爀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀✀Ⰰ 一✀堀儀✀Ⰰ 㐀Ⰰ 一✀夀攀猀✀Ⰰ 一✀䄀氀瀀栀愀✀Ⰰ ㄀　　　Ⰰ ㈀㌀Ⰰ 一✀攀渀ⴀ䜀䈀     ✀Ⰰ 㐀　Ⰰ ㄀　　　㘀Ⰰ ㈀㄀Ⰰ ㄀Ⰰ ㈀Ⰰ ㄀Ⰰ 一✀伀渀✀Ⰰ 㘀　Ⰰ 一✀伀昀昀✀Ⰰ 一✀伀昀昀✀Ⰰ 一✀伀渀 ✀Ⰰ 一✀伀渀 ✀Ⰰ 一✀伀渀 ✀Ⰰ 㘀Ⰰ 㐀㌀㈀　⤀ 
SET IDENTITY_INSERT [base].[global_settings_groups] OFF਀䜀伀 
SET IDENTITY_INSERT [base].[units_of_measure] ON ਀ 
INSERT [base].[units_of_measure] ([unit_id], [unit], [descr], [list_position]) VALUES (1, N'p', N'Number of pages', 1)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀Ⰰ 嬀甀渀椀琀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀Ⰰ 一✀圀漀爀搀猀✀Ⰰ 一✀一甀洀戀攀爀 漀昀 眀漀爀搀猀✀Ⰰ 㐀⤀ 
INSERT [base].[units_of_measure] ([unit_id], [unit], [descr], [list_position]) VALUES (8, N'char', N'Characters', NULL)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀Ⰰ 嬀甀渀椀琀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㈀Ⰰ 一✀洀✀Ⰰ 一✀䴀漀渀琀栀猀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [base].[units_of_measure] ([unit_id], [unit], [descr], [list_position]) VALUES (13, N'y', N'Years', NULL)਀䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀Ⰰ 嬀甀渀椀琀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㐀Ⰰ 一✀─✀Ⰰ 一✀倀攀爀挀攀渀琀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [base].[units_of_measure] ([unit_id], [unit], [descr], [list_position]) VALUES (15, N'kg', N'Kilogram', 1)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㘀Ⰰ 一✀刀攀瘀椀攀眀✀Ⰰ 一✀一攀砀琀 刀攀瘀椀攀眀 䐀愀琀攀✀Ⰰ 一唀䰀䰀⤀ 
SET IDENTITY_INSERT [doc_attr].[doc_date_field_names] OFF਀䜀伀 
SET IDENTITY_INSERT [doc_attr].[doc_free_text_field_names] ON ਀ 
INSERT [doc_attr].[doc_free_text_field_names] ([doc_free_text_name_id], [mnem], [attr_name], [descr]) VALUES (1, N'Title', N'Title', N'Document title')਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀Ⰰ 一✀䐀攀猀挀爀✀Ⰰ 一✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 搀攀猀挀爀椀瀀琀椀漀渀✀⤀ 
INSERT [doc_attr].[doc_free_text_field_names] ([doc_free_text_name_id], [mnem], [attr_name], [descr]) VALUES (4, N'Abs', N'Abstract', N'Document abstract')਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㠀Ⰰ 一✀刀攀氀✀Ⰰ 一✀刀攀氀攀愀猀攀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 爀攀瘀椀猀椀漀渀 漀爀 瘀攀爀猀椀漀渀✀⤀ 
SET IDENTITY_INSERT [doc_attr].[doc_free_text_field_names] OFF਀䜀伀 
SET IDENTITY_INSERT [doc_attr].[doc_integer_field_names] ON ਀ 
INSERT [doc_attr].[doc_integer_field_names] ([doc_int_name_id], [mnem], [attr_name], [descr], [unit_id]) VALUES (1, N'RevInt', N'Review Interval', N'', 13)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㄀　Ⰰ ㈀　㈀㈀㘀Ⰰ 一✀刀䔀匀✀Ⰰ 一✀刀攀猀攀爀瘀攀搀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 䤀䐀 椀猀 爀攀猀攀爀瘀攀搀 瀀爀椀漀爀 琀漀 愀 昀椀氀攀 戀攀椀渀最 挀爀攀愀琀攀搀 漀爀 爀攀最椀猀琀攀爀攀搀⸀✀Ⰰ ㄀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10011, 20226, N'PUB', N'Published', N'Document is released and published.', 2)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㄀㈀Ⰰ ㈀　㈀㈀㘀Ⰰ 一✀匀唀倀䐀✀Ⰰ 一✀匀甀瀀攀爀猀攀搀攀搀 䐀漀挀甀洀攀渀琀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 栀愀猀 戀攀攀渀 猀甀瀀攀爀猀攀搀攀搀 戀礀 愀渀漀琀栀攀爀 搀漀挀甀洀攀渀琀✀Ⰰ 㐀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10013, 20226, N'CAN', N'Cancelled', N'Document has been cancelled from use and is not superseded by another document.', 3)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㄀㐀Ⰰ ㈀　㈀㈀㘀Ⰰ 一✀一倀✀Ⰰ 一✀一漀琀 倀甀戀氀椀猀栀攀搀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 䤀䐀 眀愀猀 爀攀最椀猀琀攀爀攀搀 愀渀搀 挀爀攀愀琀攀搀 戀甀琀 椀猀 渀漀琀 瀀甀戀氀椀猀栀攀搀⸀✀Ⰰ 㔀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10038, 50296, N'PROC', N'Procedure', N'A procedure typically defines actions which must be followed.', 1)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㌀㤀Ⰰ 㔀　㈀㤀㘀Ⰰ 一✀匀吀䐀✀Ⰰ 一✀匀琀愀渀搀愀爀搀✀Ⰰ 一✀䄀 猀琀愀渀搀愀爀搀 琀礀瀀椀挀愀氀氀礀 搀攀昀椀渀攀猀 漀甀琀挀漀洀攀猀 眀栀椀挀栀 洀甀猀琀 戀攀 愀挀栀椀攀瘀攀搀Ⰰ 愀猀 漀瀀瀀漀猀攀搀 琀漀 愀挀琀椀漀渀猀 眀栀椀挀栀 洀甀猀琀 戀攀 昀漀氀氀漀眀攀搀⸀✀Ⰰ ㈀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10040, 50296, N'POL', N'Policy', N'A policy typically defines overarching governing rules.', 3)਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㐀㄀Ⰰ 㔀　㈀㤀㘀Ⰰ 一✀圀䤀✀Ⰰ 一✀圀漀爀欀 䤀渀猀琀爀甀挀琀椀漀渀✀Ⰰ 一✀䄀 眀漀爀欀 椀渀猀琀爀甀挀琀椀漀渀 椀猀 琀礀瀀椀挀愀氀氀礀 愀 琀愀猀欀ⴀ猀瀀攀挀椀昀椀挀 瀀爀漀挀攀搀甀爀攀⸀✀Ⰰ 㐀⤀ 
INSERT [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id], [doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (10042, 50296, N'FRM', N'Form', N'A form is typically used to transfer data.', 5)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀Ⰰ 嬀爀攀猀琀爀椀挀琀攀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀　㈀㈀㘀Ⰰ 一✀倀甀戀匀琀愀琀   ✀Ⰰ 一✀倀甀戀氀椀挀愀琀椀漀渀 匀琀愀琀甀猀✀Ⰰ 一✀吀栀攀 瀀甀戀氀椀挀愀琀椀漀渀 猀琀愀琀甀猀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀⸀  攀⸀最⸀  刀攀猀攀爀瘀攀搀Ⰰ 倀甀戀氀椀猀栀攀搀 攀琀挀⸀✀Ⰰ ㄀Ⰰ ㄀⤀ 
INSERT [doc_attr].[doc_radio_button_list_names] ([doc_radiob_list_id], [mnem], [attr_name], [descr], [list_position], [restricted]) VALUES (50296, N'DocType', N'Document Type', N'The type of document.', 2, NULL)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　㄀㄀Ⰰ ㄀　　　㘀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀䐀伀䤀✀Ⰰ 一✀䐀愀琀攀 漀昀 䤀猀猀甀攀✀Ⰰ 一✀✀⤀ 
SET IDENTITY_INSERT [file_attr].[file_date_field_names] OFF਀䜀伀 
INSERT [file_attr].[file_date_values] ([file_id], [file_date_name_id], [date_value]) VALUES (1000, 1, CAST(N'2026-03-08T00:00:00.0000000' AS DateTime2))਀䜀伀 
SET IDENTITY_INSERT [file_attr].[file_free_text_field_names] ON ਀ 
INSERT [file_attr].[file_free_text_field_names] ([file_free_text_name_id], [mnem], [attr_name], [descr]) VALUES (1, N'REL', N'Release Number', N'')਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀Ⰰ 一✀䄀甀琀栀漀爀✀Ⰰ 一✀䄀甀琀栀漀爀✀Ⰰ 一✀✀⤀ 
INSERT [file_attr].[file_free_text_field_names] ([file_free_text_name_id], [mnem], [attr_name], [descr]) VALUES (10004, N'Changes', N'Change Notes', N'')਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀 ⠀嬀昀椀氀攀开椀搀崀Ⰰ 嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀琀攀砀琀开瘀愀氀甀攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　Ⰰ ㄀Ⰰ 一✀䄀✀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ ㌀Ⰰ 一✀匀刀䌀✀Ⰰ 一✀匀漀甀爀挀攀 䘀椀氀攀✀Ⰰ 一✀䄀 猀漀甀爀挀攀 昀椀氀攀 猀甀挀栀 愀猀 ⸀搀漀挀✀Ⰰ ㄀⤀ 
INSERT [file_attr].[file_radio_button_attributes] ([file_radiob_attr_id], [file_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (2, 3, N'DIST', N'Distribution File', N'A distribution file such as .pdf', 2)਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㐀Ⰰ ㈀Ⰰ 一✀䌀唀刀✀Ⰰ 一✀䌀甀爀爀攀渀琀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [file_attr].[file_radio_button_attributes] ([file_radiob_attr_id], [file_radiob_list_id], [mnem], [attr_name], [descr], [list_position]) VALUES (5, 2, N'SUP', N'Superseded', NULL, NULL)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀椀氀攀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　Ⰰ 㐀Ⰰ ㈀⤀ 
INSERT [file_attr].[file_radio_button_links] ([file_id], [file_radiob_attr_id], [file_radiob_list_id]) VALUES (1000, 2, 3)਀䜀伀 
SET IDENTITY_INSERT [file_attr].[file_radio_button_list_names] ON ਀ 
INSERT [file_attr].[file_radio_button_list_names] ([file_radiob_list_id], [mnem], [attr_name], [descr], [list_position], [restricted]) VALUES (2, N'FSTAT', N'File Status', N'Whether the file is published or another status', 1, 0)਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀Ⰰ 嬀爀攀猀琀爀椀挀琀攀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀Ⰰ 一✀䘀伀刀䴀䄀吀✀Ⰰ 一✀䘀椀氀攀 䘀漀爀洀愀琀✀Ⰰ 一✀圀栀攀琀栀攀爀 琀栀攀 昀椀氀攀 椀猀 愀 猀漀甀爀挀攀 昀椀氀攀 猀甀挀栀 愀猀 ⸀搀漀挀 漀爀 椀猀 愀 搀椀猀琀爀椀戀甀琀椀漀渀 昀漀爀洀愀琀 猀甀挀栀 愀猀 ⸀瀀搀昀✀Ⰰ ㌀Ⰰ 一唀䰀䰀⤀ 
SET IDENTITY_INSERT [file_attr].[file_radio_button_list_names] OFF਀䜀伀 
INSERT [file_attr].[file_radiob_attr_fgroup_links] ([file_radiob_attr_id], [filter_group_id]) VALUES (2, 10006)਀䤀一匀䔀刀吀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㐀Ⰰ ㄀　　　㘀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀 ⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀　　　㘀Ⰰ 一✀倀甀戀氀椀猀栀攀搀✀Ⰰ 一✀倀甀戀氀椀猀栀攀搀 䐀漀挀甀洀攀渀琀猀✀Ⰰ 一✀䘀椀氀琀攀爀猀 昀椀氀攀猀 眀栀椀挀栀 愀爀攀 挀甀爀爀攀渀琀 氀愀琀攀猀琀 爀攀瘀椀猀椀漀渀 愀渀搀 搀漀挀甀洀攀渀琀 猀琀愀琀甀猀 椀猀 瀀甀戀氀椀猀栀攀搀⸀✀Ⰰ ㄀⤀ 
SET IDENTITY_INSERT [forms].[filter_groups] OFF਀䜀伀 
INSERT [forms].[form_doc_booking_comnts_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 40, N'Y', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_booking_date_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 10, N'W', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_booking_id_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 10, N'W', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_booking_release_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 5, N'V', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_booking_status_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, 5, N'O', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㔀Ⰰ 一✀伀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ 一唀䰀䰀Ⰰ 一✀倀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_booking_user_id_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 10, N'P', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_booking_usernm_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, 20, N'Q', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㈀　Ⰰ 一✀儀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀　Ⰰ 一✀伀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㈀　Ⰰ 一✀一✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀㔀Ⰰ 一✀一✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㘀Ⰰ 一唀䰀䰀Ⰰ ㄀㔀Ⰰ 一✀一✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㄀Ⰰ 一唀䰀䰀Ⰰ 㔀　Ⰰ 一✀䄀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_free_text_field_links] ([form_id], [doc_free_text_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, 3, NULL, 50, N'B', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ 㠀Ⰰ 一唀䰀䰀Ⰰ ㄀　Ⰰ 一✀䌀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_free_text_field_links] ([form_id], [doc_free_text_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (22, 1, NULL, 50, N'A', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㈀Ⰰ ㌀Ⰰ 一唀䰀䰀Ⰰ 㔀　Ⰰ 一✀䘀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_free_text_field_links] ([form_id], [doc_free_text_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (22, 8, NULL, 10, N'C', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀Ⰰ 一唀䰀䰀Ⰰ 㔀　Ⰰ 一✀䄀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_free_text_field_links] ([form_id], [doc_free_text_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 3, NULL, 50, N'B', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㠀Ⰰ 一唀䰀䰀Ⰰ ㄀　Ⰰ 一✀䌀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㈀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一✀一✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_function_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 2, NULL, 20, N'N', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_function_list_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 3, NULL, 20, N'O', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㐀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一✀倀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀氀漀挀欀开猀琀愀琀甀猀开搀攀昀愀甀氀琀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 一唀䰀䰀Ⰰ 㠀Ⰰ 一✀䬀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㈀　㈀㈀㘀Ⰰ 一唀䰀䰀Ⰰ ㈀㔀Ⰰ 一✀䰀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ ㄀　　㄀㄀⤀ 
INSERT [forms].[form_doc_radio_button_links] ([form_id], [doc_radiob_list_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3], [default_doc_rb_attr_id]) VALUES (21, 50296, NULL, 25, N'M', NULL, NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㈀Ⰰ ㈀　㈀㈀㘀Ⰰ 一唀䰀䰀Ⰰ ㈀㔀Ⰰ 一✀䰀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_radio_button_links] ([form_id], [doc_radiob_list_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3], [default_doc_rb_attr_id]) VALUES (22, 50296, NULL, 25, N'M', NULL, NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㈀　㈀㈀㘀Ⰰ 一唀䰀䰀Ⰰ ㈀㔀Ⰰ 一✀䰀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_radio_button_links] ([form_id], [doc_radiob_list_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3], [default_doc_rb_attr_id]) VALUES (33, 50296, NULL, 25, N'M', NULL, NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_transaction_grp_links] ([form_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, NULL, 10, N'L', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_doc_user_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 2, NULL, 10, N'H', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㌀Ⰰ 一唀䰀䰀Ⰰ ㄀　Ⰰ 一✀䠀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_doc_user_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 4, NULL, 10, N'H', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_content_hash_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 5, N'ZZ', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_created_by_id_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 10, N'Y', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_created_by_nm_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 15, N'Y', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_created_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 15, N'Y', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_date_field_links] ([form_id], [file_date_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, 1, NULL, 50, N'M', N'', N'', N'')਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀Ⰰ 一唀䰀䰀Ⰰ 㔀　Ⰰ 一✀䴀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ 一✀✀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㄀Ⰰ 一唀䰀䰀Ⰰ 㠀Ⰰ 一✀䈀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_file_free_text_links] ([form_id], [file_free_text_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (22, 1, NULL, 8, N'B', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀Ⰰ 一唀䰀䰀Ⰰ 㠀Ⰰ 一✀䈀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_file_free_text_links] ([form_id], [file_free_text_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 10004, NULL, 50, N'Z', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_name_links] ([form_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (21, NULL, 100, N'D', NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㈀Ⰰ 一唀䰀䰀Ⰰ ㄀　　Ⰰ 一✀䐀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_file_name_links] ([form_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, NULL, 100, N'D', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_radio_button_links] ([form_id], [file_radiob_list_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3], [default_file_rb_attr_id]) VALUES (21, 2, NULL, 15, N'G', N'', N'', N'', NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㌀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一✀䠀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ ㈀⤀ 
INSERT [forms].[form_file_radio_button_links] ([form_id], [file_radiob_list_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3], [default_file_rb_attr_id]) VALUES (22, 2, NULL, 15, N'G', NULL, NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㈀Ⰰ ㌀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一✀䠀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_file_radio_button_links] ([form_id], [file_radiob_list_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3], [default_file_rb_attr_id]) VALUES (33, 2, NULL, 15, N'G', NULL, NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀Ⰰ 嬀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㌀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一✀䠀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ 㔀　Ⰰ 一✀一✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
GO਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ ㄀　Ⰰ 一✀䬀✀Ⰰ 一✀✀Ⰰ 一✀✀Ⰰ 一✀✀⤀ 
INSERT [forms].[form_file_size_links] ([form_id], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 10, N'K', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_transactn_grp_links] ([form_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, NULL, 20, N'K', NULL, NULL, NULL)਀䜀伀 
INSERT [forms].[form_file_user_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 18, NULL, 20, NULL, NULL, NULL, NULL)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀愀渀搀愀琀漀爀礀崀Ⰰ 嬀氀攀渀最琀栀崀Ⰰ 嬀瀀漀猀椀琀椀漀渀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㄀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㈀崀Ⰰ 嬀愀琀琀爀椀戀甀琀攀㌀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀㌀Ⰰ ㄀㤀Ⰰ 一唀䰀䰀Ⰰ ㈀　Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [forms].[form_file_user_links] ([form_id], [general_field_name_id], [mandatory], [length], [position], [attribute1], [attribute2], [attribute3]) VALUES (33, 21, NULL, 20, NULL, NULL, NULL, NULL)਀䜀伀 
SET IDENTITY_INSERT [forms].[form_identifier_names] ON ਀ 
INSERT [forms].[form_identifier_names] ([form_id], [form_group_id], [mnem], [form_name], [descr], [list_position]) VALUES (21, NULL, N'Base', N'Base Form', N'', 1)਀䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀Ⰰ 嬀昀漀爀洀开最爀漀甀瀀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀昀漀爀洀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㈀Ⰰ 一唀䰀䰀Ⰰ 一✀匀栀漀爀琀✀Ⰰ 一✀匀栀漀爀琀 䘀漀爀洀✀Ⰰ 一✀✀Ⰰ ㈀⤀ 
INSERT [forms].[form_identifier_names] ([form_id], [form_group_id], [mnem], [form_name], [descr], [list_position]) VALUES (33, NULL, N'Long', N'Long Form', N'', 3)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀氀愀渀最甀愀最攀开氀椀猀琀崀 ⠀嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开渀愀洀攀开攀渀最氀椀猀栀崀Ⰰ 嬀氀愀渀最甀愀最攀开渀愀洀攀开氀愀渀最甀愀最攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䔀一✀Ⰰ 一✀䔀渀最氀椀猀栀✀Ⰰ 一✀䔀渀最氀椀猀栀✀⤀ 
INSERT [messaging].[language_list] ([language_id], [language_name_english], [language_name_language]) VALUES (N'FR', N'French', N'Le français')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀氀愀渀最甀愀最攀开氀椀猀琀崀 ⠀嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开渀愀洀攀开攀渀最氀椀猀栀崀Ⰰ 嬀氀愀渀最甀愀最攀开渀愀洀攀开氀愀渀最甀愀最攀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀娀䠀✀Ⰰ 一✀䌀栀椀渀攀猀攀✀Ⰰ 一✀ⴀ蝎❥⤀ 
GO਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀唀渀椀焀甀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䐀愀琀愀 眀愀猀 渀漀琀 甀渀椀焀甀攀⸀  䄀 爀攀挀漀爀搀 眀椀琀栀 琀栀攀 猀愀洀攀 搀愀琀愀 愀氀爀攀愀搀礀 攀砀椀猀琀猀⸀ 
', NULL, N'Already Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀漀漀䰀漀渀最㄀　✀Ⰰ 一✀䔀一✀Ⰰ 一✀匀琀爀椀渀最 眀愀猀 愀琀 氀攀愀猀琀 ㄀　 挀栀愀爀愀挀琀攀爀猀 愀渀搀 洀愀礀 栀愀瘀攀 戀攀攀渀 琀爀甀渀挀愀琀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TooLong50', N'EN', N'String was at least 50 characters and may have been truncated.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀渀猀瀀攀挀椀昀椀攀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 攀爀爀漀爀 漀挀挀甀爀爀攀搀⸀ 
', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀䤀一吀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䤀渀挀漀爀爀攀挀琀 搀愀琀愀 琀礀瀀攀 猀甀瀀瀀氀椀攀搀⸀  䤀渀琀攀最攀爀 攀砀瀀攀挀琀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TooLongMax', N'EN', N'The string was too long.  ', N'Maximum length for nvarchar(max)', NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀愀琀愀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 搀愀琀愀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'InsertError', N'EN', N'An error occured upon inserting the record.  Transaction rolled back.', NULL, N'Insert Error')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀甀挀挀攀猀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀 猀甀挀挀攀猀猀昀甀氀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FailedDataValidation', N'EN', N'Data validation failed.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'XRefExists', N'EN', N'One or more cross references exist which must be deleted before this record can be deleted.', N'Flags a referential integrity constraint.', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䘀椀氀攀渀愀洀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀椀氀攀渀愀洀攀 眀愀猀 渀漀琀 愀 瘀愀氀椀搀 圀椀渀搀漀眀猀 昀椀氀攀渀愀洀攀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FilenameTooLong', N'EN', N'The filename exceeded the maximum allowable length of 255 characters.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀䜀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoMatch', N'EN', N'No matching records exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀一漀琀唀渀椀焀甀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 眀愀猀 渀漀琀 甀渀椀焀甀攀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 唀渀椀焀甀攀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ZeroRecords', N'EN', N'Zero records were retrieved.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䔀椀琀栀攀爀 琀栀攀 昀椀氀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoDocID', N'EN', N'No document ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 昀椀氀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DocIDLocked', N'EN', N'The document ID has been locked against alteration.', NULL, N'Locked')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀䜀爀漀甀瀀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoNameID', N'EN', N'No name ID was supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoRecordID', N'EN', N'No record ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 䤀䐀 愀渀搀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 䤀䐀 瀀愀椀爀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'AttrListNameNotExist', N'EN', N'The attribute list name ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 渀愀洀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'RBListNotExist', N'EN', N'The radio button list does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䄀琀琀爀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 愀琀琀爀椀戀甀琀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'AttrExist', N'EN', N'The attribute class has already been assigned for the given object.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䴀愀砀䐀漀挀吀爀椀攀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 洀愀砀椀洀甀洀 渀甀洀戀攀爀 漀昀 愀琀琀攀洀瀀琀猀 愀琀 挀爀攀愀琀椀渀最 愀 甀渀椀焀甀攀 爀愀渀搀漀洀 搀漀挀甀洀攀渀琀 䤀䐀 栀愀猀 戀攀攀渀 爀攀愀挀栀攀搀⸀  䔀砀琀攀渀搀 琀栀攀 愀甀琀漀 最攀渀攀爀愀琀攀搀 搀漀挀甀洀攀渀琀 䤀䐀 氀攀渀最琀栀 漀爀 挀爀攀愀琀攀 愀 渀攀眀 搀漀挀甀洀攀渀琀 䤀䐀 瀀爀攀昀椀砀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FmGNotExist', N'EN', N'The form group does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFormID', N'EN', N'No form ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀漀爀洀䜀爀漀甀瀀一漀琀伀眀渀攀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀漀爀洀 最爀漀甀瀀 椀猀 渀漀琀 漀眀渀攀搀 戀礀 琀栀攀 甀猀攀爀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoUserSidID', N'EN', N'No user ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䄀琀琀爀一愀洀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DateFormatIDNotExist', N'EN', N'The date format ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀䰀椀渀欀攀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 椀猀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 琀漀 愀渀 漀戀樀攀挀琀 愀渀搀 挀愀渀渀漀琀 戀攀 爀攀ⴀ愀猀猀最椀最渀攀搀 琀漀 愀 搀椀昀昀攀爀攀渀琀 氀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DuplicateFile', N'EN', N'A duplicate file exists.', NULL, N'Duplicate')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 搀愀琀攀 昀椀攀氀搀 渀愀洀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoTextNameId', N'EN', N'No text field name ID was supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'AttrNameNotExist', N'EN', N'The attribute name does not exist', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀猀䄀甀琀栀漀爀椀猀攀爀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 甀猀攀爀 䤀䐀 椀猀 愀猀猀椀最渀攀搀 愀 爀漀氀攀 愀猀 愀渀 愀甀琀栀漀爀椀稀攀爀⸀  䌀栀愀渀最攀猀 琀漀 愀甀琀栀漀爀椀稀攀爀 瀀攀爀洀椀猀猀椀漀渀猀 挀愀渀 漀渀氀礀 戀攀 洀愀搀攀 戀礀 愀 搀愀琀愀戀愀猀攀 愀搀洀椀渀椀猀琀爀愀琀漀爀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'SidIDNotExist', N'EN', N'The user ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀漀爀洀 昀椀攀氀搀 洀愀渀搀愀琀漀爀礀 昀氀愀最 猀甀瀀瀀氀椀攀搀 眀愀猀 椀渀瘀愀氀椀搀⸀  嘀愀氀椀搀 漀瀀琀椀漀渀猀 愀爀攀 ✀✀夀攀猀✀✀Ⰰ ✀✀一漀✀✀ 漀爀 一唀䰀䰀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'RadioBNotExist', N'EN', N'The radio button does not exist', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䔀椀琀栀攀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ComObjAttrNotExist', N'EN', N'The common object attribute ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 渀愀洀攀 昀椀攀氀搀 洀甀猀琀 戀攀 甀渀椀焀甀攀⸀  䄀 搀甀瀀氀椀挀愀琀攀 渀愀洀攀 愀氀爀攀愀搀礀 攀砀椀猀琀猀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoPermission', N'EN', N'User does not have permission for this action.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 昀漀爀洀 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'UnitIDNotExist', N'EN', N'The unit ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䐀漀挀䤀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 椀渀瘀愀氀椀搀 搀甀攀 琀漀 渀漀渀ⴀ瀀爀椀渀琀愀戀氀攀 挀栀愀爀愀挀琀攀爀猀 漀爀 漀琀栀攀爀 爀攀愀猀漀渀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoSID', N'EN', N'The security identifier (SID) of the connected user could not be resolved.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀䜀爀瀀䰀椀渀欀䔀砀椀猀琀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀 戀攀挀愀甀猀攀 愀 搀漀挀甀洀攀渀琀 氀椀渀欀 攀砀椀猀琀猀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ViewPermExists', N'EN', N'The document group cannot be deleted because a view permission exists.', NULL, N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ComObjListNotExist', N'EN', N'The common object list does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoComObjList', N'EN', N'No common object list ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 挀漀洀洀漀渀 漀戀樀攀挀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'InvalidListItem', N'EN', N'The list-item ID pair is invalid.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀攀氀昀䄀甀琀栀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀渀 愀甀琀栀漀爀椀稀攀爀 挀愀渀渀漀琀 猀攀氀昀ⴀ愀甀琀栀漀爀椀稀攀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFileGroupPerm', N'EN', N'The user does not have edit permission for the file group.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀䜀爀漀甀瀀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 昀椀氀攀 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FileGroupIdNotExist', N'EN', N'The file group ID does not exist', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀䔀搀倀攀爀洀一漀琀䘀爀攀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 渀漀琀 瀀攀爀洀椀琀琀攀搀 琀漀 氀椀渀欀 琀栀攀 昀椀氀攀 琀漀 琀栀攀 猀攀氀攀挀琀攀搀 昀椀氀攀 最爀漀甀瀀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFileGrpEdPerm', N'EN', N'The user does not have edit permission for the file group.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀一愀洀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoDocIDAccess', N'EN', N'Either the document does not exist, the user does not have view permission for the document or the user does not have metadata edit permission.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀椀渀搀漀眀猀一愀洀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 圀椀渀搀漀眀猀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'InvalidWindowsName', N'EN', N'The Windows name was invalid', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀䜀爀漀甀瀀一漀琀唀渀椀焀甀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 栀愀猀 愀氀爀攀愀搀礀 戀攀攀渀 愀猀猀椀最渀攀搀 琀漀 愀渀 愀琀琀爀椀戀甀琀攀 椀渀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  䄀 昀椀氀琀攀爀 最爀漀甀瀀 洀愀礀 漀渀氀礀 戀攀 愀猀猀椀最渀攀搀 琀漀 漀渀攀 攀氀攀洀攀渀琀 漀昀 愀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DefFormNotExist', N'EN', N'No form ID was supplied and the default form ID is blank.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀攀昀䘀爀吀攀砀琀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 愀渀搀 琀栀攀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 䤀䐀 椀猀 攀洀瀀琀礀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DefFGroupNotExist', N'EN', N'A filter group ID was not supplied and the default filter group is empty.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀攀昀䐀挀刀䈀䄀琀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 愀渀搀 琀栀攀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 䤀䐀 椀猀 攀洀瀀琀礀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DefaultInvalid', N'EN', N'The default ID supplied was invalid.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䴀匀䰀椀猀琀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoIDs', N'EN', N'Either a document ID or file ID must be supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䔀椀琀栀攀爀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀Ⰰ 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 洀攀琀愀搀愀琀愀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'InvalidConDocGrp', N'EN', N'The controller level document group either does not exist or the user does not have access to it.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䌀漀渀䘀椀氀攀䜀爀瀀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 攀椀琀栀攀爀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 栀愀瘀攀 愀挀挀攀猀猀 琀漀 椀琀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ConDocGpNotExist', N'EN', N'The controller level document group does not exist', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀渀䘀椀氀攀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoXrefTypeID', N'EN', N'No cross-reference type ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀堀爀攀昀吀礀瀀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 琀礀瀀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoDateStyle', N'EN', N'No date style was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀愀琀攀匀琀礀氀攀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 搀愀琀攀 猀琀礀氀攀 眀愀猀 椀渀瘀愀氀椀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFreeTextNameID', N'EN', N'No free text field name ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀漀渀猀琀爀愀椀渀琀 昀愀椀氀甀爀攀 漀挀挀甀爀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'UpdateError', N'EN', N'An error occurred updating the record. ', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 爀攀挀漀爀搀 洀愀琀挀栀椀渀最 琀栀攀 渀攀眀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoIntNameID', N'EN', N'No integer field name ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 爀攀愀氀 昀椀攀氀搀 渀愀洀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FreeTextIDNotExist', N'EN', N'The free text field name ID does not exist.', NULL, N'Not Exist')਀䜀伀 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DateIDNotExist', N'EN', N'The date field name ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 椀渀琀攀最攀爀 昀椀攀氀搀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'RealIDNotExist', N'EN', N'The real value field name ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 搀甀琀礀 昀甀渀挀琀椀漀渀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FunctionIDNotExist', N'EN', N'The duty function ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoConDocGroup', N'EN', N'No controller level document group ID was supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䌀漀渀䘀椀氀攀䜀爀漀甀瀀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoWorkflowRuleID', N'EN', N'No workflow rule ID was supplied. ', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀漀爀欀昀氀漀眀刀甀氀攀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 爀甀氀攀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoWorkflowStepID', N'EN', N'No workflow step ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 猀甀瀀瀀氀椀攀搀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoWorkflModelID', N'EN', N'No workflow model ID was supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀漀爀欀昀氀䴀漀搀攀氀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 䤀䐀 猀甀瀀瀀氀椀攀搀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoWfInstanceStepID', N'EN', N'No workflow instance step ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoWfOutputID', N'EN', N'No workflow output ID was supplied. ', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀伀甀琀瀀甀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 漀甀琀瀀甀琀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoPersonStepLink', N'EN', N'The person is not linked to the workflow step.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀甀渀挀琀椀漀渀匀琀攀瀀䰀椀渀欀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀甀渀挀琀椀漀渀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WfPersOutFRef', N'EN', N'A file is linked to the workflow instance step id and person id.  This must be removed before this record can be changed. ', NULL, N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䘀甀渀挀琀伀甀琀䘀刀攀昀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 愀渀搀 昀甀渀挀琀椀漀渀 椀搀⸀  吀栀椀猀 洀甀猀琀 戀攀 爀攀洀漀瘀攀搀 戀攀昀漀爀攀 琀栀椀猀 爀攀挀漀爀搀 挀愀渀 戀攀 挀栀愀渀最攀搀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ParentNotExist', N'EN', N'The supplied parent node doesn''t exist on the given tree.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䄀挀琀椀漀渀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'IndTagBrTrNotExist', N'EN', N'The personal tag browsing tree either does not exist or is not registered for the connected user. ', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 戀攀挀愀甀猀攀 琀栀攀礀 搀漀 渀漀琀 栀愀瘀攀 愀挀挀攀猀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 爀攀氀愀琀攀搀 搀漀挀甀洀攀渀琀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀䄀甀琀栀攀渀琀椀挀愀琀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WFStepNotAuth', N'EN', N'The user does not have permission for this workflow instance step because they do not have access permission for the associated document.', NULL, N'Authentication')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䘀爀漀洀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 䘀爀漀洀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WfToStepInvalid', N'EN', N'The To workflow step ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀昀氀吀爀愀渀猀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoTagGroupID', N'EN', N'No tag group ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 琀愀最 最爀漀甀瀀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoTagGrpName', N'EN', N'No tag group name was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最吀爀攀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 琀愀最 琀爀攀攀 䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TagTreeNotExist', N'EN', N'The supplied tag tree ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䈀爀吀爀攀攀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TagBrTreeIDNotExist', N'EN', N'The supplied tag browsing tree ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 最椀瘀攀渀 琀愀最⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀 倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'SelectError', N'EN', N'An error occured during the data selection.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'PeopleListIDNotExist', N'EN', N'The people list ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䘀爀漀洀匀琀攀瀀一漀琀匀甀瀀氀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 䘀爀漀洀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'WfToStepNotSupl', N'EN', N'The To workflow step ID was not supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最吀爀攀攀倀攀爀洀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 最椀瘀攀渀 琀愀最 琀爀攀攀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TreeNodeNotExist', N'EN', N'The supplied tag tree node ID does not exist. ', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀一漀搀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 琀爀攀攀 渀漀搀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'IsRootNode', N'EN', N'The root node cannot be deleted. ', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䰀椀渀欀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 最椀瘀攀渀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 挀漀渀琀爀漀氀氀攀爀 甀猀攀 漀渀氀礀⸀  吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'MultiDuplFiles', N'EN', N'More than one duplicate file exists.  The file cannot be linked to the document ID.', NULL, N'Constraint')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀刀攀焀甀攀猀琀䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 爀攀焀甀攀猀琀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'RequestIDNotExist', N'EN', N'The request ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀攀氀昀䌀愀渀挀攀氀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀渀 愀甀琀栀漀爀椀稀攀爀 挀愀渀渀漀琀 挀愀渀挀攀氀 愀 瀀攀渀搀椀渀最 爀攀焀甀攀猀琀 琀漀 爀攀瘀漀欀攀 琀栀攀椀爀 漀眀渀 愀甀琀栀漀爀椀稀攀爀 瀀爀椀瘀椀氀攀最攀猀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NotPending', N'EN', N'The request record does not have a status equal to ''Pending''. ', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀椀搀一漀刀攀焀甀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 甀猀攀爀 䤀䐀 漀爀 爀攀焀甀攀猀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'UserSelfAuth', N'EN', N'A user connot self-authorize.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀瀀瀀爀漀瘀攀爀㄀䌀漀洀瀀氀攀琀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀伀渀攀 漀昀 琀眀漀 愀瀀瀀爀漀瘀愀氀猀 挀漀洀瀀氀攀琀攀 昀漀爀 愀甀琀栀漀爀椀稀攀爀 瀀爀椀瘀椀氀攀最攀 最爀愀渀琀 爀攀焀甀攀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'ApprovalFailed', N'EN', N'The approval request failed.', NULL, N'Transaction')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀甀瀀氀䄀瀀瀀爀漀瘀攀爀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀攀挀漀渀搀 愀瀀瀀爀漀瘀攀爀 洀甀猀琀 渀漀琀 戀攀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 昀椀爀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoSelfRevoke', N'EN', N'Self-revoking of authorizer privileges is not permitted because it can result in the number of authorizers falling below two.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀栀甀洀戀渀愀椀氀吀漀漀䈀椀最✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 琀栀甀洀戀渀愀椀氀 攀砀挀攀攀搀猀 ㄀䴀䈀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'FileRetentionInForce', N'EN', N'File retention is enforced and the file retention date has not yet expired.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀攀愀爀挀栀匀琀爀椀渀最✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 猀攀愀爀挀栀 猀琀爀椀渀最 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoDefDocDate', N'EN', N'No default document date name ID has been set.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀椀搀䤀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 甀猀攀爀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'BrTreeNotOwned', N'EN', N'The browsing tree ID either does not exist or is not owned by the connected user', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䘀漀爀䜀爀漀甀瀀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀 戀甀琀 渀漀 挀漀爀爀攀猀瀀漀渀搀椀渀最 搀漀挀甀洀攀渀琀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'LastDocGrpViewer', N'EN', N'The last document viewing group viewer permission cannot be deleted while documents are linked to the document group.', NULL, N'Constraint')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀刀攀琀攀渀琀椀漀渀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䤀渀瘀愀氀椀搀 爀攀琀攀渀琀椀漀渀 瀀攀爀椀漀搀㨀 ✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoGFNameID', N'EN', N'No general field name ID was supplied', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 䤀䐀 猀甀瀀瀀氀椀攀搀 眀愀猀 椀渀瘀愀氀椀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DocIdIsValid', N'EN', N'The document ID is valid.', NULL, N'Ok')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀䤀渀猀攀爀琀攀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䘀椀氀攀 椀渀猀攀爀琀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'UserDeactivated', N'EN', N'The user is already de-activated.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀䈀漀漀欀攀搀伀甀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 椀猀 愀氀爀攀愀搀礀 戀漀漀欀攀搀 漀甀琀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'InvalidBIRec', N'EN', N'The booked-in record is invalid', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䈀欀最吀椀洀攀䈀漀砀䔀砀瀀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 戀漀漀欀椀渀最 椀渀 琀椀洀攀 氀椀洀椀琀 栀愀猀 攀砀瀀椀爀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䔀砀瀀椀爀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'EdPermCheckPass', N'EN', N'The edit permission check passed.', NULL, N'Ok')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀䈀伀唀猀攀爀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 眀愀猀 渀漀琀 戀漀漀欀攀搀 漀甀琀 戀礀 琀栀椀猀 甀猀攀爀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䄀甀琀栀攀渀琀椀挀愀琀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DocNotBookedOut', N'EN', N'The document is not booked out', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀吀爀愀渀猀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TagDupInTree', N'EN', N'The tag already exists in the given tag tree.', NULL, N'Already Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀漀漀琀一漀搀攀䔀砀椀猀琀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 爀漀漀琀 渀漀搀攀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 昀漀爀 琀栀攀 猀甀瀀瀀氀椀攀搀 琀爀攀攀 䤀䐀⸀  倀愀爀攀渀琀 䤀䐀 洀甀猀琀 渀漀琀 戀攀 一唀䰀䰀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DeleteError', N'EN', N'An error occurred upon deleting the record.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀吀漀漀䰀愀爀最攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀椀氀攀 攀砀挀攀攀搀攀搀 琀栀攀 洀愀砀椀洀甀洀 愀氀氀漀眀愀戀氀攀 猀椀稀攀 漀昀 ㈀䜀䈀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀匀椀稀攀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFilterGroup', N'EN', N'No filter group ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䴀匀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoWFInstanceID', N'EN', N'A workflow instance ID was not supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀䘀䤀渀猀琀愀渀挀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoStepStatusID', N'EN', N'No workflow step status ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀琀攀瀀匀琀愀琀甀猀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 猀琀攀瀀 猀琀愀琀甀猀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'UserIsActive', N'EN', N'The user record is already active', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀甀瀀氀匀攀氀昀伀渀戀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀漀氀氀漀眀椀渀最 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 愀氀爀攀愀搀礀 爀攀最椀猀琀攀爀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DocIDNotExist', N'EN', N'Either the document ID does not exist or the connected user does not have permission to access the document.', NULL, NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'DateInvalid', N'EN', N'The date supplied was invalid.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最一愀洀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 琀愀最 渀愀洀攀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'UserIdNotExist', N'EN', N'The user ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀漀氀攀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 爀漀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'PresentStepInvalid', N'EN', N'The workflow model ID and step ID pair does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀洀伀戀樀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 椀渀 琀栀攀 最椀瘀攀渀 氀椀猀琀攀搀 䤀䐀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
GO਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䤀䐀✀Ⰰ 一✀䔀一✀Ⰰ 一✀一漀 琀愀最 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'TagIDNotExist', N'EN', N'The supplied tag ID does not exist.', NULL, N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀瘀䄀瀀瀀爀㄀䌀漀洀瀀氀攀琀攀✀Ⰰ 一✀䔀一✀Ⰰ 一✀伀渀攀 漀昀 琀眀漀 愀瀀瀀爀漀瘀愀氀猀 挀漀洀瀀氀攀琀攀 昀漀爀 愀甀琀栀漀爀椀稀攀爀 瀀爀椀瘀椀氀攀最攀 爀攀瘀漀欀攀 爀攀焀甀攀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFunctionListID', N'EN', N'No function list ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoPeopleListID', N'EN', N'No people list ID was supplied.', NULL, N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀漀漀䘀攀眀䄀甀琀栀漀爀椀猀攀爀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 渀甀洀戀攀爀 漀爀 愀甀琀栀漀爀椀稀攀爀猀 洀愀礀 渀漀琀 戀攀 爀攀搀甀挀攀搀 戀攀氀漀眀 琀眀漀 戀攀挀愀甀猀攀 琀眀漀 愀甀琀栀漀爀椀稀攀爀猀 愀爀攀 爀攀焀甀椀爀攀搀 琀漀 最爀愀渀琀 瀀爀椀瘀椀氀攀最攀猀 琀漀 愀 渀攀眀 愀甀琀栀漀爀椀稀攀爀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NotLastBkIn', N'EN', N'The booked-in record selected cannot be deleted.  Must be the latest record for the document, must have been booked in by the connected user and must be within the expiry time.', NULL, N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䤀渀猀琀愀渀挀攀䔀砀椀猀琀猀✀Ⰰ 一✀䔀一✀Ⰰ 一✀䄀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 挀漀爀爀攀猀瀀漀渀搀椀渀最 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 攀砀椀猀琀猀⸀  吀栀攀 椀渀猀琀愀渀挀攀 洀甀猀琀 戀攀 搀攀氀攀琀攀搀 戀攀昀漀爀攀 琀栀攀 洀漀搀攀氀 挀愀渀 戀攀 搀攀氀攀琀攀搀⸀ ✀Ⰰ 一唀䰀䰀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoTagGrpPermission', N'EN', N'The use does not have permission for the given tag group.', NULL, N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀氀愀渀最甀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开琀攀砀琀崀Ⰰ 嬀洀攀猀猀愀最攀开氀漀渀最开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀搀攀䤀猀䐀攀猀挀攀渀搀愀渀琀✀Ⰰ 一✀䔀一✀Ⰰ 一✀吀栀攀 渀漀搀攀 挀愀渀渀漀琀 戀攀 洀漀瘀攀搀 琀漀 椀琀猀 漀眀渀 搀攀猀挀攀渀搀愀渀琀⸀✀Ⰰ 一唀䰀䰀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_details] ([message_id], [language_id], [message_text], [message_long_description], [message_category]) VALUES (N'NoFileSupplied', N'EN', N'No file was supplied, or the file was empty.', NULL, N'Invalid')਀䜀伀 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'ApprovalFailed', N'The approval request failed.', N'Transaction')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀瀀瀀爀漀瘀攀爀㄀䌀漀洀瀀氀攀琀攀✀Ⰰ 一✀伀渀攀 漀昀 琀眀漀 愀瀀瀀爀漀瘀愀氀猀 挀漀洀瀀氀攀琀攀 昀漀爀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀 最爀愀渀琀 爀攀焀甀攀猀琀⸀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'AttrExist', N'The attribute class already exists for that object.', N'Already Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'AttrLinked', N'The attribute is already linked to an object', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'AttrListNameNotExist', N'The attribute list name does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'AttrNotExist', N'The attribute ID and attribute list ID pair does not exist. ', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䈀欀最吀椀洀攀䈀漀砀䔀砀瀀✀Ⰰ 一✀吀栀攀 戀漀漀欀椀渀最 椀渀 琀椀洀攀 戀漀砀 栀愀猀 攀砀瀀椀爀攀搀⸀✀Ⰰ 一✀䔀砀瀀椀爀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'BrTreeNotOwned', N'The browsing tree ID either does not exist or is not owned by the connected user', N'NotExist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀洀伀戀樀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀椀砀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'ComObjectNotExist', N'The common object does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀洀伀戀樀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 椀渀 琀栀攀 最椀瘀攀渀 氀椀猀琀攀搀 䤀䐀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'ComObjListNotExist', N'The common object list does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀渀䐀漀挀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'ConFileGpNotExist', N'The controller level file group does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀愀琀攀䘀漀爀洀愀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䐀愀琀攀 昀漀爀洀愀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DateIDNotExist', N'The date field name ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀愀琀攀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 搀愀琀攀 搀愀琀愀 猀甀瀀瀀氀椀攀搀 眀愀猀 椀渀瘀愀氀椀搀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DateStyleInvalid', N'The supplied date style was invalid.', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 搀攀昀愀甀氀琀 䤀䐀 猀甀瀀瀀氀椀攀搀 眀愀猀 椀渀瘀愀氀椀搀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DefDcRBAtrIdNotExist', N'A document radio button attribute ID has not been supplied and a default does not exist. ', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䄀 昀椀氀琀攀爀 最爀漀甀瀀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 愀渀搀 琀栀攀 搀攀昀愀甀氀琀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 攀洀瀀琀礀⸀ ✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DefFormNotExist', N'No form ID was supplied and the default form ID is blank', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀攀昀䘀爀吀攀砀琀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 搀攀昀愀甀氀琀 昀爀攀攀 琀攀砀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 攀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DeleteError', N'Error occurred upon delete', N'Transaction Error')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀䈀漀漀欀攀搀伀甀琀✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 椀猀 愀氀爀攀愀搀礀 戀漀漀欀攀搀 漀甀琀✀Ⰰ 一✀䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DocGroupIdNotExist', N'The document group ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀䜀爀瀀䰀椀渀欀䔀砀椀猀琀猀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀 戀攀挀愀甀猀攀 愀 搀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 最爀漀甀瀀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DocIdIsValid', N'The document ID is valid', N'OK')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀䤀䐀䰀漀挀欀攀搀✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 椀搀 椀猀 氀漀挀欀攀搀 愀最愀椀渀猀琀 挀栀愀渀最攀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DocIDNotExist', N'The document ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀漀挀一漀琀䈀漀漀欀攀搀伀甀琀✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 椀猀 渀漀琀 戀漀漀欀攀搀 漀甀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DocNotUnique', N'Document id is not unique.', NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀甀瀀氀䄀瀀瀀爀漀瘀攀爀✀Ⰰ 一✀吀栀攀 猀攀挀漀渀搀 愀瀀瀀爀漀瘀攀爀 挀愀渀渀漀琀 戀攀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 昀椀爀猀琀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'DuplicateFile', N'A duplicate file exists', NULL)਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䐀甀瀀氀匀攀氀昀伀渀戀✀Ⰰ 一✀吀栀攀 甀猀攀爀 椀猀 愀氀爀攀愀搀礀 爀攀最椀猀琀攀爀攀搀✀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'EdPermCheckPass', N'The edit permission check passed.', N'Ok')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FGNotExist', N'Filter group doesn''t exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀䜀爀漀甀瀀一漀琀唀渀椀焀甀攀✀Ⰰ 一✀䘀椀氀琀攀爀 最爀漀甀瀀 䤀䐀 栀愀猀 愀氀爀攀愀搀礀 戀攀攀渀 甀猀攀搀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀氀椀猀琀⸀ ✀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FileEdPermNotFree', N'The connected user is not permitted to link the file to the selected file group.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 昀椀氀攀 最爀漀甀瀀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FileIDNotExist', N'The file ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀䤀渀猀攀爀琀攀搀✀Ⰰ 一✀䘀椀氀攀 猀甀挀挀攀猀猀昀甀氀氀礀 椀渀猀攀爀琀攀搀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FilenameTooLong', N'The filename exceeded 255 characters', N'Size')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀椀氀攀刀攀琀攀渀琀椀漀渀䤀渀䘀漀爀挀攀✀Ⰰ 一✀䘀椀氀攀 爀攀琀攀渀琀椀漀渀 椀猀 攀渀昀漀爀挀攀搀 愀渀搀 琀栀攀 昀椀氀攀 爀攀琀攀渀琀椀漀渀 搀愀琀攀 栀愀猀 渀漀琀 礀攀琀 攀砀瀀椀爀攀搀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FileTooLarge', N'The file is too large', N'Size')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀洀䜀一漀琀䔀砀椀猀琀✀Ⰰ 一✀䘀漀爀洀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FormGroupNotOwned', N'Form group is not owned by the user.', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 昀漀爀洀 渀愀洀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FreeTextIDNotExist', N'The free text field name ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ 一✀䘀漀爀洀 昀椀攀氀搀 洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'FunctionIDNotExist', N'The duty function ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀 眀愀猀 椀渀瘀愀氀椀搀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'GFNameIDInvalid', N'The general field name ID supplied was invalid', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀搀吀愀最䈀爀吀爀一漀琀䔀砀椀猀琀✀Ⰰ 一✀一漀 瀀攀爀猀漀渀愀氀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀猀 爀攀最椀猀琀攀爀攀搀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ ✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'InsertError', N'Error occured upon insert', N'Transaction Error')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 椀渀琀攀最攀爀 昀椀攀氀搀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'InvalidBIRec', N'Invalid booked in record.', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䌀漀渀䐀漀挀䜀爀瀀✀Ⰰ 一✀吀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀椀琀栀攀爀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 愀挀挀攀猀猀 琀漀 椀琀⸀ ✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'InvalidConFileGrp', N'The controller level file group either does not exist or the user does not have access to it. ', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䐀漀挀䤀搀✀Ⰰ 一✀吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 挀漀渀琀愀椀渀猀 渀漀渀ⴀ瀀爀椀渀琀愀戀氀攀 挀栀愀爀愀挀琀攀爀猀 漀爀 椀猀 漀琀栀攀爀眀椀猀攀 椀渀瘀愀氀椀搀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'InvalidFilename', N'Filename is not a valid Windows filename', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ 一✀吀栀攀 氀椀猀琀ⴀ椀琀攀洀 瀀愀椀爀 椀猀 椀渀瘀愀氀椀搀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'InvalidRetention', N'Invalid retention period.', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀渀瘀愀氀椀搀圀椀渀搀漀眀猀一愀洀攀✀Ⰰ 一✀吀栀攀 圀椀渀搀漀眀猀 渀愀洀攀 眀愀猀 椀渀瘀愀氀椀搀✀Ⰰ 一✀一漀琀 瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'IsAuthoriser', N'The sid is an authoriser and can only be deleted by a database administrator', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䤀猀刀漀漀琀一漀搀攀✀Ⰰ 一✀吀栀攀 爀漀漀琀 渀漀搀攀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀⸀ ✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'LastDocGrpViewer', N'The last document group viewing group owner cannot be deleted while documents are linked to the document group.', N'Constraint')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䴀愀砀䐀漀挀吀爀椀攀猀✀Ⰰ 一✀䴀愀砀椀洀甀洀 琀爀椀攀猀 爀攀愀挀栀攀搀 昀漀爀 昀椀渀搀椀渀最 甀渀椀焀甀攀 爀愀渀搀漀洀 搀漀挀甀洀攀渀琀 椀搀⸀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'MSListNotExist', N'The multi-select list does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䴀甀氀琀椀䐀甀瀀氀䘀椀氀攀猀✀Ⰰ 一✀䴀漀爀攀 琀栀愀渀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀 攀砀椀猀琀猀⸀ ✀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NameNotUnique', N'The name field must be unique', N'Not Unique')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䄀琀琀爀䤀䐀✀Ⰰ 一✀一漀 愀琀琀爀椀戀甀琀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoAttrListID', N'No attribute list name ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䄀琀琀爀一愀洀攀✀Ⰰ 一✀一漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoComObject', N'No common object id was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ 一✀一漀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoConDocGroup', N'No controller level document group ID was supplied. ', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䌀漀渀䘀椀氀攀䜀爀漀甀瀀✀Ⰰ 一✀一漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoData', N'No data was supplied.  Record not saved.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ 一✀一漀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoDateStyle', N'A date style was not supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀攀昀䐀漀挀䐀愀琀攀✀Ⰰ 一✀一漀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 搀愀琀攀 䤀䐀 栀愀猀 戀攀攀渀 猀攀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NodeIsDescendant', N'Cannot move a node to its own descendant.', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䘀漀爀䜀爀漀甀瀀✀Ⰰ 一✀䤀昀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 愀 搀漀挀甀洀攀渀琀 䤀䐀 洀甀猀琀 愀氀猀漀 戀攀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoDocGroupId', N'No document group id was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀䔀椀琀栀攀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 漀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 搀漀攀 猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoDocID', N'No document ID supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䐀漀挀䤀䐀䄀挀挀攀猀猀✀Ⰰ 一✀䔀椀琀栀攀爀 琀栀攀 搀漀挀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀Ⰰ 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 漀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFileGroupID', N'No file group ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀䜀爀漀甀瀀倀攀爀洀✀Ⰰ 一✀吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFileGrpEdPerm', N'The connected user does not have edit permission for the file group.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀䤀䐀✀Ⰰ 一✀一漀 昀椀氀攀 䤀䐀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFileIDAccess', N'Either the file ID does not exist, the user does not have view permission or does not have edit permission.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀椀氀攀匀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀 昀椀氀攀 眀愀猀 猀甀瀀瀀氀椀攀搀Ⰰ 漀爀 琀栀攀 昀椀氀攀 眀愀猀 攀洀瀀琀礀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFilterGroup', N'No filter group was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀✀Ⰰ 一✀一漀 昀漀爀洀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
GO਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀漀爀洀䤀䐀✀Ⰰ 一✀一漀 昀漀爀洀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFormPermission', N'Use does not have permission to modify the form', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀爀攀攀吀攀砀琀一愀洀攀䤀䐀✀Ⰰ 一✀一漀 昀爀攀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFunctionID', N'No duty function ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ 一✀䄀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoFunctionStepLink', N'The function is not linked to the workflow step.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ 一✀一漀 最攀渀攀爀愀氀礀 昀椀攀氀搀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoIDs', N'Either a doc ID or a file ID must be supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ 一✀一漀 椀渀琀攀最攀爀 昀椀攀氀搀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoLinkPermission', N'The connected user does not have permission to link the given attribute.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀䴀愀琀挀栀✀Ⰰ 一✀一漀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀猀 攀砀椀猀琀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoMSListID', N'No multi-select list ID was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀一愀洀攀✀Ⰰ 一✀一漀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoNameID', N'No name id supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀一漀搀攀✀Ⰰ 一✀一漀 琀爀攀攀 渀漀搀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoPeopleListID', N'No people list ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀唀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoPersonStepLink', N'The person is not linked to the workflow step.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ 一✀一漀 爀攀愀氀 瘀愀氀甀攀 昀椀攀氀搀 渀愀洀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoRecordID', N'No record id was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀刀攀焀甀攀猀琀䤀䐀✀Ⰰ 一✀䄀 爀攀焀甀攀猀琀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoSearchString', N'No search string was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀攀氀昀䌀愀渀挀攀氀✀Ⰰ 一✀䄀渀 愀甀琀栀漀爀椀猀攀爀 挀愀渀渀漀琀 猀攀氀昀ⴀ挀愀渀挀攀氀 愀 爀攀瘀漀欀攀 爀攀焀甀攀猀琀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoSelfRevoke', N'Self-revoking is not permitted', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀䤀䐀✀Ⰰ 一✀一漀 匀䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoSidId', N'No SID ID was supplied.', N'Not supplied.')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀匀椀搀一漀刀攀焀甀✀Ⰰ 一✀一漀 甀猀攀爀 匀䤀䐀 漀爀 爀攀焀甀攀猀琀 䤀䐀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoStepStatusID', N'No workflow step status ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䈀爀吀爀攀攀䤀䐀✀Ⰰ 一✀䄀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 猀甀瀀瀀氀椀攀搀⸀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagGroupID', N'No tag group ID was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䜀爀瀀一愀洀攀✀Ⰰ 一✀一漀 琀愀最 最爀漀甀瀀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagGrpPermission', N'The use does not have permission for the given tag group.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最䤀䐀✀Ⰰ 一✀一漀 琀愀最 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagName', N'A tag name was not supplied', N'Not Supplied.')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ 一✀吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 最椀瘀攀渀 琀愀最⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTagTree', N'A tag tree ID has not been supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀愀最吀爀攀攀倀攀爀洀✀Ⰰ 一✀吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 最椀瘀攀渀 琀愀最 琀爀攀攀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NotBOUser', N'The document was not booked out by this user and the user is not a controller', N'Authentication')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀䔀砀椀猀琀✀Ⰰ 一✀刀攀挀漀爀搀 搀漀攀猀渀✀✀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoTextNameId', N'No text name field was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀吀䜀爀漀甀瀀✀Ⰰ 一✀一漀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NotINT', N'Incorrect type.  Integer expected.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀䰀愀猀琀䈀欀䤀渀✀Ⰰ 一✀一漀琀 琀栀攀 氀愀琀攀猀琀 戀漀漀欀攀搀 椀渀 爀攀挀漀爀搀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NotPending', N'Request does not have status = Pending', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀琀唀渀椀焀甀攀✀Ⰰ 一✀䐀愀琀愀 椀猀 渀漀琀 甀渀椀焀甀攀✀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoUserSidID', N'No user SID ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀䘀䤀渀猀琀愀渀挀攀䤀䐀✀Ⰰ 一✀䄀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoWfInstanceStepID', N'No workflow instance step ID was supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀昀氀吀爀愀渀猀䤀䐀✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoWfOutputID', N'No workflow output ID was supplied. ', N'Not Supplied.')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀椀渀搀漀眀猀一愀洀攀✀Ⰰ 一✀䄀 圀椀渀搀漀眀猀 渀愀洀攀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoWorkflModelID', N'No workflow model ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀圀漀爀欀昀氀漀眀刀甀氀攀䤀䐀✀Ⰰ 一✀一漀 眀漀爀欀昀氀漀眀 爀甀氀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'NoWorkflowStepID', N'No workflow step ID was supplied', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀一漀堀爀攀昀吀礀瀀攀䤀䐀✀Ⰰ 一✀一漀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 琀礀瀀攀 䤀䐀 眀愀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'ParentNotExist', N'The supplied parent node step doesn''t exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'PresentStepInvalid', N'The workflow model and step ID pair does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀愀搀椀漀䈀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RBListNotExist', N'The radio button list does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 爀攀愀氀 昀椀攀氀搀 渀愀洀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RecordExists', N'A matching record already exists', N'Already Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀漀渀猀琀爀愀椀渀琀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RequestIDNotExist', N'The request ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀瘀䄀瀀瀀爀㄀䌀漀洀瀀氀攀琀攀✀Ⰰ 一✀伀渀攀 漀昀 琀眀漀 愀瀀瀀爀漀瘀愀氀猀 挀漀洀瀀氀攀琀攀 昀漀爀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀 爀攀瘀漀欀攀 爀攀焀甀攀猀琀⸀✀Ⰰ 一✀吀爀愀渀猀愀挀琀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'RoleNotExist', N'The role does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀漀漀琀一漀搀攀䔀砀椀猀琀猀✀Ⰰ 一✀䄀 爀漀漀琀 渀漀搀攀 愀氀爀攀愀搀礀 攀砀椀猀琀猀⸀✀Ⰰ 一✀䄀氀爀攀愀搀礀 䔀砀椀猀琀猀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'SelectError', N'Error occured on select', N'Transaction Error')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀攀氀昀䄀甀琀栀✀Ⰰ 一✀䄀甀琀栀漀爀椀猀攀爀 挀愀渀渀漀琀 猀攀氀昀ⴀ愀甀琀栀漀爀椀猀攀 搀漀挀甀洀攀渀琀 瘀椀攀眀攀爀 最爀漀甀瀀⸀✀Ⰰ 一✀倀攀爀洀椀猀猀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'SidIDNotExist', N'The SID ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀匀琀攀瀀匀琀愀琀甀猀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 猀琀攀瀀 猀琀愀琀甀猀 䤀䐀 眀愀猀 椀渀愀瘀氀椀搀⸀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'Success', N'Transaction successful', N'Transaction')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TagDupInTree', N'The tag already exists in the given tag tree.', N'Already Exists')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 琀愀最 最爀漀甀瀀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TagIDNotExist', N'The supplied tag ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 琀愀最 琀爀攀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TextIDNotExist', N'The free text field name ID does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀䜀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'ThumbnailTooBig', N'The thumbnail exceeds 1MB', N'Invalid')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀漀漀䘀攀眀䄀甀琀栀漀爀椀猀攀爀猀✀Ⰰ 一✀吀栀攀 渀甀洀戀攀爀 漀爀 愀甀琀栀漀爀椀猀攀爀猀 洀愀礀 渀漀琀 戀攀 爀攀搀甀挀攀搀 戀攀氀漀眀 琀眀漀 戀攀挀愀甀猀攀 琀眀漀 愀甀琀栀漀爀椀猀攀爀猀 愀爀攀 爀攀焀甀椀爀攀搀 琀漀 最爀愀渀琀 瀀爀椀瘀椀氀攀最攀猀 琀漀 愀 渀攀眀 愀甀琀栀漀爀椀猀攀爀⸀✀Ⰰ 一✀䌀漀渀猀琀爀愀椀渀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TooLong10', N'String too long.  Max 10 chars', N'Size')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀漀漀䰀漀渀最㔀　✀Ⰰ 一✀匀琀爀椀渀最 琀漀漀 氀漀渀最⸀  䴀愀砀 㔀　 挀栀愀爀猀✀Ⰰ 一✀匀椀稀攀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'TooLongMax', N'Longer than permitted by nvarchar(max)', N'Size')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 琀愀最 琀爀攀攀 渀漀搀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ ✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'UnitIDNotExist', N'The unit id does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀渀猀瀀攀挀椀昀椀攀搀✀Ⰰ 一✀唀渀猀瀀攀挀椀昀椀攀搀 攀爀爀漀爀✀Ⰰ 一唀䰀䰀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'UpdateError', N'Error updating a record', N'Transaction Error')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀猀攀爀䐀攀愀挀琀椀瘀愀琀攀搀✀Ⰰ 一✀吀栀攀 甀猀攀爀 椀猀 愀氀爀攀愀搀礀 搀攀愀挀琀椀瘀愀琀攀搀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'UserIdNotExist', N'The user id does not exist', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀唀猀攀爀䤀猀䄀挀琀椀瘀攀✀Ⰰ 一✀吀栀攀 甀猀攀爀 爀攀挀漀爀搀 椀猀 愀氀爀攀愀搀礀 愀挀琀椀瘀攀✀Ⰰ 一✀䤀渀瘀愀氀椀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'UserSelfAuth', N'A user cannot self-authorise.', N'Permission')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀嘀椀攀眀倀攀爀洀䔀砀椀猀琀猀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀 戀攀挀愀甀猀攀 愀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 攀渀琀爀礀 攀砀椀猀琀猀✀Ⰰ 一✀刀攀昀攀爀攀渀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfActionIdNotExist', N'The supplied workflow action ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䘀爀漀洀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 䘀爀漀洀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfFromStepNotSupl', N'The From workflow step ID was not supplied.', N'Not Supplied')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀䘀甀渀挀琀伀甀琀䘀刀攀昀✀Ⰰ 一✀䄀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 愀渀搀 昀甀渀挀琀椀漀渀 椀搀⸀  吀栀椀猀 洀甀猀琀 戀攀 爀攀洀漀瘀攀搀 戀攀昀漀爀攀 琀栀椀猀 爀攀挀漀爀搀 挀愀渀 戀攀 挀栀愀渀最攀搀⸀ ✀Ⰰ 一✀刀攀昀攀爀攀渀挀琀椀愀氀 䤀渀琀攀最爀椀琀礀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfInstanceExists', N'A workflow instance corresponding to the workflow model exists.', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀䘀䤀渀猀琀愀渀挀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WFInstanceNotAuth', N'The user does not have permission for this workflow instance because they do not have access permission for the related document. ', N'Authentication')਀䜀伀 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfInstStepIdInvalid', N'The supplied workflow instance step ID doesn''t exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀伀甀琀瀀甀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀欀昀氀漀眀 漀甀琀瀀甀琀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfPersOutFRef', N'A file is linked to the workflow instance step id and person id.  This must be removed before this record can be changed. ', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ 一✀吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 戀攀挀愀甀猀攀 琀栀攀礀 搀漀 渀漀琀 栀愀瘀攀 愀挀挀攀猀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀漀挀甀洀攀渀琀⸀✀Ⰰ 一✀䄀甀琀栀攀渀琀椀挀愀琀椀漀渀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfToStepInvalid', N'The To workflow step ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀昀吀漀匀琀攀瀀一漀琀匀甀瀀氀✀Ⰰ 一✀吀栀攀 吀漀 眀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀✀Ⰰ 一✀一漀琀 匀甀瀀瀀氀椀攀搀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WfTransIDInvalid', N'The supplied workflow transition ID does not exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀漀爀欀昀氀䴀漀搀攀氀䤀渀瘀愀氀椀搀✀Ⰰ 一✀吀栀攀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 䤀䐀 猀甀瀀瀀氀椀攀搀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'WorkflowRuleInvalid', N'The supplied workflow rule ID doesn''t exist.', N'Not Exist')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ 一✀琀栀攀 猀甀瀀瀀氀椀攀搀 眀漀爀昀氀漀眀 猀琀攀瀀 䤀䐀 搀漀攀猀渀✀✀琀 攀砀椀猀琀⸀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'XRefExists', N'A reference exists exists in another table', N'Referential Integrity')਀䤀一匀䔀刀吀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开椀搀开氀椀猀琀崀 ⠀嬀洀攀猀猀愀最攀开椀搀崀Ⰰ 嬀洀攀猀猀愀最攀开搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀洀攀猀猀愀最攀开挀愀琀攀最漀爀礀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀堀爀攀昀吀礀瀀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ 一✀吀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 琀礀瀀攀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀✀Ⰰ 一✀一漀琀 䔀砀椀猀琀✀⤀ 
INSERT [messaging].[message_id_list] ([message_id], [message_description], [message_category]) VALUES (N'ZeroRecords', N'Zero records retrieved.', N'Transaction')਀䜀伀 
SET IDENTITY_INSERT [people].[general_field_names] ON ਀ 
INSERT [people].[general_field_names] ([general_field_name_id], [mnem], [name], [description], [list_position]) VALUES (2, N'Owner', N'Document Owner', N'The document owner', 1)਀䤀一匀䔀刀吀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀Ⰰ 一✀刀攀瘀椀攀眀攀爀猀✀Ⰰ 一✀䐀漀挀甀洀攀渀琀 刀攀瘀椀攀眀攀爀猀✀Ⰰ 一✀吀栀攀 搀攀昀愀甀氀琀 氀椀猀琀 漀昀 搀漀挀甀洀攀渀琀 爀攀瘀椀攀眀攀爀猀✀Ⰰ ㈀⤀ 
INSERT [people].[general_field_names] ([general_field_name_id], [mnem], [name], [description], [list_position]) VALUES (4, N'Approvers', N'Document Approvers', N'The list document document approvers', 3)਀䤀一匀䔀刀吀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀㠀Ⰰ 一✀刀攀瘀搀 䈀礀✀Ⰰ 一✀刀攀瘀椀攀眀攀搀 䈀礀✀Ⰰ 一✀吀栀攀 氀椀猀琀 漀昀 眀栀漀 爀攀瘀椀攀眀攀搀 愀 搀爀愀昀琀✀Ⰰ 㔀⤀ 
INSERT [people].[general_field_names] ([general_field_name_id], [mnem], [name], [description], [list_position]) VALUES (19, N'Apprvd By', N'Approved By', N'The list of who approved a release', 6)਀䤀一匀䔀刀吀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀椀瀀琀椀漀渀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀㄀Ⰰ 一✀倀爀攀瀀搀 䈀礀✀Ⰰ 一✀倀爀攀瀀愀爀攀搀 䈀礀✀Ⰰ 一✀吀栀攀 氀椀猀琀 漀昀 眀栀漀 瀀爀攀瀀愀爀攀搀 愀 爀攀氀攀愀猀攀✀Ⰰ 㐀⤀ 
SET IDENTITY_INSERT [people].[general_field_names] OFF਀䜀伀 
SET IDENTITY_INSERT [tagging].[doc_tags] ON ਀ 
INSERT [tagging].[doc_tags] ([tag_id], [mnem], [tag_name], [descr]) VALUES (1, N'TTR', N'Tag Tree Root', N'A dummy tag used as the root node for tag trees.')਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀Ⰰ 嬀猀椀搀开椀搀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀䐀吀䈀吀✀Ⰰ 一✀䐀攀昀愀甀氀琀 吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀✀Ⰰ 一✀吀栀椀猀 椀猀 琀栀攀 戀爀漀眀猀椀渀最 琀爀攀攀 琀栀愀琀 眀椀氀氀 戀攀 甀猀攀搀 戀礀 琀栀攀 搀愀琀愀戀愀猀攀 椀昀 渀漀 戀爀漀眀猀椀渀最 琀爀攀攀 䤀䐀 椀猀 猀甀瀀瀀氀椀攀搀✀Ⰰ ㄀Ⰰ 一唀䰀䰀⤀ 
SET IDENTITY_INSERT [tagging].[tag_browsing_tree_names] OFF਀䜀伀 
SET IDENTITY_INSERT [tagging].[tag_browsing_tree_nodes] ON ਀ 
INSERT [tagging].[tag_browsing_tree_nodes] ([browsing_tree_node_id], [tag_browsing_tree_id], [tag_id], [browsing_tree_hierarchyid], [invert_tag]) VALUES (24, 1, 1, N'/', NULL)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开琀爀攀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㈀Ⰰ 一✀䐀吀刀吀✀Ⰰ 一✀䐀攀昀愀甀氀琀 吀愀最 刀攀氀愀琀椀漀渀猀栀椀瀀 吀爀攀攀✀Ⰰ 一✀䐀攀昀椀渀攀猀 栀椀攀爀愀爀挀栀椀挀愀氀 爀攀氀愀琀椀漀渀猀栀椀瀀猀 戀攀琀眀攀攀渀 琀愀最猀⸀✀Ⰰ ㄀⤀ 
SET IDENTITY_INSERT [tagging].[tag_tree_names] OFF਀䜀伀 
SET IDENTITY_INSERT [tagging].[tag_tree_nodes] ON ਀ 
INSERT [tagging].[tag_tree_nodes] ([tag_tree_node_id], [tag_tree_id], [tag_id], [tag_tree_hierarchyid]) VALUES (48, 2, 1, N'/')਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀 伀䘀䘀 
GO਀䤀一匀䔀刀吀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀爀漀氀攀开氀椀猀琀崀 ⠀嬀爀漀氀攀开渀愀洀攀崀Ⰰ 嬀爀漀氀攀开搀攀猀挀爀椀瀀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 一✀䌀爀攀愀琀攀猀 洀攀琀愀搀愀琀愀 氀椀猀琀猀⸀✀⤀ 
INSERT [user_restr].[role_list] ([role_name], [role_description]) VALUES (N'Controller', N'Assigns metadata.')਀䤀一匀䔀刀吀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀爀漀氀攀开氀椀猀琀崀 ⠀嬀爀漀氀攀开渀愀洀攀崀Ⰰ 嬀爀漀氀攀开搀攀猀挀爀椀瀀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀䔀搀椀琀漀爀✀Ⰰ 一✀䄀搀搀猀 昀椀氀攀猀Ⰰ 琀愀最猀 昀椀氀攀猀⸀✀⤀ 
INSERT [user_restr].[role_list] ([role_name], [role_description]) VALUES (N'Reader', N'Reads data.  Can create their own personal tag browsing tree.')਀䤀一匀䔀刀吀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀爀漀氀攀开氀椀猀琀崀 ⠀嬀爀漀氀攀开渀愀洀攀崀Ⰰ 嬀爀漀氀攀开搀攀猀挀爀椀瀀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀一✀刀攀瘀椀攀眀攀爀✀Ⰰ 一✀刀攀瘀椀攀眀猀 搀漀挀甀洀攀渀琀猀 昀漀爀 愀渀 攀搀椀琀漀爀⸀✀⤀ 
GO਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 伀一  
਀䤀一匀䔀刀吀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 ⠀嬀砀爀攀昀开琀礀瀀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㄀Ⰰ 一✀匀唀倀✀Ⰰ 一✀匀甀瀀攀爀猀攀搀攀搀✀Ⰰ 一✀吀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 搀漀挀 䤀䐀 椀猀 猀甀瀀攀爀猀攀搀攀搀 戀礀 琀栀攀 猀漀甀爀挀攀 搀漀挀 䤀䐀✀Ⰰ ㌀⤀ 
INSERT [xref].[cross_reference_types] ([xref_type_id], [mnem], [attr_name], [descr], [list_position]) VALUES (2, N'REF', N'Referenced', N'The cross-referenced doc ID is cross-referenced by the source doc ID', 2)਀䤀一匀䔀刀吀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 ⠀嬀砀爀攀昀开琀礀瀀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㌀Ⰰ 一✀倀䄀刀吀✀Ⰰ 一✀匀甀戀猀攀琀 倀愀爀琀✀Ⰰ 一✀吀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 搀漀挀 䤀䐀 椀猀 愀 猀甀戀猀攀琀 瀀愀爀琀 漀昀 琀栀攀 猀漀甀爀挀攀 搀漀挀 䤀䐀✀Ⰰ ㌀⤀ 
INSERT [xref].[cross_reference_types] ([xref_type_id], [mnem], [attr_name], [descr], [list_position]) VALUES (4, N'ATT', N'Attachment', N'The cross-referenced doc ID is an attachment to the source doc ID', 4)਀䤀一匀䔀刀吀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 ⠀嬀砀爀攀昀开琀礀瀀攀开椀搀崀Ⰰ 嬀洀渀攀洀崀Ⰰ 嬀愀琀琀爀开渀愀洀攀崀Ⰰ 嬀搀攀猀挀爀崀Ⰰ 嬀氀椀猀琀开瀀漀猀椀琀椀漀渀崀⤀ 嘀䄀䰀唀䔀匀 ⠀㔀Ⰰ 一✀匀䔀吀✀Ⰰ 一✀匀攀琀✀Ⰰ 一✀吀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 搀漀挀 䤀䐀 椀猀 瀀愀爀琀 漀昀 愀 猀攀琀 眀椀琀栀 琀栀攀 猀漀甀爀挀攀 搀漀挀 䤀䐀✀Ⰰ 㔀⤀ 
INSERT [xref].[cross_reference_types] ([xref_type_id], [mnem], [attr_name], [descr], [list_position]) VALUES (6, N'SUB', N'Sub Document', N'The cross-referenced doc ID is a sub-document to the source doc ID', 6)਀匀䔀吀 䤀䐀䔀一吀䤀吀夀开䤀一匀䔀刀吀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 伀䘀䘀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开最氀漀戀愀氀开猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [base].[global_settings_groups] ADD  CONSTRAINT [UN_global_setting_group_name] UNIQUE NONCLUSTERED ਀⠀ 
	[setting_group_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开甀渀椀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [UN_units] ON [base].[units_of_measure]਀⠀ 
	[unit] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开挀漀洀开漀戀樀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [com_obj].[common_object_attributes] ADD  CONSTRAINT [UN_com_obj_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀猀开挀漀洀开漀戀樀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [com_obj].[common_object_list_names] ADD  CONSTRAINT [UN_docs_com_obj_list_name] UNIQUE NONCLUSTERED ਀⠀ 
	[list_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开挀漀洀开漀戀樀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [com_obj].[common_objects] ADD  CONSTRAINT [UN_com_obj_name] UNIQUE NONCLUSTERED ਀⠀ 
	[object_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀开搀愀琀攀开渀愀洀攀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_date_field_names] ADD  CONSTRAINT [UN_doc_date_name_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_free_text_field_names] ADD  CONSTRAINT [UN_doc_free_text_name_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀开椀渀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_integer_field_names] ADD  CONSTRAINT [UN_doc_int_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀开猀洀开愀琀琀爀开愀渀搀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_multi_select_attributes] ADD  CONSTRAINT [UN_d_sm_attr_and_list_combined_key] UNIQUE NONCLUSTERED ਀⠀ 
	[doc_ms_attr_id] ASC,਀ऀ嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_doc_sm_attr_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开搀漀挀开猀洀开愀琀琀爀开渀愀洀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀愀琀琀爀开渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_doc_select_many_list_attr_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开搀漀挀开猀攀氀攀挀琀开洀愀渀礀开氀椀猀琀开愀琀琀爀开渀愀洀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀愀琀琀爀开渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
/****** Object:  Index [UN_d_rb_attr_and_list_combined_key]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开搀开爀戀开愀琀琀爀开愀渀搀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[doc_radiob_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_radio_button_attributes] ADD  CONSTRAINT [UN_doc_radiob_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_radio_button_list_names] ADD  CONSTRAINT [UN_doc_radiob_attr_list_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开搀漀挀开爀攀愀氀开渀愀洀攀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [doc_attr].[doc_real_number_field_names] ADD  CONSTRAINT [UN_doc_real_name_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开搀愀琀攀开渀愀洀攀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_date_field_names] ADD  CONSTRAINT [UN_file_date_name_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_free_text_field_names] ADD  CONSTRAINT [UN_file_free_text_field_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开椀渀琀开渀愀洀攀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_integer_field_names] ADD  CONSTRAINT [UN_file_int_name_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开猀洀开愀琀琀爀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_multi_select_attributes] ADD  CONSTRAINT [UN_file_sm_attr_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开猀洀开愀琀琀爀开愀渀搀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [UN_file_sm_attr_and_list_combined_key] ON [file_attr].[file_multi_select_attributes]਀⠀ 
	[file_ms_attr_id] ASC,਀ऀ嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_file_sm_list_attr_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开昀椀氀攀开猀洀开氀椀猀琀开愀琀琀爀开渀愀洀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀愀琀琀爀开渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
/****** Object:  Index [UN_f_rb_attr_and_attr_list_combined_key]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开昀开爀戀开愀琀琀爀开愀渀搀开愀琀琀爀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 䄀匀䌀Ⰰ 
	[file_radiob_list_id] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_radio_button_attributes] ADD  CONSTRAINT [UN_file_radiob_attr_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_radio_button_list_names] ADD  CONSTRAINT [UN_file_radiob_list_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开爀攀愀氀开渀愀洀攀开愀琀琀爀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [file_attr].[file_real_number_field_names] ADD  CONSTRAINT [UN_file_real_name_attr_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀琀攀爀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [UN_filter_group_name] ON [forms].[filter_groups]਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀漀爀洀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [forms].[form_group_names] ADD  CONSTRAINT [UN_form_group_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀漀爀洀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [forms].[form_identifier_names] ADD  CONSTRAINT [UN_form_name] UNIQUE NONCLUSTERED ਀⠀ 
	[form_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开氀愀渀最甀愀最攀开洀攀猀猀愀最攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [UN_language_message] ON [messaging].[message_details]਀⠀ 
	[message_id] ASC,਀ऀ嬀氀愀渀最甀愀最攀开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_function_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开昀甀渀挀琀椀漀渀开渀愀洀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_function_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开昀甀渀挀琀椀漀渀开昀椀攀氀搀开渀愀洀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_general_field_name_must_be_unique]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䌀刀䔀䄀吀䔀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀 䤀一䐀䔀堀 嬀唀一开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开洀甀猀琀开戀攀开甀渀椀焀甀攀崀 伀一 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
(਀ऀ嬀渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_people_list_name_must_be_unique]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀开洀甀猀琀开戀攀开甀渀椀焀甀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_tag_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开琀愀最开渀愀洀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_browsing_tree_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
/****** Object:  Index [UN_browsing_tree_hierarchyid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀 䄀匀䌀Ⰰ 
	[browsing_tree_hierarchyid] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开琀愀最开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [tagging].[tag_group_identifier_names] ADD  CONSTRAINT [UN_tag_group_name] UNIQUE NONCLUSTERED ਀⠀ 
	[tag_group_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开琀愀最开椀搀开搀漀挀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [tagging].[tag_to_document_links] ADD  CONSTRAINT [UN_tag_id_doc_id] UNIQUE NONCLUSTERED ਀⠀ 
	[doc_id] ASC,਀ऀ嬀琀愀最开椀搀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
SET ANSI_PADDING ON਀䜀伀 
/****** Object:  Index [UN_tag_tree_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开琀愀最开琀爀攀攀开渀愀洀攀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀渀愀洀攀崀 䄀匀䌀 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]਀䜀伀 
/****** Object:  Index [UN_tag_tree_hierarchyid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀唀一开琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀崀 唀一䤀儀唀䔀 一伀一䌀䰀唀匀吀䔀刀䔀䐀  
(਀ऀ嬀琀愀最开琀爀攀攀开椀搀崀 䄀匀䌀Ⰰ 
	[tag_tree_hierarchyid] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开爀攀猀琀漀爀攀开猀椀搀开洀甀猀琀开戀攀开甀渀椀焀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [UN_restore_sid_must_be_unique] ON [user_restr].[sid_list]਀⠀ 
	[restore_sid] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开猀椀搀开洀甀猀琀开戀攀开甀渀椀焀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [UN_sid_must_be_unique] ON [user_restr].[sid_list]਀⠀ 
	[sid] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开猀琀攀瀀开猀琀愀琀甀猀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [workflow_instances].[step_status_definitions] ADD  CONSTRAINT [UN_step_status_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [workflow_instances].[workflow_output_definitions] ADD  CONSTRAINT [UN_output_definition_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [workflow_models].[workflow_actions] ADD  CONSTRAINT [UN_workflow_action_names] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开眀漀爀欀昀氀漀眀开搀攀昀椀渀椀琀椀漀渀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [workflow_models].[workflow_model_names] ADD  CONSTRAINT [UN_workflow_definition_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开眀漀爀欀昀氀漀眀开爀甀氀攀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [workflow_models].[workflow_rules] ADD  CONSTRAINT [UN_workflow_rule_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀䜀刀䄀倀䠀开唀一䤀儀唀䔀开䤀一䐀䔀堀开㔀㜀㘀䐀㔀㐀䐀䈀㠀㄀㐀　㐀䐀㘀䔀㤀㤀䘀㘀　䈀㜀　㜀㠀㤀㘀㠀䘀㌀㈀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [GRAPH_UNIQUE_INDEX_576D54DB81404D6E99F60B7078968F32] ON [workflow_models].[workflow_step_definitions]਀⠀ 
	$node_id਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀䜀刀䄀倀䠀开唀一䤀儀唀䔀开䤀一䐀䔀堀开㘀䘀㐀㌀䈀㜀㌀䌀㔀㈀㄀䈀㐀㠀䌀㔀㠀䐀䄀㜀㜀䈀䈀䈀䐀　䔀䄀䌀㄀㘀䐀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE UNIQUE NONCLUSTERED INDEX [GRAPH_UNIQUE_INDEX_6F43B73C521B48C58DA77BBBD0EAC16D] ON [workflow_models].[workflow_step_transitions]਀⠀ 
	$edge_id਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [xref].[controller_doc_group_names] ADD  CONSTRAINT [UN_controller_doc_group_names] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [xref].[controller_file_group_names] ADD  CONSTRAINT [UN_controller_file_group_names] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开砀爀攀昀开琀礀瀀攀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [xref].[cross_reference_types] ADD  CONSTRAINT [UN_xref_type_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
CREATE NONCLUSTERED INDEX [UN_group_name] ON [xref].[doc_group_names]਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䐀刀伀倀开䔀堀䤀匀吀䤀一䜀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀匀䔀吀 䄀一匀䤀开倀䄀䐀䐀䤀一䜀 伀一 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  䤀渀搀攀砀 嬀唀一开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
ALTER TABLE [xref].[file_group_names] ADD  CONSTRAINT [UN_file_group_name] UNIQUE NONCLUSTERED ਀⠀ 
	[attr_name] ASC਀⤀圀䤀吀䠀 ⠀倀䄀䐀开䤀一䐀䔀堀 㴀 伀䘀䘀Ⰰ 匀吀䄀吀䤀匀吀䤀䌀匀开一伀刀䔀䌀伀䴀倀唀吀䔀 㴀 伀䘀䘀Ⰰ 匀伀刀吀开䤀一开吀䔀䴀倀䐀䈀 㴀 伀䘀䘀Ⰰ 䤀䜀一伀刀䔀开䐀唀倀开䬀䔀夀 㴀 伀䘀䘀Ⰰ 伀一䰀䤀一䔀 㴀 伀䘀䘀Ⰰ 䄀䰀䰀伀圀开刀伀圀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 䄀䰀䰀伀圀开倀䄀䜀䔀开䰀伀䌀䬀匀 㴀 伀一Ⰰ 伀倀吀䤀䴀䤀娀䔀开䘀伀刀开匀䔀儀唀䔀一吀䤀䄀䰀开䬀䔀夀 㴀 伀䘀䘀⤀ 伀一 嬀倀刀䤀䴀䄀刀夀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀戀漀漀欀攀搀开椀渀开昀椀氀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开戀漀漀欀攀搀开椀渀开昀椀氀攀猀开戀漀漀欀攀搀开搀愀琀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀戀漀漀欀攀搀开搀愀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀戀漀漀欀椀渀最开氀漀最崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开戀漀漀欀椀渀最开氀漀最开猀礀猀琀攀洀开甀猀攀爀渀愀洀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀猀礀猀琀攀洀开甀猀攀爀渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀戀漀漀欀椀渀最开氀漀最崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开戀漀漀欀椀渀最开氀漀最开搀愀琀攀开琀椀洀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀戀漀漀欀椀渀最开搀愀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀开挀爀攀愀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀攀甀氀愀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开攀甀氀愀开挀爀攀愀琀攀搀开愀琀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀开愀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开搀攀氀攀琀攀开氀漀最崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开搀攀氀攀琀攀开氀漀最开搀愀琀攀开琀椀洀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀搀愀琀攀开琀椀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开搀攀氀攀琀攀开氀漀最崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开搀攀氀攀琀攀开氀漀最开搀攀氀攀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀搀攀氀攀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开洀攀琀愀搀愀琀愀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开洀攀琀愀搀愀琀愀开挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开爀攀愀搀开氀漀最崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开爀攀愀搀开氀漀最开搀愀琀攀开琀椀洀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀搀愀琀攀开琀椀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开爀攀愀搀开氀漀最崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开爀攀愀搀开氀漀最开爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开瀀攀漀瀀氀攀开氀椀猀琀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开瀀攀漀瀀氀攀开氀椀猀琀猀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀开椀渀瘀攀爀琀崀  䐀䔀䘀䄀唀䰀吀 ⠀⠀　⤀⤀ 䘀伀刀 嬀椀渀瘀攀爀琀开琀愀最崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀开猀琀愀琀甀猀崀  䐀䔀䘀䄀唀䰀吀 ⠀一✀倀攀渀搀椀渀最✀⤀ 䘀伀刀 嬀猀琀愀琀甀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开愀甀琀栀漀爀椀猀攀爀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开愀甀琀栀漀爀椀猀攀爀猀开挀爀攀愀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开猀椀搀开氀椀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最开爀攀瘀漀欀攀搀开漀渀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀爀攀瘀漀欀攀搀开漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开爀漀氀攀开氀椀渀欀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开甀猀攀爀开爀漀氀攀开氀椀渀欀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开爀漀氀攀开氀椀渀欀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开甀猀攀爀开爀漀氀攀开氀椀渀欀开最爀愀渀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀最爀愀渀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀开挀爀攀愀琀攀开搀愀琀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀最攀琀搀愀琀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀开搀愀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开椀渀搀攀砀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开椀渀搀攀砀开挀爀攀愀琀攀开搀愀琀攀崀  䐀䔀䘀䄀唀䰀吀 ⠀最攀琀搀愀琀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀开搀愀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀开挀爀攀愀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀开挀爀攀愀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀开挀爀攀愀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀开挀爀攀愀琀攀搀崀  䐀䔀䘀䄀唀䰀吀 ⠀猀礀猀搀愀琀攀琀椀洀攀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䐀䘀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀开挀爀攀愀琀攀搀开戀礀崀  䐀䔀䘀䄀唀䰀吀 ⠀漀爀椀最椀渀愀氀开氀漀最椀渀⠀⤀⤀ 䘀伀刀 嬀挀爀攀愀琀攀搀开戀礀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀开栀愀猀开戀漀漀欀椀渀最开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀戀漀漀欀椀渀最开椀搀崀⤀ 
REFERENCES [base].[booking_log] ([booking_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [base].[document_id_list] CHECK CONSTRAINT [FK_document_id_list_has_booking_id]਀䜀伀 
ALTER TABLE [base].[document_id_list]  WITH CHECK ADD  CONSTRAINT [FK_document_key_has_transaction_group] FOREIGN KEY([transaction_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀崀 ⠀嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 匀䔀吀 一唀䰀䰀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀甀洀攀渀琀开欀攀礀开栀愀猀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀攀琀愀搀愀琀愀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_storage] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [base].[file_metadata] CHECK CONSTRAINT [FK_file_metadata_file_id]਀䜀伀 
ALTER TABLE [base].[file_metadata]  WITH CHECK ADD  CONSTRAINT [FK_file_metadata_transaction_group] FOREIGN KEY([transaction_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀崀 ⠀嬀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 匀䔀吀 一唀䰀䰀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀攀琀愀搀愀琀愀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_storage] ([file_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀栀甀洀戀渀愀椀氀猀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_storage] ([file_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀栀甀洀戀渀愀椀氀猀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀甀氀琀甀爀攀开挀漀搀攀开椀猀开最氀漀戀愀氀开猀攀琀琀椀渀最崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀甀氀琀甀爀攀开挀漀搀攀崀⤀ 
REFERENCES [base].[culture_codes] ([culture_code])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_culture_code_is_global_setting]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_date_style_is_global_setting] FOREIGN KEY([date_style])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀崀 ⠀嬀搀愀琀攀琀椀洀攀开猀琀礀氀攀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀愀琀攀开猀琀礀氀攀开椀猀开最氀漀戀愀氀开猀攀琀琀椀渀最崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开搀攀昀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀攀昀愀甀氀琀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_free_text_field_names] ([doc_free_text_name_id])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_global_settings_groups_def_doc_free_text_name_id]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_global_settings_groups_def_filter_gp] FOREIGN KEY([default_filter_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀 ⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开搀攀昀开昀椀氀琀攀爀开最瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开昀椀攀氀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_date_field_names] ([doc_date_name_id])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_global_settings_groups_default_doc_date_field]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_global_settings_groups_default_tag_browsing_tree] FOREIGN KEY([default_tag_browsing_tree_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开搀攀昀愀甀氀琀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开栀愀猀开搀攀昀开琀愀最开琀爀攀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀攀昀愀甀氀琀开琀愀最开琀爀攀攀开椀搀崀⤀ 
REFERENCES [tagging].[tag_tree_names] ([tag_tree_id])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_global_settings_groups_has_def_tag_tree_id]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_global_settings_groups_has_default_form_ID] FOREIGN KEY([default_form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开栀愀猀开搀攀昀愀甀氀琀开昀漀爀洀开䤀䐀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀戀愀猀攀崀⸀嬀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀开栀愀猀开搀攀昀愀甀氀琀开氀愀渀最甀愀最攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀氀愀渀最甀愀最攀开椀搀崀⤀ 
REFERENCES [messaging].[language_list] ([language_id])਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_global_settings_groups_has_default_language_id]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [FK_language_is_global_setting] FOREIGN KEY([language_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀洀攀猀猀愀最椀渀最崀⸀嬀氀愀渀最甀愀最攀开氀椀猀琀崀 ⠀嬀氀愀渀最甀愀最攀开椀搀崀⤀ 
ON UPDATE CASCADE਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [FK_language_is_global_setting]਀䜀伀 
ALTER TABLE [com_obj].[common_object_list_names]  WITH CHECK ADD  CONSTRAINT [FK_com_obj_list_has_attribute] FOREIGN KEY([common_object_attribute_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀洀开漀戀樀开氀椀猀琀开栀愀猀开愀琀琀爀椀戀甀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开栀愀猀开氀椀猀琀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_list_names] ([common_object_list_id])਀䜀伀 
ALTER TABLE [com_obj].[common_object_lists] CHECK CONSTRAINT [FK_com_obj_ms_list_has_list_name]਀䜀伀 
ALTER TABLE [com_obj].[common_object_lists]  WITH CHECK ADD  CONSTRAINT [FK_common_object_ms_list_has_object] FOREIGN KEY([common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀洀洀漀渀开漀戀樀攀挀琀开洀猀开氀椀猀琀开栀愀猀开漀戀樀攀挀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀洀洀漀渀开漀戀樀开栀愀猀开愀琀琀爀椀戀甀琀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_attributes] ([common_object_attribute_id])਀䜀伀 
ALTER TABLE [com_obj].[common_objects] CHECK CONSTRAINT [FK_common_obj_has_attribute]਀䜀伀 
ALTER TABLE [com_obj].[doc_to_com_obj_ms_list_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_common_com_obj_sel_must_match_list] FOREIGN KEY([common_object_list_id], [common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开挀漀洀洀漀渀开挀漀洀开漀戀樀开猀攀氀开洀甀猀琀开洀愀琀挀栀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开椀猀开氀椀渀欀攀搀开琀漀开愀开洀猀开挀漀洀开漀戀樀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [com_obj].[doc_to_com_obj_ms_list_links] CHECK CONSTRAINT [FK_doc_is_linked_to_a_ms_com_obj]਀䜀伀 
ALTER TABLE [com_obj].[doc_to_com_obj_radiob_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_is_linked_to_radiob_list_of_com_obj] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开椀猀开氀椀渀欀攀搀开琀漀开爀愀搀椀漀戀开氀椀猀琀开漀昀开挀漀洀开漀戀樀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开挀漀洀开漀戀樀开氀椀渀欀开洀甀猀琀开洀愀琀挀栀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_lists] ([common_object_list_id], [common_object_id])਀䜀伀 
ALTER TABLE [com_obj].[doc_to_com_obj_radiob_links] CHECK CONSTRAINT [FK_doc_to_com_obj_link_must_match_list]਀䜀伀 
ALTER TABLE [com_obj].[file_to_com_obj_ms_list_links]  WITH CHECK ADD  CONSTRAINT [FK_file_common_com_obj_sel_must_match_list] FOREIGN KEY([common_object_list_id], [common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开挀漀洀洀漀渀开挀漀洀开漀戀樀开猀攀氀开洀甀猀琀开洀愀琀挀栀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀开栀愀猀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [com_obj].[file_to_com_obj_ms_list_links] CHECK CONSTRAINT [FK_file_to_com_obj_ms_list_links_has_file_id]਀䜀伀 
ALTER TABLE [com_obj].[file_to_com_obj_radiob_links]  WITH CHECK ADD  CONSTRAINT [FK_file_linked_to_radiob_list_com_obj] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开氀椀渀欀攀搀开琀漀开爀愀搀椀漀戀开氀椀猀琀开挀漀洀开漀戀樀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀挀漀洀开漀戀樀崀⸀嬀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀甀猀琀开洀愀琀挀栀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_lists] ([common_object_list_id], [common_object_id])਀䜀伀 
ALTER TABLE [com_obj].[file_to_com_obj_radiob_links] CHECK CONSTRAINT [FK_file_to_com_obj_must_match_list]਀䜀伀 
ALTER TABLE [doc_attr].[doc_date_values]  WITH CHECK ADD  CONSTRAINT [FK_doc_date_field_has_values] FOREIGN KEY([doc_date_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开搀愀琀攀开昀椀攀氀搀开栀愀猀开瘀愀氀甀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开搀愀琀攀开搀愀琀愀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [doc_attr].[doc_date_values] CHECK CONSTRAINT [FK_doc_has_date_data]਀䜀伀 
ALTER TABLE [doc_attr].[doc_free_text_values]  WITH CHECK ADD  CONSTRAINT [FK_doc_free_text_field_has_name] FOREIGN KEY([doc_free_text_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开昀爀攀攀开琀攀砀琀开搀愀琀愀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [doc_attr].[doc_free_text_values] CHECK CONSTRAINT [FK_doc_has_free_text_data]਀䜀伀 
ALTER TABLE [doc_attr].[doc_integer_field_names]  WITH CHECK ADD  CONSTRAINT [FK_doc_integer_field_has_unit_of_measure] FOREIGN KEY([unit_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开栀愀猀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开椀渀琀攀最攀爀开搀愀琀愀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [doc_attr].[doc_integer_values] CHECK CONSTRAINT [FK_doc_has_integer_data]਀䜀伀 
ALTER TABLE [doc_attr].[doc_integer_values]  WITH CHECK ADD  CONSTRAINT [FK_doc_integer_field_has_name] FOREIGN KEY([doc_int_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开洀猀开愀琀琀爀开最爀漀甀瀀开氀椀渀欀猀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [forms].[filter_groups] ([filter_group_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_ms_attr_fgroup_links] CHECK CONSTRAINT [FK_doc_ms_attr_group_links_filter_group_id]਀䜀伀 
ALTER TABLE [doc_attr].[doc_ms_attr_fgroup_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_ms_attr_group_links_to_doc_multi_sel_attr_id] FOREIGN KEY([doc_ms_attr_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开洀猀开愀琀琀爀开最爀漀甀瀀开氀椀渀欀猀开琀漀开搀漀挀开洀甀氀琀椀开猀攀氀开愀琀琀爀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀开挀漀洀瀀爀椀猀攀猀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_multi_select_list_names] ([doc_ms_list_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_multi_select_attributes] CHECK CONSTRAINT [FK_doc_ms_attribute_comprises_list]਀䜀伀 
ALTER TABLE [doc_attr].[doc_multi_select_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_ms_attr_assignment] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开洀猀开愀琀琀爀开愀猀猀椀最渀洀攀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_multi_select_list_names] ([doc_ms_list_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_multi_select_links] CHECK CONSTRAINT [FK_doc_has_multi_select_list]਀䜀伀 
ALTER TABLE [doc_attr].[doc_multi_select_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_ms_attr_and_list] FOREIGN KEY([doc_ms_attr_id], [doc_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开洀猀开愀琀琀爀开愀渀搀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开氀椀猀琀开栀愀猀开搀漀挀开搀戀开愀琀琀爀椀戀甀琀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_radio_button_list_names] ([doc_radiob_list_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_radio_button_attributes] CHECK CONSTRAINT [FK_list_has_doc_db_attribute]਀䜀伀 
ALTER TABLE [doc_attr].[doc_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_radio_button] FOREIGN KEY([doc_radiob_attr_id], [doc_radiob_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开爀愀搀椀漀开戀甀琀琀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_radio_button_list_names] ([doc_radiob_list_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_radio_button_links] CHECK CONSTRAINT [FK_doc_has_radio_button_list]਀䜀伀 
ALTER TABLE [doc_attr].[doc_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_radiob_assignment] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开爀愀搀椀漀戀开愀猀猀椀最渀洀攀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀开琀漀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_radiob_attr_fgroup_links] CHECK CONSTRAINT [FK_doc_radiob_attr_fgroup_links_to_doc_radiob_attr_id]਀䜀伀 
ALTER TABLE [doc_attr].[doc_radiob_attr_fgroup_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_radiob_attr_fgroup_links_to_filter_group] FOREIGN KEY([filter_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀椀氀琀攀爀开最爀漀甀瀀猀崀 ⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀开琀漀开昀椀氀琀攀爀开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开栀愀猀开甀渀椀琀开漀昀开洀攀愀甀猀爀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀甀渀椀琀开椀搀崀⤀ 
REFERENCES [base].[units_of_measure] ([unit_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_real_number_field_names] CHECK CONSTRAINT [FK_doc_real_number_field_has_unit_of_meausre]਀䜀伀 
ALTER TABLE [doc_attr].[doc_real_number_values]  WITH CHECK ADD  CONSTRAINT [FK_doc_has_real_number_data] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开爀攀愀氀开渀甀洀戀攀爀开搀愀琀愀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_real_number_field_names] ([doc_real_name_id])਀䜀伀 
ALTER TABLE [doc_attr].[doc_real_number_values] CHECK CONSTRAINT [FK_doc_real_number_field_has_name]਀䜀伀 
ALTER TABLE [file_attr].[file_date_values]  WITH CHECK ADD  CONSTRAINT [FK_file_date_field_has_name] FOREIGN KEY([file_date_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开搀愀琀攀开瘀愀氀甀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [file_attr].[file_date_values] CHECK CONSTRAINT [FK_file_has_date_value]਀䜀伀 
ALTER TABLE [file_attr].[file_free_text_values]  WITH CHECK ADD  CONSTRAINT [FK_file_free_text_field_has_name] FOREIGN KEY([file_free_text_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [file_attr].[file_free_text_values] CHECK CONSTRAINT [FK_file_has_free_text_value]਀䜀伀 
ALTER TABLE [file_attr].[file_integer_field_names]  WITH CHECK ADD  CONSTRAINT [FK_file_integer_field_name_has_unit_of_measure] FOREIGN KEY([unit_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀开栀愀猀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开椀渀琀攀最攀爀开瘀愀氀甀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [file_attr].[file_integer_values] CHECK CONSTRAINT [FK_file_has_integer_value]਀䜀伀 
ALTER TABLE [file_attr].[file_integer_values]  WITH CHECK ADD  CONSTRAINT [FK_file_integer_field_has_name] FOREIGN KEY([file_int_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀开琀漀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [forms].[filter_groups] ([filter_group_id])਀䜀伀 
ALTER TABLE [file_attr].[file_ms_attr_fgroup_links] CHECK CONSTRAINT [FK_file_ms_attr_fgroup_links_to_filter_group_id]਀䜀伀 
ALTER TABLE [file_attr].[file_ms_attr_fgroup_links]  WITH CHECK ADD  CONSTRAINT [FK_file_ms_attr_fgroup_links_to_ms_attr_id] FOREIGN KEY([file_ms_attr_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀开琀漀开洀猀开愀琀琀爀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀椀戀甀琀攀开挀漀洀瀀爀椀猀攀猀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_multi_select_list_names] ([file_ms_list_id])਀䜀伀 
ALTER TABLE [file_attr].[file_multi_select_attributes] CHECK CONSTRAINT [FK_file_ms_attribute_comprises_list]਀䜀伀 
ALTER TABLE [file_attr].[file_multi_select_links]  WITH CHECK ADD  CONSTRAINT [FK_file_has_multi_select_list] FOREIGN KEY([file_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀开愀渀搀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_multi_select_attributes] ([file_ms_attr_id], [file_ms_list_id])਀䜀伀 
ALTER TABLE [file_attr].[file_multi_select_links] CHECK CONSTRAINT [FK_file_ms_attr_and_list]਀䜀伀 
ALTER TABLE [file_attr].[file_multi_select_links]  WITH CHECK ADD  CONSTRAINT [FK_file_multi_select_links_file_has_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀开昀椀氀攀开栀愀猀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀戀开愀琀琀爀椀戀开挀漀洀瀀爀椀猀攀猀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_radio_button_list_names] ([file_radiob_list_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀戀开愀琀琀爀椀戀开挀漀洀瀀爀椀猀攀猀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开栀愀猀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_radio_button_list_names] ([file_radiob_list_id])਀䜀伀 
ALTER TABLE [file_attr].[file_radio_button_links] CHECK CONSTRAINT [FK_file_has_radio_button_list]਀䜀伀 
ALTER TABLE [file_attr].[file_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_file_linked_to_radiob_attrib_link] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开氀椀渀欀攀搀开琀漀开爀愀搀椀漀戀开愀琀琀爀椀戀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开爀愀搀椀漀戀开愀琀琀爀椀戀开愀猀猀椀最渀攀搀开琀漀开昀椀氀攀开开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [file_attr].[file_radio_button_attributes] ([file_radiob_attr_id], [file_radiob_list_id])਀䜀伀 
ALTER TABLE [file_attr].[file_radio_button_links] CHECK CONSTRAINT [FK_radiob_attrib_assigned_to_file__link]਀䜀伀 
ALTER TABLE [file_attr].[file_radiob_attr_fgroup_links]  WITH CHECK ADD  CONSTRAINT [FK_file_radiob_attr_fgroup_link_to_attr_id] FOREIGN KEY([file_radiob_attr_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀开琀漀开愀琀琀爀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀开琀漀开昀椀氀琀攀爀开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀琀攀爀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [forms].[filter_groups] ([filter_group_id])਀䜀伀 
ALTER TABLE [file_attr].[file_radiob_attr_fgroup_links] CHECK CONSTRAINT [FK_file_radiob_attr_fgroup_link_to_filter_group]਀䜀伀 
ALTER TABLE [file_attr].[file_real_number_field_names]  WITH CHECK ADD  CONSTRAINT [FK_file_real_number_field_name_has_unit_of_measure] FOREIGN KEY([unit_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀 ⠀嬀甀渀椀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀开栀愀猀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀攀愀氀开昀椀攀氀搀开栀愀猀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [file_attr].[file_real_number_field_names] ([file_real_name_id])਀䜀伀 
ALTER TABLE [file_attr].[file_real_number_values] CHECK CONSTRAINT [FK_file_real_field_has_name]਀䜀伀 
ALTER TABLE [file_attr].[file_real_number_values]  WITH CHECK ADD  CONSTRAINT [FK_file_real_number_values_has_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀开栀愀猀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀渀琀猀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀洀攀渀琀猀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_comnts_links] CHECK CONSTRAINT [FK_form_doc_booking_comments_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_date_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_booking_date_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_id_links] CHECK CONSTRAINT [FK_form_doc_booking_id_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_release_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_booking_release_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_status_links] CHECK CONSTRAINT [FK_form_doc_booking_status_link_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_user_id_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_booking_user_id_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀愀洀攀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_booking_usernm_links] CHECK CONSTRAINT [FK_form_doc_booking_username_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_com_obj_ms_default_common_object_id] FOREIGN KEY([common_object_list_id], [common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_defaults] CHECK CONSTRAINT [FK_form_doc_com_obj_ms_default_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_c_o_ms_list_link] FOREIGN KEY([common_object_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀开漀开洀猀开氀椀猀琀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_lst_links] CHECK CONSTRAINT [FK_form_has_doc_com_obj_ms_list]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_rb_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_com_obj_rb_lst_links_common_object_default] FOREIGN KEY([common_object_list_id], [default_common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀开挀漀洀洀漀渀开漀戀樀攀挀琀开搀攀昀愀甀氀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀开挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_list_names] ([common_object_list_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_rb_lst_links] CHECK CONSTRAINT [FK_form_doc_com_obj_rb_lst_links_common_object_list]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_rb_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_com_obj_rb_list_link] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀椀猀琀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_created_by_id_links] CHECK CONSTRAINT [FK_form_doc_created_by_id_links_form_identifier_names]਀䜀伀 
ALTER TABLE [forms].[form_doc_created_by_nm_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_created_by_nm_links_form_identifier_names] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_created_links] CHECK CONSTRAINT [FK_form_has_doc_created_link]਀䜀伀 
ALTER TABLE [forms].[form_doc_date_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_ doc_date] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开 搀漀挀开搀愀琀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开搀愀琀攀开昀椀攀氀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_date_field_names] ([doc_date_name_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_date_field_links] CHECK CONSTRAINT [FK_form_has_doc_date_field]਀䜀伀 
ALTER TABLE [forms].[form_doc_free_text_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_free_text_name_id] FOREIGN KEY([doc_free_text_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开昀爀攀攀开琀攀砀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_free_text_field_links] CHECK CONSTRAINT [FK_form_has_doc_free_text]਀䜀伀 
ALTER TABLE [forms].[form_doc_function_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_function_links_general_field_names] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_function_links] CHECK CONSTRAINT [FK_form_doc_function_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_function_list_links_general_field_names] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_function_list_links] CHECK CONSTRAINT [FK_form_doc_function_list_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_integer_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_int_name_id] FOREIGN KEY([doc_int_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开椀渀琀开渀愀洀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开椀渀琀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开椀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_integer_field_links] CHECK CONSTRAINT [FK_form_has_doc_int]਀䜀伀 
ALTER TABLE [forms].[form_doc_lock_status_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_lock_status_link] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开洀猀开愀琀琀爀开椀搀崀Ⰰ 嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_multi_select_attributes] ([doc_ms_attr_id], [doc_ms_list_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_defaults] CHECK CONSTRAINT [FK_form_doc_multi_sel_defaults_doc_multi_select_attributes]਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_multi_sel_defaults_form_identifier_names] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开洀猀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_multi_select_list_names] ([doc_ms_list_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_list_links] CHECK CONSTRAINT [FK_form_doc_multi_select_list_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_multi_select] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_people_list_links] CHECK CONSTRAINT [FK_form_doc_people_list_links_general_field_names]਀䜀伀 
ALTER TABLE [forms].[form_doc_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_people_list_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开栀愀猀开搀攀昀愀甀氀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_radio_button_attributes] ([doc_radiob_attr_id])਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links] CHECK CONSTRAINT [FK_form_doc_radio_button_has_default]਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_doc_radiob] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开爀愀搀椀漀戀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开爀愀搀椀漀戀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [doc_attr].[doc_radio_button_list_names] ([doc_radiob_list_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links] CHECK CONSTRAINT [FK_form_has_doc_radiob_list]਀䜀伀 
ALTER TABLE [forms].[form_doc_real_number_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_real_name_id] FOREIGN KEY([doc_real_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀搀漀挀开愀琀琀爀崀⸀嬀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开爀攀愀氀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开搀漀挀开爀攀愀氀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_real_number_links] CHECK CONSTRAINT [FK_form_has_doc_real]਀䜀伀 
ALTER TABLE [forms].[form_doc_transaction_grp_links]  WITH CHECK ADD  CONSTRAINT [FK_form_id_has_transaction_group] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开椀搀开栀愀猀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_doc_user_links] CHECK CONSTRAINT [FK_form_doc_user_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_doc_user_links]  WITH CHECK ADD  CONSTRAINT [FK_form_doc_user_links_has_general_field_name_id] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀开挀漀洀洀漀渀开漀戀樀攀挀琀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_lists] ([common_object_list_id], [common_object_id])਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_defaults] CHECK CONSTRAINT [FK_form_file_com_obj_ms_defaults_common_objects]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_file_com_obj_ms_defaults_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀开漀开洀猀开氀椀猀琀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_list_names] ([common_object_list_id])਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_lst_links] CHECK CONSTRAINT [FK_form_file_c_o_ms_list_link]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_com_obj] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开挀漀洀开漀戀樀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀开漀开爀戀开氀椀猀琀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [com_obj].[common_object_list_names] ([common_object_list_id])਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_rb_lst_links] CHECK CONSTRAINT [FK_form_file_c_o_rb_list_link]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_rb_lst_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_com_obj_rb_lst_links_default_common_object] FOREIGN KEY([common_object_list_id], [default_common_object_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀挀漀洀开漀戀樀崀⸀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀崀 ⠀嬀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀崀Ⰰ 嬀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀开搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_rb_lst_links] CHECK CONSTRAINT [FK_form_has_file_to_com_obj_rb_lst_link]਀䜀伀 
ALTER TABLE [forms].[form_file_content_hash_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_content_hash_link] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_created_by_id_links] CHECK CONSTRAINT [FK_form_file_created_by_id_links_form_identifier_names]਀䜀伀 
ALTER TABLE [forms].[form_file_created_by_nm_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_created_by_nm_links_form_identifier_names] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_created_links] CHECK CONSTRAINT [FK_form_has_file_created_link]਀䜀伀 
ALTER TABLE [forms].[form_file_date_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_date_name_id] FOREIGN KEY([file_date_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开搀愀琀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_date_field_links] CHECK CONSTRAINT [FK_form_has_file_date]਀䜀伀 
ALTER TABLE [forms].[form_file_free_text_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_free_text_name_id] FOREIGN KEY([file_free_text_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开昀爀攀攀开琀攀砀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_free_text_links] CHECK CONSTRAINT [FK_form_has_file_free_text]਀䜀伀 
ALTER TABLE [forms].[form_file_function_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_function_links_general_field_names] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_function_links] CHECK CONSTRAINT [FK_form_file_function_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_file_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_function_list_links_general_field_names] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_function_list_links] CHECK CONSTRAINT [FK_form_file_function_list_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_file_integer_field_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_int_name_id] FOREIGN KEY([file_int_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开椀渀琀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开椀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_integer_field_links] CHECK CONSTRAINT [FK_form_has_file_int]਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_defaults]  WITH CHECK ADD  CONSTRAINT [FK_file_multi_select_attr_is_default] FOREIGN KEY([file_ms_attr_id], [file_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀崀 ⠀嬀昀椀氀攀开洀猀开愀琀琀爀开椀搀崀Ⰰ 嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀开椀猀开搀攀昀愀甀氀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开洀猀开搀攀昀愀甀氀琀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_defaults] CHECK CONSTRAINT [FK_form_has_file_ms_defaults]਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_multi_select_list_id] FOREIGN KEY([file_ms_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开洀猀开氀椀猀琀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_list_links] CHECK CONSTRAINT [FK_form_has_file_multi_select]਀䜀伀 
ALTER TABLE [forms].[form_file_name_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_filename_links] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀渀愀洀攀开氀椀渀欀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [people].[general_field_names] ([general_field_name_id])਀䜀伀 
ALTER TABLE [forms].[form_file_people_list_links] CHECK CONSTRAINT [FK_form_file_people_list_links_general_field_names]਀䜀伀 
ALTER TABLE [forms].[form_file_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_people_list_links_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀开搀攀昀愀甀氀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀崀⤀ 
REFERENCES [file_attr].[file_radio_button_attributes] ([file_radiob_attr_id])਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links] CHECK CONSTRAINT [FK_form_file_radio_button_links_default]਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_radiob_list_id] FOREIGN KEY([file_radiob_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开爀愀搀椀漀戀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links] CHECK CONSTRAINT [FK_form_has_file_radiob]਀䜀伀 
ALTER TABLE [forms].[form_file_real_number_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_real_name_id] FOREIGN KEY([file_real_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀椀氀攀开愀琀琀爀崀⸀嬀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开爀攀愀氀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_real_number_links] CHECK CONSTRAINT [FK_form_has_file_real]਀䜀伀 
ALTER TABLE [forms].[form_file_retention_date_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_retention_date_has_form_id] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开栀愀猀开昀漀爀洀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_file_size_links] CHECK CONSTRAINT [FK_form_has_file_size_links]਀䜀伀 
ALTER TABLE [forms].[form_file_transactn_grp_links]  WITH CHECK ADD  CONSTRAINT [FK_form_has_file_transaction_status_links] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开昀椀氀攀开琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀开氀椀渀欀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀开栀愀猀开昀漀爀洀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [forms].[form_file_user_links] CHECK CONSTRAINT [FK_form_file_user_links_has_form_id]਀䜀伀 
ALTER TABLE [forms].[form_file_user_links]  WITH CHECK ADD  CONSTRAINT [FK_form_file_user_links_has_general_field_name_id] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开戀攀氀漀渀最猀开琀漀开昀漀爀洀开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [forms].[form_group_names] ([form_group_id])਀䜀伀 
ALTER TABLE [forms].[form_identifier_names] CHECK CONSTRAINT [FK_form_belongs_to_form_group]਀䜀伀 
ALTER TABLE [forms].[form_tag_defaults]  WITH CHECK ADD  CONSTRAINT [FK_form_tag_defaults_doc_tags] FOREIGN KEY([tag_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 ⠀嬀琀愀最开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀开搀漀挀开琀愀最猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀开昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_tag_defaults] CHECK CONSTRAINT [FK_form_tag_defaults_form_identifier_names]਀䜀伀 
ALTER TABLE [forms].[form_tag_fields]  WITH CHECK ADD  CONSTRAINT [FK_form_has_tags_field] FOREIGN KEY([form_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀昀漀爀洀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开昀椀攀氀搀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开琀愀最猀开昀椀攀氀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开搀攀昀愀甀氀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开琀愀最开最爀漀甀瀀开昀椀攀氀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_tag_group_defaults] CHECK CONSTRAINT [FK_form_has_tag_group_field]਀䜀伀 
ALTER TABLE [forms].[form_tag_group_defaults]  WITH CHECK ADD  CONSTRAINT [FK_tag_group_belongs_to_form] FOREIGN KEY([tag_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀琀愀最开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开搀攀昀愀甀氀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开最爀漀甀瀀开戀攀氀漀渀最猀开琀漀开昀漀爀洀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开琀愀最开最爀漀甀瀀开昀椀攀氀搀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开栀愀猀开琀愀最开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开椀搀崀⤀ 
REFERENCES [forms].[form_identifier_names] ([form_id])਀䜀伀 
ALTER TABLE [forms].[form_tag_group_fields] CHECK CONSTRAINT [FK_form_has_tag_group]਀䜀伀 
ALTER TABLE [messaging].[message_details]  WITH CHECK ADD  CONSTRAINT [FK_message_detail_has_language] FOREIGN KEY([language_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀洀攀猀猀愀最椀渀最崀⸀嬀氀愀渀最甀愀最攀开氀椀猀琀崀 ⠀嬀氀愀渀最甀愀最攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开洀攀猀猀愀最攀开搀攀琀愀椀氀开栀愀猀开氀愀渀最甀愀最攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀洀攀猀猀愀最椀渀最崀⸀嬀洀攀猀猀愀最攀开搀攀琀愀椀氀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开洀攀猀猀愀最攀开椀搀开栀愀猀开搀攀琀愀椀氀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀洀攀猀猀愀最攀开椀搀崀⤀ 
REFERENCES [messaging].[message_id_list] ([message_id])਀䜀伀 
ALTER TABLE [messaging].[message_details] CHECK CONSTRAINT [FK_message_id_has_details]਀䜀伀 
ALTER TABLE [people].[doc_to_function_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_function_links_doc_has_doc_id] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开搀漀挀开栀愀猀开搀漀挀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀甀渀挀琀椀漀渀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
REFERENCES [people].[duty_functions] ([function_id])਀䜀伀 
ALTER TABLE [people].[doc_to_function_links] CHECK CONSTRAINT [FK_doc_to_function_links_has_function_id]਀䜀伀 
ALTER TABLE [people].[doc_to_function_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_function_links_has_general_file_name_id] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀氀攀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀开栀愀猀开搀漀挀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[doc_to_function_list_links] CHECK CONSTRAINT [FK_doc_function_list_link_has_doc_id]਀䜀伀 
ALTER TABLE [people].[doc_to_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_function_list_links_has_general_field_name_id] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开搀漀挀甀洀攀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[function_list_names] ([function_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开搀漀挀甀洀攀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开瀀攀爀猀漀渀开氀椀猀琀开氀椀渀欀开栀愀猀开搀漀挀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[doc_to_people_list_links] CHECK CONSTRAINT [FK_doc_person_list_link_has_doc_id]਀䜀伀 
ALTER TABLE [people].[doc_to_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_people_list_links_general_field_names] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开搀漀挀甀洀攀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[people_list_names] ([people_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开搀漀挀甀洀攀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开搀漀挀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[doc_to_user_links] CHECK CONSTRAINT [FK_doc_to_user_links_has_doc_id]਀䜀伀 
ALTER TABLE [people].[doc_to_user_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_to_user_links_has_general_field_name_id] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开甀猀攀爀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[doc_to_user_links] CHECK CONSTRAINT [FK_doc_to_user_links_has_user_id]਀䜀伀 
ALTER TABLE [people].[duty_function_sid_links]  WITH CHECK ADD  CONSTRAINT [FK_sid_link_to_user_function] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开猀椀搀开氀椀渀欀开琀漀开甀猀攀爀开昀甀渀挀琀椀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开甀猀攀爀开昀甀渀挀琀椀漀渀开氀椀渀欀开琀漀开猀椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
REFERENCES [people].[duty_functions] ([function_id])਀䜀伀 
ALTER TABLE [people].[duty_function_sid_links] CHECK CONSTRAINT [FK_user_function_link_to_sid]਀䜀伀 
ALTER TABLE [people].[file_to_function_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_function_links_general_field_names] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[file_to_function_links] CHECK CONSTRAINT [FK_file_to_function_links_has_file_id]਀䜀伀 
ALTER TABLE [people].[file_to_function_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_function_links_has_function_id] FOREIGN KEY([function_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开栀愀猀开昀甀渀挀琀椀漀渀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀开栀愀猀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[file_to_function_list_links] CHECK CONSTRAINT [FK_file_function_list_link_has_file_id]਀䜀伀 
ALTER TABLE [people].[file_to_function_list_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_function_list_links_general_field_names] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开昀椀氀攀椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[function_list_names] ([function_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开昀椀氀攀椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开瀀攀爀猀漀渀开氀椀猀琀开氀椀渀欀开栀愀猀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[file_to_people_list_links] CHECK CONSTRAINT [FK_file_person_list_link_has_file_id]਀䜀伀 
ALTER TABLE [people].[file_to_people_list_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_people_list_links_general_field_names] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开昀椀氀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[people_list_names] ([people_list_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开昀椀氀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开昀椀氀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [people].[file_to_user_links] CHECK CONSTRAINT [FK_file_to_user_links_has_file_id]਀䜀伀 
ALTER TABLE [people].[file_to_user_links]  WITH CHECK ADD  CONSTRAINT [FK_file_to_user_links_has_gen_field_name_id] FOREIGN KEY([general_field_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀崀 ⠀嬀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开最攀渀开昀椀攀氀搀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀开栀愀猀开猀椀搀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [people].[file_to_user_links] CHECK CONSTRAINT [FK_file_to_user_links_has_sid_id]਀䜀伀 
ALTER TABLE [people].[function_lists]  WITH CHECK ADD  CONSTRAINT [FK_function_belongs_to_function_list] FOREIGN KEY([function_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀甀渀挀琀椀漀渀开戀攀氀漀渀最猀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀甀渀挀琀椀漀渀开氀椀猀琀开栀愀猀开昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[function_list_names] ([function_list_id])਀䜀伀 
ALTER TABLE [people].[function_lists] CHECK CONSTRAINT [FK_function_list_has_function_list_name]਀䜀伀 
ALTER TABLE [people].[people_lists]  WITH CHECK ADD  CONSTRAINT [FK_people_list_name_has_person] FOREIGN KEY([people_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀开栀愀猀开瀀攀爀猀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀猀开猀椀搀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [people].[people_lists] CHECK CONSTRAINT [FK_people_lists_sid_id]਀䜀伀 
ALTER TABLE [tagging].[tag_browsing_tree_names]  WITH CHECK ADD  CONSTRAINT [FK_tag_browsing_tree_names_has_sid_id] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀开栀愀猀开猀椀搀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开栀愀猀开渀漀搀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀⤀ 
REFERENCES [tagging].[tag_browsing_tree_names] ([tag_browsing_tree_id])਀䜀伀 
ALTER TABLE [tagging].[tag_browsing_tree_nodes] CHECK CONSTRAINT [FK_tag_browsing_tree_has_nodes]਀䜀伀 
ALTER TABLE [tagging].[tag_browsing_tree_nodes]  WITH CHECK ADD  CONSTRAINT [FK_tag_browsing_tree_node_is_tag] FOREIGN KEY([tag_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 ⠀嬀琀愀最开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀猀开琀愀最崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开栀愀猀开琀愀最崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [tagging].[tag_to_document_links] CHECK CONSTRAINT [FK_doc_has_tag]਀䜀伀 
ALTER TABLE [tagging].[tag_to_document_links]  WITH CHECK ADD  CONSTRAINT [FK_tag_doc_link_tag_id] FOREIGN KEY([tag_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 ⠀嬀琀愀最开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [tagging].[tag_to_document_links] CHECK CONSTRAINT [FK_tag_doc_link_tag_id]਀䜀伀 
ALTER TABLE [tagging].[tag_to_tag_group_links]  WITH CHECK ADD  CONSTRAINT [FK_tag_has_tag_group] FOREIGN KEY([tag_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 ⠀嬀琀愀最开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开栀愀猀开琀愀最开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀漀开琀愀最最爀漀甀瀀开氀椀渀欀开琀愀最开最爀漀甀瀀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [tagging].[tag_group_identifier_names] ([tag_group_id])਀䜀伀 
ALTER TABLE [tagging].[tag_to_tag_group_links] CHECK CONSTRAINT [FK_tag_to_taggroup_link_tag_group_id]਀䜀伀 
ALTER TABLE [tagging].[tag_tree_nodes]  WITH CHECK ADD  CONSTRAINT [FK_tag_tree_nodes_doc_tags] FOREIGN KEY([tag_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀搀漀挀开琀愀最猀崀 ⠀嬀琀愀最开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开渀漀搀攀猀开搀漀挀开琀愀最猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀漀搀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开琀愀最开琀爀攀攀开渀漀搀攀猀开琀愀最开琀爀攀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀琀愀最开琀爀攀攀开椀搀崀⤀ 
REFERENCES [tagging].[tag_tree_names] ([tag_tree_id])਀䜀伀 
ALTER TABLE [tagging].[tag_tree_nodes] CHECK CONSTRAINT [FK_tag_tree_nodes_tag_trees]਀䜀伀 
ALTER TABLE [user_restr].[authoriser_privilege_requests]  WITH CHECK ADD  CONSTRAINT [FK_authoriser_privilege_requests_has_sid_id] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀开栀愀猀开猀椀搀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀愀甀琀栀漀爀椀猀攀爀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开猀椀搀开椀猀开愀甀琀栀漀爀椀猀攀爀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [user_restr].[authorisers] CHECK CONSTRAINT [FK_sid_is_authoriser]਀䜀伀 
ALTER TABLE [user_restr].[controller_doc_group_sid_links]  WITH CHECK ADD  CONSTRAINT [FK_controller_doc_group_sid_links_controller_doc_group_name_id] FOREIGN KEY([controller_doc_group_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀开猀椀搀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [user_restr].[controller_doc_group_sid_links] CHECK CONSTRAINT [FK_controller_doc_group_sid_links_sid_id]਀䜀伀 
ALTER TABLE [user_restr].[controller_file_grp_sid_links]  WITH CHECK ADD  CONSTRAINT [FK_controller_file_grp_sid_links_controller_file_grp_name_id] FOREIGN KEY([controller_file_group_name_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开渀愀洀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀开猀椀搀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [user_restr].[controller_file_grp_sid_links] CHECK CONSTRAINT [FK_controller_file_grp_sid_links_sid_id]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_funct_lst]  WITH CHECK ADD  CONSTRAINT [FK_doc_group_is_linked_to_edit_permission_duty_function_list] FOREIGN KEY([doc_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀搀漀挀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开椀猀开氀椀渀欀攀搀开琀漀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀开搀甀琀礀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀甀琀礀开昀甀渀挀琀椀漀渀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开搀漀挀甀洀攀渀琀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[function_list_names] ([function_list_id])਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_funct_lst] CHECK CONSTRAINT [FK_duty_function_list_is_linked_to_document_group_edit_permission]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_people_lst]  WITH CHECK ADD  CONSTRAINT [FK_doc_group_is_linked_to_edit_permission_people_list] FOREIGN KEY([doc_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀搀漀挀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开椀猀开氀椀渀欀攀搀开琀漀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀开瀀攀漀瀀氀攀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开椀猀开氀椀渀欀攀搀开琀漀开搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[people_list_names] ([people_list_id])਀䜀伀 
ALTER TABLE [user_restr].[doc_group_edit_perm_people_lst] CHECK CONSTRAINT [FK_people_list_is_linked_to_doc_group_edit_permission]਀䜀伀 
ALTER TABLE [user_restr].[doc_group_view_permissions]  WITH CHECK ADD  CONSTRAINT [FK_doc_group_has_view_restriction] FOREIGN KEY([doc_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀搀漀挀开最爀漀甀瀀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开栀愀猀开瘀椀攀眀开爀攀猀琀爀椀挀琀椀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀开栀愀猀开猀椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [user_restr].[doc_group_view_permissions] CHECK CONSTRAINT [FK_doc_group_view_permissions_has_sid]਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_funct_lst]  WITH CHECK ADD  CONSTRAINT [FK_duty_function_list_has_file_group_edit_permission] FOREIGN KEY([function_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀甀琀礀开昀甀渀挀琀椀漀渀开氀椀猀琀开栀愀猀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开最爀漀甀瀀开栀愀猀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀开昀甀渀挀琀椀漀渀开氀椀猀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [xref].[file_group_names] ([file_group_id])਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_funct_lst] CHECK CONSTRAINT [FK_file_group_has_edit_permission_function_list]਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_ppl_lst]  WITH CHECK ADD  CONSTRAINT [FK_file_group_has_edit_permission_people_list] FOREIGN KEY([file_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开最爀漀甀瀀开栀愀猀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀开瀀攀漀瀀氀攀开氀椀猀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀漀瀀氀攀开氀椀猀琀开栀愀猀开昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀椀猀猀椀漀渀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
REFERENCES [people].[people_list_names] ([people_list_id])਀䜀伀 
ALTER TABLE [user_restr].[file_group_edit_perm_ppl_lst] CHECK CONSTRAINT [FK_people_list_has_file_group_edit_permission]਀䜀伀 
ALTER TABLE [user_restr].[form_group_owners]  WITH CHECK ADD  CONSTRAINT [FK_form_owners_has_sid_id] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀漀爀洀开漀眀渀攀爀猀开栀愀猀开猀椀搀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开甀猀攀爀开漀眀渀猀开昀漀爀洀开最爀漀甀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀漀爀洀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [forms].[form_group_names] ([form_group_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[form_group_owners] CHECK CONSTRAINT [FK_user_owns_form_group]਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_flist]  WITH CHECK ADD  CONSTRAINT [FK_tag_br_tree_permissions_flist_has_flist] FOREIGN KEY([function_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_flist] CHECK CONSTRAINT [FK_tag_br_tree_permissions_flist_has_flist]਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_flist]  WITH CHECK ADD  CONSTRAINT [FK_tag_br_tree_permissions_flist_has_tag_browsing_tree] FOREIGN KEY([tag_browsing_tree_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_flist] CHECK CONSTRAINT [FK_tag_br_tree_permissions_flist_has_tag_browsing_tree]਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_plist]  WITH CHECK ADD  CONSTRAINT [FK_tag_br_tree_permissions_plist_has_browsing_tree] FOREIGN KEY([tag_browsing_tree_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_plist] CHECK CONSTRAINT [FK_tag_br_tree_permissions_plist_has_browsing_tree]਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_plist]  WITH CHECK ADD  CONSTRAINT [FK_tag_br_tree_permissions_plist_has_plist] FOREIGN KEY([people_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_br_tree_permissions_plist] CHECK CONSTRAINT [FK_tag_br_tree_permissions_plist_has_plist]਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_flist]  WITH CHECK ADD  CONSTRAINT [FK_tag_group_permissions_flist_has_function_list] FOREIGN KEY([function_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_flist] CHECK CONSTRAINT [FK_tag_group_permissions_flist_has_function_list]਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_flist]  WITH CHECK ADD  CONSTRAINT [FK_tag_group_permissions_flist_has_tag_group] FOREIGN KEY([tag_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀琀愀最开最爀漀甀瀀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_flist] CHECK CONSTRAINT [FK_tag_group_permissions_flist_has_tag_group]਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_plist]  WITH CHECK ADD  CONSTRAINT [FK_tag_group_permissions_plist_has_tag_group] FOREIGN KEY([tag_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀崀 ⠀嬀琀愀最开最爀漀甀瀀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_plist] CHECK CONSTRAINT [FK_tag_group_permissions_plist_has_tag_group]਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_plist]  WITH CHECK ADD  CONSTRAINT [FK_tag_group_permissions_plist_people_list_names] FOREIGN KEY([people_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_group_permissions_plist] CHECK CONSTRAINT [FK_tag_group_permissions_plist_people_list_names]਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_flist]  WITH CHECK ADD  CONSTRAINT [FK_tag_tree_permissions_flist_has_flist] FOREIGN KEY([function_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_flist] CHECK CONSTRAINT [FK_tag_tree_permissions_flist_has_flist]਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_flist]  WITH CHECK ADD  CONSTRAINT [FK_tag_tree_permissions_flist_has_tag_tree] FOREIGN KEY([tag_tree_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开琀爀攀攀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_flist] CHECK CONSTRAINT [FK_tag_tree_permissions_flist_has_tag_tree]਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_plist]  WITH CHECK ADD  CONSTRAINT [FK_tag_tree_permissions_plist_has_plist] FOREIGN KEY([people_list_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀瀀攀漀瀀氀攀崀⸀嬀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀 ⠀嬀瀀攀漀瀀氀攀开氀椀猀琀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_plist] CHECK CONSTRAINT [FK_tag_tree_permissions_plist_has_plist]਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_plist]  WITH CHECK ADD  CONSTRAINT [FK_tag_tree_permissions_plist_has_tag_tree] FOREIGN KEY([tag_tree_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀琀愀最最椀渀最崀⸀嬀琀愀最开琀爀攀攀开渀愀洀攀猀崀 ⠀嬀琀愀最开琀爀攀攀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [user_restr].[tag_tree_permissions_plist] CHECK CONSTRAINT [FK_tag_tree_permissions_plist_has_tag_tree]਀䜀伀 
ALTER TABLE [user_restr].[user_role_link]  WITH CHECK ADD  CONSTRAINT [FK_role_has_user_sid] FOREIGN KEY([sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀猀椀搀开氀椀猀琀崀 ⠀嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开爀漀氀攀开氀椀渀欀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开爀漀氀攀开栀愀猀开甀猀攀爀开猀椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀甀猀攀爀开爀漀氀攀开氀椀渀欀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开甀猀攀爀开栀愀猀开爀漀氀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀爀漀氀攀开渀愀洀攀崀⤀ 
REFERENCES [user_restr].[role_list] ([role_name])਀䜀伀 
ALTER TABLE [user_restr].[user_role_link] CHECK CONSTRAINT [FK_user_has_role]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_function_output_files]  WITH CHECK ADD  CONSTRAINT [FK_workflow_instance_step_and_function_links_to_file] FOREIGN KEY([workflow_instance_step_id], [function_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 ⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀Ⰰ 嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开愀渀搀开昀甀渀挀琀椀漀渀开氀椀渀欀猀开琀漀开昀椀氀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开栀愀猀开昀椀氀攀开漀甀琀瀀甀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_function_output_files] CHECK CONSTRAINT [FK_workflow_instance_step_has_file_output]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_instance_definitions]  WITH CHECK ADD  CONSTRAINT [FK_document_has_workflow] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀甀洀攀渀琀开栀愀猀开眀漀爀欀昀氀漀眀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开搀攀昀椀渀椀琀椀漀渀开栀愀猀开猀琀攀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_instance_definitions] ([workflow_instance_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开搀攀昀椀渀椀琀椀漀渀开栀愀猀开猀琀攀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开猀琀愀琀甀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀琀攀瀀开猀琀愀琀甀猀开椀搀崀⤀ 
REFERENCES [workflow_instances].[step_status_definitions] ([step_status_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开猀琀愀琀甀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀开栀愀猀开昀椀氀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_person_output_files] CHECK CONSTRAINT [FK_workflow_person_output_files_has_file]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_person_output_files]  WITH CHECK ADD  CONSTRAINT [FK_workflow_step_and_participant_has_output_file] FOREIGN KEY([workflow_instance_step_id], [sid_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀崀 ⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀Ⰰ 嬀猀椀搀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开愀渀搀开瀀愀爀琀椀挀椀瀀愀渀琀开栀愀猀开漀甀琀瀀甀琀开昀椀氀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀甀琀礀开昀甀渀挀琀椀漀渀开戀攀氀漀渀最猀开琀漀开眀漀爀欀昀氀漀眀开猀琀攀瀀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀甀渀挀琀椀漀渀开椀搀崀⤀ 
REFERENCES [people].[duty_functions] ([function_id])਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_duty_functions] CHECK CONSTRAINT [FK_duty_function_belongs_to_workflow_step]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_duty_functions]  WITH CHECK ADD  CONSTRAINT [FK_workflow_instance_step_has_duty_function] FOREIGN KEY([workflow_instance_step_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀崀 ⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀⤀ 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_duty_functions] CHECK CONSTRAINT [FK_workflow_instance_step_has_duty_function]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_duty_functions]  WITH CHECK ADD  CONSTRAINT [FK_workflow_step_duty_function_has_output] FOREIGN KEY([output_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀崀 ⠀嬀漀甀琀瀀甀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀开栀愀猀开漀甀琀瀀甀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开椀渀瀀甀琀开昀椀氀攀猀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_instance_steps] ([workflow_instance_step_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开椀渀瀀甀琀开昀椀氀攀猀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开瀀攀爀猀漀渀开椀猀开眀漀爀欀昀氀漀眀开瀀愀爀琀椀挀椀瀀愀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀椀搀开椀搀崀⤀ 
REFERENCES [user_restr].[sid_list] ([sid_id])਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_participants] CHECK CONSTRAINT [FK_person_is_workflow_participant]਀䜀伀 
ALTER TABLE [workflow_instances].[workflow_step_participants]  WITH CHECK ADD  CONSTRAINT [FK_workflow_step_has_output] FOREIGN KEY([output_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀崀 ⠀嬀漀甀琀瀀甀琀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开漀甀琀瀀甀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开瀀愀爀琀椀挀椀瀀愀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_instance_steps] ([workflow_instance_step_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开瀀愀爀琀椀挀椀瀀愀渀琀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开琀漀开氀漀最开椀渀搀攀砀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀眀昀开氀漀最开椀渀搀攀砀开椀搀崀⤀ 
REFERENCES [workflow_instances].[workflow_track_log_index] ([wf_log_index_id])਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀崀⸀嬀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开琀漀开氀漀最开椀渀搀攀砀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开猀琀攀瀀开栀愀猀开爀甀氀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀爀甀氀攀开椀搀崀⤀ 
REFERENCES [workflow_models].[workflow_rules] ([rule_id])਀䜀伀 
ALTER TABLE [workflow_models].[workflow_rule_links] CHECK CONSTRAINT [FK_workflow_step_has_rule]਀䜀伀 
ALTER TABLE [workflow_models].[workflow_step_transitions]  WITH CHECK ADD  CONSTRAINT [FK_workflow_action_id] FOREIGN KEY([workflow_action_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀崀 ⠀嬀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀崀⸀嬀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [xref].[controller_doc_group_names] ([controller_doc_group_name_id])਀䜀伀 
ALTER TABLE [xref].[controller_doc_group_links] CHECK CONSTRAINT [FK_controller_doc_group_links_controller_doc_group_name]਀䜀伀 
ALTER TABLE [xref].[controller_doc_group_links]  WITH CHECK ADD  CONSTRAINT [FK_controller_doc_group_links_doc_id] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀开搀漀挀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀崀⤀ 
REFERENCES [xref].[controller_file_group_names] ([controller_file_group_name_id])਀䜀伀 
ALTER TABLE [xref].[controller_file_group_links] CHECK CONSTRAINT [FK_controller_file_group_links_controller_file_group_name_id]਀䜀伀 
ALTER TABLE [xref].[controller_file_group_links]  WITH CHECK ADD  CONSTRAINT [FK_controller_file_group_links_controller_file_id] FOREIGN KEY([file_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀昀椀氀攀开洀攀琀愀搀愀琀愀崀 ⠀嬀昀椀氀攀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀开挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀开砀爀攀昀开搀漀挀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀砀爀攀昀开搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀䜀伀 
ALTER TABLE [xref].[doc_cross_references] CHECK CONSTRAINT [FK_doc_cross_references_xref_doc_id]਀䜀伀 
ALTER TABLE [xref].[doc_cross_references]  WITH CHECK ADD  CONSTRAINT [FK_doc_xref_to_xref_type] FOREIGN KEY([xref_type_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀崀 ⠀嬀砀爀攀昀开琀礀瀀攀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开砀爀攀昀开琀漀开砀爀攀昀开琀礀瀀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开猀漀甀爀挀攀开搀漀挀开椀搀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀猀漀甀爀挀攀开搀漀挀开椀搀崀⤀ 
REFERENCES [base].[document_id_list] ([doc_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [xref].[doc_cross_references] CHECK CONSTRAINT [FK_source_doc_id]਀䜀伀 
ALTER TABLE [xref].[doc_group_links]  WITH CHECK ADD  CONSTRAINT [FK_doc_belongs_to_doc_group] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
ON UPDATE CASCADE਀伀一 䐀䔀䰀䔀吀䔀 䌀䄀匀䌀䄀䐀䔀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开戀攀氀漀渀最猀开琀漀开搀漀挀开最爀漀甀瀀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀搀漀挀开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀开最爀漀甀瀀开栀愀猀开氀椀渀欀攀搀开搀漀挀甀洀攀渀琀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀搀漀挀开最爀漀甀瀀开椀搀崀⤀ 
REFERENCES [xref].[doc_group_names] ([doc_group_id])਀䜀伀 
ALTER TABLE [xref].[doc_group_links] CHECK CONSTRAINT [FK_doc_group_has_linked_document]਀䜀伀 
ALTER TABLE [xref].[file_group_links]  WITH CHECK ADD  CONSTRAINT [FK_file_group_link_group_id] FOREIGN KEY([file_group_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀 ⠀嬀昀椀氀攀开最爀漀甀瀀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀开最爀漀甀瀀开椀搀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [xref].[file_group_links] CHECK CONSTRAINT [FK_file_to_file_group_link]਀䜀伀 
ALTER TABLE [xref].[file_to_document_links]  WITH CHECK ADD  CONSTRAINT [FK_document_link_to_file] FOREIGN KEY([doc_id])਀刀䔀䘀䔀刀䔀一䌀䔀匀 嬀戀愀猀攀崀⸀嬀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀崀 ⠀嬀搀漀挀开椀搀崀⤀ 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀 䌀䠀䔀䌀䬀 䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开搀漀挀甀洀攀渀琀开氀椀渀欀开琀漀开昀椀氀攀崀 
GO਀䄀䰀吀䔀刀 吀䄀䈀䰀䔀 嬀砀爀攀昀崀⸀嬀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀崀  圀䤀吀䠀 䌀䠀䔀䌀䬀 䄀䐀䐀  䌀伀一匀吀刀䄀䤀一吀 嬀䘀䬀开昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀开昀椀氀攀开洀攀琀愀搀愀琀愀崀 䘀伀刀䔀䤀䜀一 䬀䔀夀⠀嬀昀椀氀攀开椀搀崀⤀ 
REFERENCES [base].[file_metadata] ([file_id])਀伀一 唀倀䐀䄀吀䔀 䌀䄀匀䌀䄀䐀䔀 
ON DELETE CASCADE਀䜀伀 
ALTER TABLE [xref].[file_to_document_links] CHECK CONSTRAINT [FK_file_to_document_links_file_metadata]਀䜀伀 
ALTER TABLE [base].[booking_log]  WITH CHECK ADD  CONSTRAINT [CK_booking_status] CHECK  (([booking_status]='In' OR [booking_status]='Out'))਀䜀伀 
ALTER TABLE [base].[booking_log] CHECK CONSTRAINT [CK_booking_status]਀䜀伀 
ALTER TABLE [base].[document_id_list]  WITH CHECK ADD  CONSTRAINT [CK_document_id_list] CHECK  (([lock_status]='Unlocked' OR [lock_status]='Locked' OR [lock_status] IS NULL))਀䜀伀 
ALTER TABLE [base].[document_id_list] CHECK CONSTRAINT [CK_document_id_list]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_doc_id_format] CHECK  (([doc_id_format]='Integer' OR [doc_id_format]='Alpha' OR [doc_id_format] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_doc_id_format]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_duplicate_management] CHECK  (([duplicate_management]='On' OR [duplicate_management]='Off' OR [duplicate_management] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_duplicate_management]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_enforced_retention] CHECK  (([enforced_retention]='On' OR [enforced_retention]='Off' OR [enforced_retention] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_enforced_retention]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_file_delete_log] CHECK  (([file_delete_log]='On' OR [file_delete_log]='Off' OR [file_delete_log] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_file_delete_log]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_file_read_log] CHECK  (([file_read_log]='On' OR [file_read_log]='Off' OR [file_read_log] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_file_read_log]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_is_register_code] CHECK  (([is_register_code_applied]='No' OR [is_register_code_applied]='Yes' OR [is_register_code_applied] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_is_register_code]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_store_plain_text] CHECK  (([store_plain_text_content]='On' OR [store_plain_text_content]='Off' OR [store_plain_text_content] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_store_plain_text]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_store_thumbnails] CHECK  (([store_thumbnails]='On' OR [store_thumbnails]='Off' OR [store_thumbnails] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_store_thumbnails]਀䜀伀 
ALTER TABLE [base].[global_settings_groups]  WITH CHECK ADD  CONSTRAINT [CK_global_settings_groups_use_autogen] CHECK  (([use_auto_gen_doc_id_on_null]='No' OR [use_auto_gen_doc_id_on_null]='Yes' OR [use_auto_gen_doc_id_on_null] IS NULL))਀䜀伀 
ALTER TABLE [base].[global_settings_groups] CHECK CONSTRAINT [CK_global_settings_groups_use_autogen]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_lst_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_common_object_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_ms_lst_links] CHECK CONSTRAINT [CK_form_doc_common_object_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_rb_lst_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_com_obj_rb_lst_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_com_obj_rb_lst_links] CHECK CONSTRAINT [CK_form_doc_com_obj_rb_lst_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_date_field_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_date_field_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_date_field_links] CHECK CONSTRAINT [CK_form_doc_date_field_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_free_text_field_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_free_text_field_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_free_text_field_links] CHECK CONSTRAINT [CK_form_doc_free_text_field_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_function_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_function_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_function_links] CHECK CONSTRAINT [CK_form_doc_function_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_function_list_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_function_list_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_function_list_links] CHECK CONSTRAINT [CK_form_doc_function_list_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_integer_field_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_integer_field_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_integer_field_links] CHECK CONSTRAINT [CK_form_doc_integer_field_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_lock_status_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_lock_status_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_lock_status_links] CHECK CONSTRAINT [CK_form_doc_lock_status_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_list_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_multi_sel_list_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_multi_sel_list_links] CHECK CONSTRAINT [CK_form_doc_multi_sel_list_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_people_list_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_people_list_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_people_list_links] CHECK CONSTRAINT [CK_form_doc_people_list_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_radio_button_attr_referential_integrity] CHECK  (([internal].[ufn_CHK_doc_radiob_attribute]([doc_radiob_list_id],[default_doc_rb_attr_id])=(1)))਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links] CHECK CONSTRAINT [CK_form_doc_radio_button_attr_referential_integrity]਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_radio_button_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_radio_button_links] CHECK CONSTRAINT [CK_form_doc_radio_button_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_real_number_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_real_number_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_real_number_links] CHECK CONSTRAINT [CK_form_doc_real_number_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_doc_transaction_grp_links]  WITH CHECK ADD  CONSTRAINT [CK_form_doc_transaction_grp_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_doc_transaction_grp_links] CHECK CONSTRAINT [CK_form_doc_transaction_grp_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_lst_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_common_object_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_ms_lst_links] CHECK CONSTRAINT [CK_form_file_common_object_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_rb_lst_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_com_obj_rb_lst_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_com_obj_rb_lst_links] CHECK CONSTRAINT [CK_form_file_com_obj_rb_lst_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_date_field_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_date_field_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_date_field_links] CHECK CONSTRAINT [CK_form_file_date_field_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_free_text_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_free_text_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_free_text_links] CHECK CONSTRAINT [CK_form_file_free_text_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_function_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_function_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_function_links] CHECK CONSTRAINT [CK_form_file_function_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_function_list_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_function_list_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_function_list_links] CHECK CONSTRAINT [CK_form_file_function_list_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_integer_field_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_integer_num_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_integer_field_links] CHECK CONSTRAINT [CK_form_file_integer_num_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_list_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_multi_sel_list_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_multi_sel_list_links] CHECK CONSTRAINT [CK_form_file_multi_sel_list_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_name_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_name_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_name_links] CHECK CONSTRAINT [CK_form_file_name_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_people_list_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_people_list_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_people_list_links] CHECK CONSTRAINT [CK_form_file_people_list_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_radio_button_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links] CHECK CONSTRAINT [CK_form_file_radio_button_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_radiob_attribute_integrity_check] CHECK  (([internal].[ufn_CHK_file_radiob_attribute]([file_radiob_list_id],[default_file_rb_attr_id])=(1)))਀䜀伀 
ALTER TABLE [forms].[form_file_radio_button_links] CHECK CONSTRAINT [CK_form_file_radiob_attribute_integrity_check]਀䜀伀 
ALTER TABLE [forms].[form_file_real_number_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_real_number_links_ismandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_real_number_links] CHECK CONSTRAINT [CK_form_file_real_number_links_ismandatory]਀䜀伀 
ALTER TABLE [forms].[form_file_transactn_grp_links]  WITH CHECK ADD  CONSTRAINT [CK_form_file_transactn_grp_links_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_file_transactn_grp_links] CHECK CONSTRAINT [CK_form_file_transactn_grp_links_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_tag_fields]  WITH CHECK ADD  CONSTRAINT [CK_form_tag_fields_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_tag_fields] CHECK CONSTRAINT [CK_form_tag_fields_mandatory]਀䜀伀 
ALTER TABLE [forms].[form_tag_group_fields]  WITH CHECK ADD  CONSTRAINT [CK_form_tag_group_fields_mandatory] CHECK  (([mandatory]='No' OR [mandatory]='Yes' OR [mandatory] IS NULL))਀䜀伀 
ALTER TABLE [forms].[form_tag_group_fields] CHECK CONSTRAINT [CK_form_tag_group_fields_mandatory]਀䜀伀 
ALTER TABLE [user_restr].[authoriser_privilege_requests]  WITH CHECK ADD  CONSTRAINT [CK_authoriser_privilege_requests_status_check] CHECK  (([status]='Pending' OR [status]='Approved' OR [status]='Cancelled'))਀䜀伀 
ALTER TABLE [user_restr].[authoriser_privilege_requests] CHECK CONSTRAINT [CK_authoriser_privilege_requests_status_check]਀䜀伀 
ALTER TABLE [user_restr].[authoriser_privilege_requests]  WITH CHECK ADD  CONSTRAINT [CK_authoriser_privilege_requests_type_check] CHECK  (([type]='Grant' OR [type]='Revoke'))਀䜀伀 
ALTER TABLE [user_restr].[authoriser_privilege_requests] CHECK CONSTRAINT [CK_authoriser_privilege_requests_type_check]਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_AUTHORISE_contr_dc_grp_usr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 琀漀 愀甀琀栀漀爀椀猀攀 愀 甀猀攀爀 
-- to edit documents in a controller level document group. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- the controller level document group id and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_AUTHORISE_contr_dc_grp_usr] ਀ 
     @contr_doc_ed_grp_name_id bigint = NULL,  -- Controller level document group ਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @inputnotes nvarchar(max)        = '',    -- Notes for the doc group entry਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  SET @transaction_status = 'Transaction not attempted';਀ऀ 
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check if a sid_id has been supplied਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 　 
		    SET @user_sid_id = NULL;਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoUserSidID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		     ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀         䔀䰀匀䔀  
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 猀椀搀开椀搀 攀砀椀猀琀猀 
				  				  FROM user_restr.sid_list ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀  
					   BEGIN਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					   END਀                  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 猀椀搀 椀猀 渀漀琀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 猀椀搀 
				               FROM user_restr.sid_list AS sl਀                              圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
							        AND sl.sid_id = @user_sid_id)਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀昀䄀甀琀栀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelfAuth.');਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀一䐀 
		   END਀ 
		   -- Check the controller level document group਀ऀ     䤀䘀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 　 
		    SET @contr_doc_ed_grp_name_id = NULL;਀ऀऀ 䤀䘀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoConDocGroup', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀渀䐀漀挀䜀爀漀甀瀀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the document group exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
				                  FROM xref.controller_doc_group_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ConDocGpNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀渀䐀漀挀䜀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ    䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF EXISTS (SELECT controller_doc_group_name_id, sid_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀  
						 WHERE controller_doc_group_name_id = @contr_doc_ed_grp_name_id਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'RecordExists', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   
	  BEGIN TRANSACTION;਀ 
	     INSERT INTO user_restr.controller_doc_group_sid_links਀ऀऀ             ⠀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀Ⰰ     猀椀搀开椀搀Ⰰ       渀漀琀攀猀Ⰰ 最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@contr_doc_ed_grp_name_id,  @user_sid_id, @inputnotes, @username); ਀ 
਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开挀漀渀琀爀开昀氀开最爀瀀开甀猀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record for user_restr.controller_file_grp_sid_links ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- the controller level file group id and notes.   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_AUTHORISE_contr_fl_grp_usr] ਀ 
     @contr_file_ed_grp_name_id bigint = NULL,  -- File group ਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @inputnotes nvarchar(max)         = '',    -- Notes for the file group entry਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  SET @transaction_status = 'Transaction not attempted';਀ऀ 
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check if a sid_id has been supplied਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 　 
		    SET @user_sid_id = NULL;਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoUserSidID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		     ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀         䔀䰀匀䔀  
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 猀椀搀开椀搀 攀砀椀猀琀猀 
				  				  FROM user_restr.sid_list ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀  
					   BEGIN਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					   END਀                  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 猀椀搀 椀猀 渀漀琀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 猀椀搀 
				               FROM user_restr.sid_list AS sl਀                              圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
							        AND sl.sid_id = @user_sid_id)਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀昀䄀甀琀栀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelfAuth.');਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀一䐀 
		   END਀ 
		   -- Check the controller level file group਀ऀ     䤀䘀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 　 
		    SET @contr_file_ed_grp_name_id = NULL;਀ऀऀ 䤀䘀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoConFileGroup', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀渀䘀椀氀攀䜀爀漀甀瀀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the controller level file group exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
				                  FROM xref.controller_file_group_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ConFileGpNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀渀䘀椀氀攀䜀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ    䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		 IF EXISTS (SELECT controller_file_group_name_id, sid_id਀ऀऀऀऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀  
					 WHERE controller_file_group_name_id = @contr_file_ed_grp_name_id਀ऀऀऀऀ           䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'RecordExists', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @inputnotes IS NULL SET @inputnotes = '';਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   
	  BEGIN TRANSACTION;਀ 
	     INSERT INTO user_restr.controller_file_grp_sid_links਀ऀऀ             ⠀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀Ⰰ     猀椀搀开椀搀Ⰰ       渀漀琀攀猀Ⰰ 最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@contr_file_ed_grp_name_id,  @user_sid_id, @inputnotes, @username);  ਀ऀ    
	   COMMIT TRANSACTION਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开搀漀挀开最爀漀甀瀀开瘀椀攀眀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into user_restr.doc_group_view_permissions to authorise a user਀ⴀⴀ 琀漀 瘀椀攀眀 愀 爀攀猀琀爀椀挀琀攀搀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀  
-- Input is the sid_id of the user from the sid_list table, ਀ⴀⴀ 琀栀攀 瘀椀攀眀攀爀 最爀漀甀瀀 椀搀 愀渀搀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开搀漀挀开最爀漀甀瀀开瘀椀攀眀攀爀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @user_sid_id bigint              = NULL,  -- User sid_id from the sid_list table਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 搀漀挀 最爀漀甀瀀 攀渀琀爀礀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
	਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 猀椀搀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT sid_id 	     -- Check sid_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								 WHERE sid_id = @user_sid_id) ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @user_sid_id), 'NULL'), ' | ', @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserIdNotExist.');਀ऀऀऀऀऀ   䔀一䐀 
                  IF EXISTS (SELECT sid -- Check that the supplied sid is not the same as the connected user sid਀ऀऀऀऀ               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                              WHERE sl.sid = @connectedusersid ਀ऀऀऀऀऀऀऀ        䄀一䐀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
					   BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'SelfAuth', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀昀䄀甀琀栀⸀✀⤀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END਀ऀऀ   䔀一䐀 
	     IF @docgroupid = 0਀ऀऀ    匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		 IF @docgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupId.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT doc_group_id਀ऀऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE doc_group_id = @docgroupid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀漀挀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
			            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocGroupIdNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀Ⰰ 猀椀搀开椀搀 
				   	      FROM user_restr.doc_group_view_permissions ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						       AND sid_id = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  ਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 
		             (doc_group_id, sid_id,       notes,       granted_by)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀最爀漀甀瀀椀搀Ⰰ  䀀甀猀攀爀开猀椀搀开椀搀Ⰰ 䀀椀渀瀀甀琀渀漀琀攀猀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀  
਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into user_restr.form_group_owners to authorise a user as a form owner਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- the form group id and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_AUTHORISE_form_group_owner] ਀ 
     @formgroupid bigint              = NULL,  -- Form group to grant ownership of਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @inputnotes nvarchar(max)        = '',    -- Notes for the form group owner entry਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted'; ਀   
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀ 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT sid_id 	     -- Check sid_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								 WHERE sid_id = @user_sid_id) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @user_sid_id), 'NULL'), ' | ', @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserIdNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		   END਀ 
	     IF @formgroupid = 0਀ऀऀ    匀䔀吀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		 IF @formgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀䜀爀漀甀瀀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormGroupID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀漀爀洀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT form_group_id਀ऀऀऀऀ                  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE form_group_id = @formgroupid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀洀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar(10), @formgroupid), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
				        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FmGNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀Ⰰ 猀椀搀开椀搀 
				   	      FROM user_restr.form_group_owners ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
						       AND sid_id = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   ਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 
		             (form_group_id, sid_id,                  notes, granted_by)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀最爀漀甀瀀椀搀Ⰰ  䀀甀猀攀爀开猀椀搀开椀搀Ⰰ      䀀椀渀瀀甀琀渀漀琀攀猀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀  
਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开甀猀攀爀开爀漀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into user_restr.user_role_link਀ⴀⴀ 琀漀 愀甀琀栀漀爀椀猀攀 愀 甀猀攀爀 昀漀爀 愀 瀀愀爀琀椀挀甀氀愀爀 爀漀氀攀⸀ 
-- Input is the sid_id of the user from the sid_list table, ਀ⴀⴀ 愀渀搀 琀栀攀 爀漀氀攀⸀   
-- Output is a status message and a transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开甀猀攀爀开爀漀氀攀崀  
਀     䀀爀漀氀攀开琀漀开愀搀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 ✀✀Ⰰ    ⴀⴀ 刀漀氀攀 琀漀 最爀愀渀琀 琀漀 琀栀攀 渀攀眀 甀猀攀爀 
	 @new_user_sid_id bigint          = NULL,  -- User sid_id from the sid_list table਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission')਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	     -- Check sid_id exists਀ऀऀ 䤀䘀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀 㴀 　 
		    SET @new_user_sid_id = NULL;਀ऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀  
				  	      FROM user_restr.sid_list ਀ऀऀऀऀऀ     圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀⤀  
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
            IF EXISTS (SELECT sid -- Check that the supplied sid is not the same as the connected user sid਀ऀऀऀऀ        䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                        WHERE sl.sid = @connectedusersid ਀ऀऀऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀开椀搀 㴀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'SelfAuth', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀昀䄀甀琀栀⸀✀⤀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
        -- Check the role exists਀ऀ     䤀䘀 䀀爀漀氀攀开琀漀开愀搀搀 㴀 ✀✀ 
		    SET @role_to_add = NULL;਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀漀氀攀开渀愀洀攀 
		                  FROM user_restr.role_list ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀漀氀攀开渀愀洀攀 㴀 䀀爀漀氀攀开琀漀开愀搀搀⤀ 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RoleNotExist', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀爀漀氀攀开琀漀开愀搀搀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀漀氀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
਀ऀऀ   䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF EXISTS (SELECT role_name, sid_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀  
						 WHERE role_name = @role_to_add਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀 㴀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'RecordExists', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    
	   BEGIN TRANSACTION;਀ 
	     INSERT INTO user_restr.user_role_link (role_name,     sid_id,         granted_by)਀ऀऀ      嘀䄀䰀唀䔀匀                           ⠀䀀爀漀氀攀开琀漀开愀搀搀Ⰰ 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀  
਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ   
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a controller level document edit group name  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀  
਀     䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀  戀椀最椀渀琀   㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)			 = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ऀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀     ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			 IF NOT EXISTS (SELECT controller_doc_group_name_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀  
						     WHERE    controller_doc_group_name_id ਀ऀऀऀऀऀऀऀ       㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  BEGIN TRANSACTION;਀ऀ   
	     DELETE ਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀   
		  WHERE   controller_doc_group_name_id ਀ऀऀ        㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀㬀 
਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_DEL_contr_doc_group_sid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀猀攀爀 最爀漀甀瀀 眀栀攀爀攀 椀渀搀椀瘀椀搀甀愀氀 甀猀攀爀猀 
-- are added at the Active Directory level.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 愀渀搀  
-- the controller level document group id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_DEL_contr_doc_group_sid] ਀ 
     @contr_doc_ed_grp_name_id bigint = NULL,  -- Controller level document group ਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
	਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 猀椀搀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT sid_id 	     -- Check sid_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								 WHERE sid_id = @user_sid_id) ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @user_sid_id), 'NULL'), ' | ', @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserIdNotExist.');਀ऀऀऀऀऀ   䔀一䐀 
                  IF EXISTS (SELECT sid -- Check that the supplied sid is not the same as the connected user sid਀ऀऀऀऀ               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                              WHERE sl.sid = @connectedusersid ਀ऀऀऀऀऀऀऀ        䄀一䐀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
					   BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'SelfAuth', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀昀䄀甀琀栀⸀✀⤀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END਀ऀऀ   䔀一䐀 
਀ऀऀ   ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	     IF @contr_doc_ed_grp_name_id = 0਀ऀऀ    匀䔀吀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @contr_doc_ed_grp_name_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䌀漀渀䐀漀挀䜀爀漀甀瀀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoConDocGroup.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT controller_doc_group_name_id਀ऀऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE controller_doc_group_name_id = @contr_doc_ed_grp_name_id)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀渀䐀漀挀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar(10), @contr_doc_ed_grp_name_id), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
			            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ConDocGpNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
      -- Check if the record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀Ⰰ 猀椀搀开椀搀 
				   	          FROM user_restr.controller_doc_group_sid_links ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 
						           AND sid_id = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   
	  BEGIN TRANSACTION;਀ 
	  INSERT INTO user_restr.user_privilege_revoke_log -- Create an audit log entry਀ऀ              ⠀瀀爀椀瘀椀氀攀最攀Ⰰ 瀀爀椀瘀椀氀攀最攀开渀愀洀攀Ⰰ 猀椀搀开椀搀Ⰰ 甀猀攀爀渀愀洀攀Ⰰ 最爀愀渀琀攀搀开漀渀Ⰰ 最爀愀渀琀攀搀开戀礀Ⰰ 爀攀瘀漀欀攀搀开戀礀⤀ 
	       VALUES ('Controller Document Group',਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀 䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 
				                   WHERE controller_doc_group_name_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ 㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀⤀Ⰰ 
		          @user_sid_id,਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
		          (SELECT created FROM user_restr.controller_doc_group_sid_links਀ऀऀऀऀ                 圀䠀䔀刀䔀  挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀   
								 		= @contr_doc_ed_grp_name_id਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀     猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 最爀愀渀琀攀搀开戀礀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 
				                    WHERE  controller_doc_group_name_id  ਀ऀऀऀऀऀऀऀऀऀऀ  㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 
										  AND     sid_id ਀ऀऀऀऀऀऀऀऀऀऀ  㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
				  @username)਀ 
	    DELETE FROM user_restr.controller_doc_group_sid_links਀ऀऀ      圀䠀䔀刀䔀  挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀   
		            = @contr_doc_ed_grp_name_id਀ऀऀ            䄀一䐀     猀椀搀开椀搀  
				    = @user_sid_id; ਀ 
         COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀           䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_DEL_contr_file_group_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 攀搀椀琀 最爀漀甀瀀 渀愀洀攀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_DEL_contr_file_group_name] ਀ 
     @contr_file_ed_grp_name_id  bigint  = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ऀऀऀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)	 = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
     -- Check if a matching record does not exist਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
				   	          FROM xref.controller_file_group_names ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀    挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀  
							       = @contr_file_ed_grp_name_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
 END -- END IF @userauthentication_status = 'Pass' ਀ 
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     䐀䔀䰀䔀吀䔀  
		   FROM xref.controller_file_group_names  ਀ऀऀ  圀䠀䔀刀䔀   挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀  
		        = @contr_file_ed_grp_name_id;਀ 
		COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_DEL_contr_file_group_sid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀漀爀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀  
-- Input is the sid_id of the user from the sid_list table਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_DEL_contr_file_group_sid] ਀ 
     @contr_file_ed_grp_name_id bigint = NULL,  -- File group ਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
	਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 猀椀搀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT sid_id 	     -- Check sid_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								 WHERE sid_id = @user_sid_id) ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @user_sid_id), 'NULL'), ' | ', @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserIdNotExist.');਀ऀऀऀऀऀ   䔀一䐀 
                  IF EXISTS (SELECT sid -- Check that the supplied sid is not the same as the connected user sid਀ऀऀऀऀ               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                              WHERE sl.sid = @connectedusersid ਀ऀऀऀऀऀऀऀ        䄀一䐀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
					   BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'SelfAuth', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀昀䄀甀琀栀⸀✀⤀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END਀ऀऀ   䔀一䐀 
਀ऀऀ   ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 
	     IF @contr_file_ed_grp_name_id = 0਀ऀऀ    匀䔀吀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @contr_file_ed_grp_name_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䌀漀渀䘀椀氀攀䜀爀漀甀瀀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoConFileGroup.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT controller_file_group_name_id਀ऀऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE controller_file_group_name_id = @contr_file_ed_grp_name_id)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀渀䘀椀氀攀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar(10), @contr_file_ed_grp_name_id), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
			            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ConFileGpNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
      -- Check if the record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀Ⰰ 猀椀搀开椀搀 
				   	      FROM user_restr.controller_file_grp_sid_links ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 
						       AND sid_id = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀✀Ⰰ 
		          (SELECT attr_name FROM xref.controller_file_group_names਀ऀऀऀऀ                   圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀   
								 		= @contr_file_ed_grp_name_id),਀ऀऀ          䀀甀猀攀爀开猀椀搀开椀搀Ⰰ 
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 
				                 WHERE  controller_file_group_name_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 
										AND     sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
		          (SELECT granted_by FROM user_restr.controller_file_grp_sid_links਀ऀऀऀऀ                圀䠀䔀刀䔀  挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀   
										= @contr_file_ed_grp_name_id਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀     猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀऀऀ  䀀甀猀攀爀渀愀洀攀⤀ 
਀ 
	     DELETE FROM user_restr.controller_file_grp_sid_links਀ऀऀऀ   圀䠀䔀刀䔀    挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀   
		             = @contr_file_ed_grp_name_id਀ऀऀ             䄀一䐀     猀椀搀开椀搀  
				     = @user_sid_id;  ਀  
       COMMIT TRANSACTION;਀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最爀漀甀瀀开瘀椀攀眀攀爀开瀀攀爀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a doc group permission record.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 愀渀搀  
-- the document group id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_DEL_doc_group_viewer_perm] ਀ 
     @docgroupid bigint               = NULL,  -- Form group to delete ownership of਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀ 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			 IF NOT EXISTS (SELECT doc_group_id, sid_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀  
					    	 WHERE         doc_group_id = @docgroupid਀ऀऀऀऀऀऀ           䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ 
       -- Do not permit the last user to be removed unless there are no documents linked to the gruop਀ऀ   ⴀⴀ 伀琀栀攀爀眀椀猀攀 爀攀洀漀瘀椀渀最 琀栀攀 氀愀猀琀 甀猀攀爀 眀椀氀氀 爀攀渀搀攀爀 愀氀氀 琀栀攀 瀀爀攀瘀椀漀甀猀氀礀ⴀ爀攀猀琀爀椀挀琀攀搀 搀漀挀甀洀攀渀琀猀 椀渀 琀栀攀 最爀漀甀瀀 瘀椀猀椀戀氀攀 琀漀 愀氀氀 甀猀攀爀猀⸀   
	   IF @data_validation_status = 'Pass'਀ऀ      䈀䔀䜀䤀一 
		  -- Check if number of linked users is 1਀ऀऀऀ䤀䘀 ⠀ 
				(SELECT COUNT(*)਀ऀऀऀऀ䘀刀伀䴀 ⠀ 
					SELECT TOP (2) 1 AS col਀ऀऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 
				) AS t਀ऀऀऀ⤀ 㴀 ㄀ ⤀ 
਀ऀऀऀ䄀一䐀  ⴀⴀ 䌀栀攀挀欀 椀昀 渀甀洀戀攀爀 漀昀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀猀 椀猀 㸀 　 
			 (਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀 䌀伀唀一吀⠀⨀⤀ 
				FROM (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 吀伀倀 ⠀㈀⤀ ㄀ 䄀匀 挀漀氀 
					FROM xref.doc_group_links AS dgl਀ऀऀऀऀऀ圀䠀䔀刀䔀 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
				) AS t਀ऀऀऀऀ 
			) > 0 )਀ 
			  BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'LastDocGrpViewer', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䰀愀猀琀䐀漀挀䜀爀瀀嘀椀攀眀攀爀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			  END਀ऀऀ  䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  BEGIN TRANSACTION;਀ 
	  INSERT INTO user_restr.user_privilege_revoke_log -- Create an audit log entry਀ऀ              ⠀瀀爀椀瘀椀氀攀最攀Ⰰ 瀀爀椀瘀椀氀攀最攀开渀愀洀攀Ⰰ 猀椀搀开椀搀Ⰰ 甀猀攀爀渀愀洀攀Ⰰ 最爀愀渀琀攀搀开漀渀Ⰰ 最爀愀渀琀攀搀开戀礀Ⰰ 爀攀瘀漀欀攀搀开戀礀⤀ 
	       VALUES ('Document Group',਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀 䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 
				                   WHERE doc_group_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ 
		          @user_sid_id,਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
		          (SELECT created FROM user_restr.doc_group_view_permissions਀ऀऀऀऀ                 圀䠀䔀刀䔀  搀漀挀开最爀漀甀瀀开椀搀   
								 		= @docgroupid਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀     猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 最爀愀渀琀攀搀开戀礀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 
				                 WHERE  doc_group_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀搀漀挀最爀漀甀瀀椀搀 
										AND     sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
				  @username)਀ 
਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 
               WHERE     doc_group_id = @docgroupid਀ऀऀऀ         䄀一䐀       猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀㬀  
 ਀ऀऀ䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀           䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a form group owner record.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 愀渀搀  
-- the form group id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_DEL_form_group_owner] ਀ 
     @formgroupid bigint              = NULL,  -- Form group to delete ownership of਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  SET @transaction_status = 'Transaction not attempted';  -- Parameters which have not been explicitly set might be output as null to calling functions਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			 IF NOT EXISTS (SELECT form_group_id, sid_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀  
					    	 WHERE         form_group_id = @formgroupid਀ऀऀऀऀऀऀ           䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀䘀漀爀洀 䜀爀漀甀瀀 伀眀渀攀爀✀Ⰰ 
		          (SELECT attr_name FROM forms.form_group_names਀ऀऀऀऀ                   圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀   
								 		= @formgroupid),਀ऀऀ          䀀甀猀攀爀开猀椀搀开椀搀Ⰰ 
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 
				                 WHERE  form_group_id  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
										AND     sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ 
		          (SELECT granted_by FROM user_restr.form_group_owners਀ऀऀऀऀ                 圀䠀䔀刀䔀  昀漀爀洀开最爀漀甀瀀开椀搀   
								 		= @formgroupid਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀     猀椀搀开椀搀  
										= @user_sid_id),਀ऀऀऀऀ  䀀甀猀攀爀渀愀洀攀⤀ 
਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 
               WHERE     form_group_id = @formgroupid਀ऀऀऀ         䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀㬀  
਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开猀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Revokes a uses from the system by replacing the sid with a unique but invalid value.  ਀ⴀⴀ 吀栀攀 甀猀攀爀 挀愀渀 戀攀 爀攀猀琀漀爀攀搀 戀礀 挀漀瀀礀椀渀最 琀栀攀 猀椀搀 戀愀挀欀 昀爀漀洀 猀椀搀开爀攀猀琀漀爀攀⸀  
-- Input is the SID ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_DEL_sid] ਀ 
     @sidrecordid bigint               = NULL,    -- SID ID record number (not the SID)਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀             㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)      = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@nopermissionmessage nvarchar(200)     = '',     -- Communicates that the user does not have the required permission਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@isauthorisermessage nvarchar(200)     = '',     -- Communicates that the user is an authoriser and cannot be deleted via this procedure.਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)       = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transactionmessage2 nvarchar(200)     = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀           㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)      = 'Pass';਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = @username + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀椀搀 椀猀 瘀愀氀椀搀 
		 IF @sidrecordid = 0਀ऀऀ    匀䔀吀 䀀猀椀搀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		 IF NOT EXISTS (SELECT sid_id ਀ऀऀऀऀ  ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
					     WHERE sid_id = @sidrecordid) ਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @recordnotexistsmessage = ISNULL(CONVERT(nvarchar, @sidrecordid), 'NULL') + '  ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @recordnotexistsmessage = 'A database level message error occurred on UserIdNotExist';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀       ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀愀琀 琀栀攀 猀椀搀  椀猀 瘀愀氀椀搀 
਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 猀椀搀 椀猀 愀猀猀椀最渀攀搀 愀 爀漀氀攀 愀猀 愀甀琀栀漀爀椀猀攀爀⸀   
       IF EXISTS (SELECT authoriser_sid_id਀ऀ                䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 
				   WHERE authoriser_sid_id = @sidrecordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀猀䄀甀琀栀漀爀椀猀攀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @isauthorisermessage = ISNULL(CONVERT(nvarchar, @sidrecordid), 'NULL') + '  ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @isauthorisermessage = 'A database level message error occurred on IsAuthoriser';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀氀爀攀愀搀礀 搀攀ⴀ愀挀琀椀瘀愀琀攀搀⸀ 
      IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		 IF EXISTS (SELECT sid_id ਀ऀऀऀ ऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
				     WHERE sid_id = @sidrecordid਀ऀऀऀऀऀ   䄀一䐀 猀椀搀 㴀 　⤀  
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'UserDeactivated', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䐀攀愀挀琀椀瘀愀琀攀搀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ䔀一䐀 
਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀匀䤀䐀✀Ⰰ     ✀匀䤀䐀 刀攀瘀漀欀攀搀✀Ⰰ       䀀猀椀搀爀攀挀漀爀搀椀搀Ⰰ  
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @sidrecordid),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ 
				  '',਀ऀऀऀऀ  䀀甀猀攀爀渀愀洀攀⤀ 
਀ 
			UPDATE user_restr.sid_list਀ऀऀऀ匀䔀吀 猀椀搀 㴀 
				-- Invalid SID on purpose, but must be unique:਀ऀऀऀऀⴀⴀ 刀攀瘀椀猀椀漀渀 㴀 　砀　　  ⠀椀渀瘀愀氀椀搀Ⰰ 洀甀猀琀 戀攀 ㄀⤀ 
				-- SubAuthorityCount = 0x01਀ऀऀऀऀⴀⴀ 䤀搀攀渀琀椀昀椀攀爀䄀甀琀栀漀爀椀琀礀 㴀 一唀䰀䰀 ⠀　砀　　　　　　　　　　　　⤀ 
				-- SubAuthority[0] = sid_id (ensures uniqueness)਀ऀऀऀऀ　砀　　                                   ⴀⴀ 刀攀瘀椀猀椀漀渀 ⠀椀渀瘀愀氀椀搀⤀ 
			  + 0x01                                   -- SubAuthority count਀ऀऀऀ  ⬀ 　砀　　　　　　　　　　　　                         ⴀⴀ 一唀䰀䰀 椀搀攀渀琀椀昀椀攀爀 愀甀琀栀漀爀椀琀礀 ⠀椀渀瘀愀氀椀搀⤀ 
			  + CAST(sid_id AS BINARY(4))              -- Unique payload਀ऀऀऀ圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀㬀 
਀ऀ    䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@recordnotexistsmessage <> '')     SET @message = @message + ' | ' + @recordnotexistsmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀椀猀愀甀琀栀漀爀椀猀攀爀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀愀甀琀栀漀爀椀猀攀爀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开甀猀攀爀开爀漀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from user_restr.user_role_link਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 甀猀攀爀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ  
-- and the role.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_DEL_user_role] ਀ 
     @role_to_delete nvarchar(50)     = '',    -- Role to revoke਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀    㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)     = '',     -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀 瀀攀爀洀椀猀猀椀漀渀 
		@recordnotexistmessage nvarchar(200) = '',   -- Communicates that a the record does not exist਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
      -- Check if a matching record does not exist਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀漀氀攀开渀愀洀攀Ⰰ 猀椀搀开椀搀 
				   	      FROM user_restr.user_role_link ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀漀氀攀开渀愀洀攀 㴀 䀀爀漀氀攀开琀漀开搀攀氀攀琀攀 
						       AND sid_id = @user_sid_id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @recordnotexistmessage =  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @recordnotexistmessage = 'A database level message error occurred on NotExist';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  BEGIN TRANSACTION;਀ 
	  INSERT INTO user_restr.user_privilege_revoke_log -- Create an audit log entry਀ऀ              ⠀瀀爀椀瘀椀氀攀最攀Ⰰ 瀀爀椀瘀椀氀攀最攀开渀愀洀攀Ⰰ 猀椀搀开椀搀Ⰰ 甀猀攀爀渀愀洀攀Ⰰ 最爀愀渀琀攀搀开漀渀Ⰰ 最爀愀渀琀攀搀开戀礀Ⰰ 爀攀瘀漀欀攀搀开戀礀⤀ 
	       VALUES ('User Role',਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 爀漀氀攀开渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 
				                   WHERE   role_name  ਀ऀऀऀऀऀऀऀऀ ऀऀ㴀 䀀爀漀氀攀开琀漀开搀攀氀攀琀攀 
										AND sid_id ਀ऀऀऀऀऀऀऀऀऀऀ 㴀 䀀甀猀攀爀开猀椀搀开椀搀开琀漀开搀攀氀攀琀攀⤀Ⰰ 
		           @user_sid_id_to_delete,਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 甀猀攀爀渀愀洀攀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				                  WHERE         sid_id ਀ऀऀऀऀऀऀऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀开琀漀开搀攀氀攀琀攀⤀Ⰰ 
		          (SELECT created FROM user_restr.user_role_link ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀   爀漀氀攀开渀愀洀攀   
								       = @role_to_delete ਀ऀऀऀऀऀऀऀऀऀऀ䄀一䐀 猀椀搀开椀搀  
										 = @user_sid_id_to_delete),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 最爀愀渀琀攀搀开戀礀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀  
								 WHERE   role_name  ਀ऀऀऀऀऀऀऀऀ       㴀 䀀爀漀氀攀开琀漀开搀攀氀攀琀攀  
										AND sid_id ਀ऀऀऀऀऀऀऀऀऀऀ 㴀 䀀甀猀攀爀开猀椀搀开椀搀开琀漀开搀攀氀攀琀攀⤀Ⰰ 
				  @username)਀ 
਀ऀ     䐀䔀䰀䔀吀䔀  
		   FROM user_restr.user_role_link ਀ऀऀ  圀䠀䔀刀䔀 爀漀氀攀开渀愀洀攀  㴀 䀀爀漀氀攀开琀漀开搀攀氀攀琀攀  
		        AND sid_id = @user_sid_id_to_delete; ਀ 
       COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document controller document group name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀⸀ 
-- Input is the paramters for a field name:਀ⴀⴀ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀⸀   
-- Output is a status message, a transaction status and the id of the new record.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_INS_contr_doc_group_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @attribute_name = ''਀ऀऀ匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 			 FROM xref.controller_doc_group_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @tempmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀  
		             (mnem,      attr_name,       descr)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀⤀㬀  
	  ਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_INS_contr_file_group_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 挀漀渀琀爀漀氀氀攀爀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀 
-- by inserting a record into xref.controller_file_group_names.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀攀琀攀爀猀 昀漀爀 愀 昀椀攀氀搀 渀愀洀攀㨀 
-- mnemonic, name, description.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @attribute_name = ''਀ऀऀ匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 			 FROM xref.controller_file_group_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @tempmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  
		             (mnem,      attr_name,       descr)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀⤀㬀  
਀ऀ      匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䤀一匀开最爀愀渀琀开愀甀琀栀漀爀椀猀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Approves request for authoriser privileges.   ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开䤀一匀开最爀愀渀琀开愀甀琀栀漀爀椀猀攀爀崀  
਀ऀ 䀀爀攀焀甀攀猀琀开椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @user_sid_id bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ  ⴀⴀ 匀䤀䐀 䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ 
		@subject_sid varbinary(100)          = NULL, -- The SID of the user relating to the request . ਀ऀऀ䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㈀㠀⤀      㴀 ✀✀Ⰰ  ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 漀昀 琀栀攀 甀猀攀爀 琀漀 戀攀 最爀愀渀琀攀搀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀猀⸀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  
  SET @connectedusersid_id = (SELECT sl.sid_id ਀                                䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
							   WHERE sl.sid = @connectedusersid)਀   
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀ 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀऀ 䤀䘀 䀀爀攀焀甀攀猀琀开椀搀 㴀 　 
		    SET @request_id = NULL;਀ 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		਀ऀऀ 䤀䘀 䀀爀攀焀甀攀猀琀开椀搀 䤀匀 一唀䰀䰀 䄀一䐀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoSidNoRequ', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		     ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀一漀刀攀焀甀⸀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
		IF @user_sid_id IS NOT NULL  -- If a SID ID has been supplied then validate it. ਀ऀऀ  䈀䔀䜀䤀一 
		    IF NOT EXISTS (SELECT sid_id਀ऀऀऀ                䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
						   WHERE sid_id = @user_sid_id)਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀椀搀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SidIDNotExist.');਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀一䐀ऀऀऀऀ    
		  END਀ 
਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 䄀一䐀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
		  BEGIN਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀椀搀开椀搀 漀昀 琀栀攀 爀攀焀甀攀猀琀 椀猀 愀氀爀攀愀搀礀 椀渀 琀栀攀 氀椀猀琀 漀昀 愀甀琀栀漀爀椀猀攀爀猀⸀  
				    	 FROM user_restr.authorisers AS a						   ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'RecordExists', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀऀऀ   䔀䰀匀䔀 ⴀⴀ 䤀昀 椀琀 椀猀 渀漀琀 愀氀爀攀愀搀礀 椀渀 琀栀攀 氀椀猀琀 漀昀 愀甀琀栀漀爀椀猀攀爀猀Ⰰ 挀栀攀挀欀 琀栀愀琀 椀琀 椀猀 渀漀琀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 愀瀀瀀爀漀瘀攀爀⸀ 
				     BEGIN਀ऀऀऀऀऀ   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
					                FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀  
								         = @connectedusersid਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀开椀搀 
									     = @user_sid_id)਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀匀攀氀昀䄀甀琀栀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserSelfAuth.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								 SET @transaction_ready      = 'Fail';										 ਀ऀऀऀऀऀऀऀ䔀一䐀 
					 END਀ऀऀ   䔀一䐀 
਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀ    䤀䘀 䀀爀攀焀甀攀猀琀开椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
			  BEGIN -- If both request ID and sid_id are supplied then check if a record exists਀ऀऀऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 
				                 FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 愀瀀爀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
								  AND apr.request_id = @request_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀䜀爀愀渀琀✀ 
								  AND apr.status = 'Pending')਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								 SET @transaction_ready      = 'Fail';										 ਀ऀऀऀऀऀऀऀ䔀一䐀 
							ELSE  -- If a record does exist then check that the current approver is no the same as the first. ਀ऀऀऀऀऀऀऀ   䈀䔀䜀䤀一 
							     IF EXISTS (SELECT apr.approved_by_sid_id_1਀ऀऀऀऀऀऀऀऀ              䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
										     WHERE apr.request_id = @request_id਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀䜀爀愀渀琀✀ 
											   AND apr.status = 'Pending'਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀⤀ 
									BEGIN਀ऀऀऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
											  @message_id   = 'DuplApprover', ਀ऀऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
										 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
										 ELSE ਀ऀऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀甀瀀氀䄀瀀瀀爀漀瘀攀爀⸀✀⤀㬀 
										 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀ऀऀऀऀऀऀऀऀऀऀ  
									END					 ਀ऀऀऀऀऀऀऀ   䔀一䐀 
			  END਀ऀऀ  䔀一䐀 
਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀ    䤀䘀 䀀爀攀焀甀攀猀琀开椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一唀䰀䰀 
			  BEGIN -- If request ID is supplied then check if a record exists਀ऀऀऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 
				                 FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀 
								  AND apr.type = 'Grant'਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀ 
							BEGIN਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
								 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀ऀऀऀऀऀऀऀऀऀऀ  
							END਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  ⴀⴀ 䤀昀 愀 爀攀挀漀爀搀 搀漀攀猀 攀砀椀猀琀 琀栀攀渀 挀栀攀挀欀 琀栀愀琀 琀栀攀 挀甀爀爀攀渀琀 愀瀀瀀爀漀瘀攀爀 椀猀 渀漀琀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 昀椀爀猀琀⸀  
							   BEGIN਀ऀऀऀऀऀऀऀ     䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
								              FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀ     圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀 
											   AND apr.type = 'Grant'਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀ 
											   AND apr.approved_by_sid_id_1 = @connectedusersid_id)਀ऀऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
										 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀甀瀀氀䄀瀀瀀爀漀瘀攀爀✀Ⰰ  
											  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
											SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DuplApprover.');਀ऀऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
										 SET @transaction_ready      = 'Fail';										 ਀ऀऀऀऀऀऀऀऀऀ䔀一䐀ऀऀऀऀऀऀ  
							   END਀ऀऀऀ  䔀一䐀 
		  END਀ 
		IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
		    IF @request_id IS NULL AND @user_sid_id IS NOT NULL਀ऀऀऀ  䈀䔀䜀䤀一 ⴀⴀ 䤀昀 匀䤀䐀 䤀䐀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 挀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			    IF EXISTS (SELECT apr.request_id਀ऀऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
								WHERE apr.sid_id = @user_sid_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀䜀爀愀渀琀✀ 
								  AND apr.status = 'Pending')਀ऀऀऀऀऀ  ⴀⴀ 䤀昀 愀 爀攀挀漀爀搀 搀漀攀猀 攀砀椀猀琀 琀栀攀渀 挀栀攀挀欀 琀栀愀琀 琀栀攀 挀甀爀爀攀渀琀 愀瀀瀀爀漀瘀攀爀 椀猀 渀漀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 昀椀爀猀琀⸀  
							   BEGIN਀ 
							   SET @request_id = (SELECT TOP 1 apr.request_id਀ऀऀऀऀऀऀऀ                        䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
												   WHERE apr.sid_id = @user_sid_id਀ऀऀऀऀऀऀऀऀऀऀऀऀऀ 䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀䜀爀愀渀琀✀ 
													 AND apr.status = 'Pending')਀ 
							     IF EXISTS (SELECT apr.approved_by_sid_id_1਀ऀऀऀऀऀऀऀऀ              䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
										     WHERE apr.sid_id = @user_sid_id਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀䜀爀愀渀琀✀ 
											   AND apr.status = 'Pending'਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀⤀ 
									BEGIN਀ऀऀऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
											  @message_id   = 'DuplApprover', ਀ऀऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
										 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
										 ELSE ਀ऀऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀甀瀀氀䄀瀀瀀爀漀瘀攀爀⸀✀⤀㬀 
										 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀ऀऀऀऀऀऀऀऀऀऀ  
									END						 ਀ऀऀऀऀऀऀऀ   䔀一䐀 
			  END਀ऀऀ  䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  BEGIN TRANSACTION਀ 
		    IF @request_id IS NULL AND @user_sid_id IS NOT NULL਀ऀऀऀ  䈀䔀䜀䤀一 ⴀⴀ 䤀昀 猀椀搀开椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 挀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			  		-- Retrieve the username of the user to be granted the privileges.਀ऀऀऀऀऀ匀䔀吀 䀀猀甀戀樀攀挀琀开猀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
										FROM user_restr.sid_list as sl਀ऀऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
					SET @subject_username = ISNULL(SUSER_SNAME(@subject_sid), '');਀ऀऀऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀  ⴀⴀ 䤀昀 渀漀 爀攀挀漀爀搀 琀栀攀渀 挀爀攀愀琀攀 愀 渀攀眀 漀渀攀 愀渀搀 瀀漀瀀甀氀愀琀攀 愀瀀瀀爀漀瘀攀爀 ㄀ 
				                 FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 愀瀀爀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
								  AND apr.type = 'Grant'਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀ 
							BEGIN਀ऀऀऀऀऀऀऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 
							              (sid_id,       type,    username,         approved_by_sid_id_1, approved_by_username_1, approved_on_1, status)਀ऀऀऀऀऀऀऀऀ   嘀䄀䰀唀䔀匀 ⠀䀀甀猀攀爀开猀椀搀开椀搀Ⰰ ✀䜀爀愀渀琀✀Ⰰ 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀Ⰰ 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀Ⰰ 䀀甀猀攀爀渀愀洀攀Ⰰ              匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀Ⰰ ✀倀攀渀搀椀渀最✀⤀ 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀瀀瀀爀漀瘀攀爀㄀䌀漀洀瀀氀攀琀攀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage, @subject_username);਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Approver1Complete.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
							END਀ऀऀऀऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  唀瀀搀愀琀攀 椀琀 眀椀琀栀 愀瀀瀀爀漀瘀攀爀 ㈀⸀ 
					  BEGIN਀ऀऀऀऀऀ   唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 
					      SET approved_by_sid_id_2 = @connectedusersid_id,਀ऀऀऀऀऀऀ      愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㈀ 㴀 䀀甀猀攀爀渀愀洀攀Ⰰ 
						      approved_on_2 = SYSDATETIME(),਀ऀऀऀऀऀऀ      猀琀愀琀甀猀 㴀 ✀䄀瀀瀀爀漀瘀攀搀✀ 
					    WHERE sid_id = @user_sid_id਀ऀऀऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开愀甀琀栀漀爀椀猀攀爀 
						       @grant_request_id = @request_id,਀ऀऀऀऀऀऀऀ   䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						  IF @tempmessage = 'Pass'਀ऀऀऀऀऀऀ    䈀䔀䜀䤀一 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage, @subject_username, 'Authoriser privileges granted');਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		                   END਀ऀऀऀऀऀऀ   䔀䰀匀䔀 
								BEGIN਀ऀऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										  @message_id   = 'ApprovalFailed', ਀ऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									 ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀⸀✀⤀㬀 
									 SET @transaction_status = 'Bad';਀ऀऀऀऀऀऀऀ   䔀一䐀ऀऀऀऀऀऀ    
					  END਀ऀऀऀ  䔀一䐀 
			  ELSE -- A record exists and is referred to by @request_id.  Populate approver 2. ਀ऀऀऀ    䈀䔀䜀䤀一 
਀ऀऀऀऀऀ  匀䔀吀 䀀猀甀戀樀攀挀琀开猀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
											FROM user_restr.sid_list as sl਀ऀऀऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀 
																FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀⤀⤀ 
					  SET @subject_username = ISNULL(SUSER_SNAME(@subject_sid), '');਀ 
					   UPDATE user_restr.authoriser_privilege_requests਀ऀऀऀऀऀ      匀䔀吀 愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀ 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀Ⰰ 
						      approved_by_username_2 = @username,਀ऀऀऀऀऀऀ      愀瀀瀀爀漀瘀攀搀开漀渀开㈀ 㴀 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀Ⰰ 
						      status = 'Approved'਀ऀऀऀऀऀ    圀䠀䔀刀䔀 爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀 
਀ऀऀऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开愀甀琀栀漀爀椀猀攀爀 
						       @grant_request_id = @request_id,਀ऀऀऀऀऀऀऀ   䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						  IF @tempmessage = 'Pass'਀ऀऀऀऀऀऀ    䈀䔀䜀䤀一 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage, @subject_username, 'Authoriser privileges granted');਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		                   END਀ऀऀऀऀऀऀ   䔀䰀匀䔀 
								BEGIN਀ऀऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										  @message_id   = 'ApprovalFailed', ਀ऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									 ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀⸀✀⤀㬀 
									 SET @transaction_status = 'Bad';਀ऀऀऀऀऀऀऀ   䔀一䐀ऀऀ 
				END਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_INS_revoke_authoriser]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䄀瀀瀀爀漀瘀攀猀 爀攀焀甀攀猀琀 琀漀 爀攀瘀漀欀攀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀猀⸀    
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_INS_revoke_authoriser] ਀ 
	 @request_id bigint               = NULL,਀ऀ 䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@connectedusersid_id bigint          = NULL,  -- SID ID of the connected user. ਀ऀऀ䀀猀甀戀樀攀挀琀开猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀          㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 甀猀攀爀 爀攀氀愀琀椀渀最 琀漀 琀栀攀 爀攀焀甀攀猀琀 ⸀  
		@subject_username nvarchar(128)      = '',  -- The username of the user relating to the request. ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted'; ਀  匀䔀吀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀  
                                FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
  ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission')਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		 IF @request_id = 0਀ऀऀ    匀䔀吀 䀀爀攀焀甀攀猀琀开椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 　 
		    SET @user_sid_id = NULL;਀ऀऀ 
		 IF @request_id IS NULL AND @user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀匀椀搀一漀刀攀焀甀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSidNoRequ.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀऀ䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀  ⴀⴀ 䤀昀 愀 匀䤀䐀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 瘀愀氀椀搀愀琀攀 椀琀⸀  
		  BEGIN਀ऀऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
			                FROM user_restr.sid_list਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
					   BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'SidIDNotExist', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END				   ਀ऀऀ  䔀一䐀 
਀ 
		IF @data_validation_status = 'Pass' AND @user_sid_id IS NOT NULL਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT a.authoriser_sid_id 	     -- Check if the sid_id of the request is in the list of authorisers. ਀ऀऀऀऀ    ऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀ऀऀऀऀऀऀ    
						 WHERE a.authoriser_sid_id = @user_sid_id) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
				   ELSE -- If it is already in the list of authorisers, check that it is not the same as the approver.਀ऀऀऀऀ        ⴀⴀ 匀攀氀昀 爀攀瘀漀欀椀渀最 挀愀渀 爀攀猀甀氀琀 椀渀 琀栀攀 渀甀洀戀攀爀 漀昀 愀甀琀栀漀爀椀猀攀爀猀 昀愀氀氀椀渀最 戀攀氀漀眀 琀眀漀Ⰰ 爀攀猀甀氀琀椀渀最 椀渀 琀栀攀 渀攀攀搀 昀漀爀 搀戀愀 
						-- support to re-bootstrap the authorisers structure.਀ऀऀऀऀ     䈀䔀䜀䤀一 
					   IF EXISTS (SELECT sl.sid_id਀ऀऀऀऀऀ                䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
								   WHERE sl.sid ਀ऀऀऀऀऀऀऀऀ         㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
									 AND sl.sid_id਀ऀऀऀऀऀऀऀऀऀ     㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
							BEGIN਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'NoSelfRevoke', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀攀氀昀刀攀瘀漀欀攀⸀✀⤀㬀 
								 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀ऀऀऀऀऀऀऀऀऀऀ  
							END਀ऀऀऀऀऀ 䔀一䐀 
		   END਀ 
		IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
		    IF @request_id IS NOT NULL AND @user_sid_id IS NOT NULL਀ऀऀऀ  䈀䔀䜀䤀一 ⴀⴀ 䤀昀 戀漀琀栀 爀攀焀甀攀猀琀 䤀䐀 愀渀搀 猀椀搀开椀搀 愀爀攀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 挀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			    IF NOT EXISTS (SELECT apr.request_id਀ऀऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
								WHERE apr.sid_id = @user_sid_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀 
								  AND apr.type = 'Revoke'਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀ 
							BEGIN਀ऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								 ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
								 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀ऀऀऀऀऀऀऀऀऀऀ  
							END਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  ⴀⴀ 䤀昀 愀 爀攀挀漀爀搀 搀漀攀猀 攀砀椀猀琀 琀栀攀渀 挀栀攀挀欀 琀栀愀琀 琀栀攀 挀甀爀爀攀渀琀 愀瀀瀀爀漀瘀攀爀 椀猀 渀漀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 昀椀爀猀琀⸀  
							   BEGIN਀ऀऀऀऀऀऀऀ     䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
								              FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀ     圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀 
											   AND apr.type = 'Revoke'਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀ 
											   AND apr.approved_by_sid_id_1 = @connectedusersid_id)਀ऀऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
										 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀甀瀀氀䄀瀀瀀爀漀瘀攀爀✀Ⰰ  
											  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
											SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DuplApprover.');਀ऀऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
										 SET @transaction_ready      = 'Fail';										 ਀ऀऀऀऀऀऀऀऀऀ䔀一䐀ऀऀऀऀऀ  
							   END਀ऀऀऀ  䔀一䐀 
		  END਀ 
		IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
		    IF @request_id IS NOT NULL AND @user_sid_id IS NULL਀ऀऀऀ  䈀䔀䜀䤀一 ⴀⴀ 䤀昀 爀攀焀甀攀猀琀 䤀䐀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 挀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			    IF NOT EXISTS (SELECT apr.request_id਀ऀऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
								WHERE apr.request_id = @request_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀刀攀瘀漀欀攀✀ 
								  AND apr.status = 'Pending')਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								 SET @transaction_ready      = 'Fail';										 ਀ऀऀऀऀऀऀऀ䔀一䐀 
							ELSE  -- If a record does exist then check that the current approver is no the same as the first. ਀ऀऀऀऀऀऀऀ   䈀䔀䜀䤀一 
							     IF EXISTS (SELECT apr.approved_by_sid_id_1਀ऀऀऀऀऀऀऀऀ              䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
										     WHERE apr.request_id = @request_id਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀琀礀瀀攀 㴀 ✀刀攀瘀漀欀攀✀ 
											   AND apr.status = 'Pending'਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀⤀ 
									BEGIN਀ऀऀऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
											  @message_id   = 'DuplApprover', ਀ऀऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
										 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
										 ELSE ਀ऀऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀甀瀀氀䄀瀀瀀爀漀瘀攀爀⸀✀⤀㬀 
										 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀ऀऀऀऀऀऀऀऀऀऀ  
									END						 ਀ऀऀऀऀऀऀऀ   䔀一䐀 
			  END਀ऀऀ  䔀一䐀 
਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀ    䤀䘀 䀀爀攀焀甀攀猀琀开椀搀 䤀匀 一唀䰀䰀 䄀一䐀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
			  BEGIN -- If SID ID is supplied then check if a record exists਀ऀऀऀ    䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 
				                 FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 愀瀀爀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
								  AND apr.type = 'Revoke'਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀ 
					  -- If a record does exist then check that the current approver is no the same as the first. ਀ऀऀऀऀऀऀऀ   䈀䔀䜀䤀一 
਀ऀऀऀऀऀऀऀ   匀䔀吀 䀀爀攀焀甀攀猀琀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 吀伀倀 ㄀ 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 
							                        FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 愀瀀爀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
													 AND apr.type = 'Revoke'਀ऀऀऀऀऀऀऀऀऀऀऀऀऀ 䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀ 
਀ऀऀऀऀऀऀऀ     䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
								              FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀ     圀䠀䔀刀䔀 愀瀀爀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
											   AND apr.type = 'Revoke'਀ऀऀऀऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀ 
											   AND apr.approved_by_sid_id_1 = @connectedusersid_id)਀ऀऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
										 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀甀瀀氀䄀瀀瀀爀漀瘀攀爀✀Ⰰ  
											  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
											SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DuplApprover.');਀ऀऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
										 SET @transaction_ready      = 'Fail';										 ਀ऀऀऀऀऀऀऀऀऀ䔀一䐀ऀऀऀऀऀऀ  
							   END਀ऀऀऀ  䔀一䐀 
		  END਀ 
਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀऀⴀⴀ 䌀栀攀挀欀 挀甀爀爀攀渀琀 渀甀洀戀攀爀 漀昀 愀甀琀栀漀爀椀猀攀爀猀 戀攀昀漀爀攀 瀀爀漀挀攀攀搀椀渀最 眀椀琀栀 爀攀瘀漀挀愀琀椀漀渀 
				-- Two authorisers are required to grant privileges to a new authoriser.  ਀ऀऀऀऀⴀⴀ 吀栀攀爀攀昀漀爀攀 椀昀 琀栀攀爀攀 愀爀攀 渀漀琀 琀眀漀 愀甀琀栀漀爀椀猀攀爀猀 琀栀攀渀 䐀䈀䄀 愀挀挀攀猀猀 椀猀 爀攀焀甀椀爀攀搀 琀漀 爀攀ⴀ戀漀漀琀猀琀爀愀瀀 琀栀攀 愀甀琀栀漀爀椀猀攀爀猀⸀  
				IF (SELECT COUNT(*) FROM user_restr.authorisers) <= 2਀ऀऀऀऀऀ䈀䔀䜀䤀一 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀漀漀䘀攀眀䄀甀琀栀漀爀椀猀攀爀猀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ 
						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀漀漀䘀攀眀䄀甀琀栀漀爀椀猀攀爀猀⸀✀⤀㬀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀ऀऀ 
					END਀ऀऀ  䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一 
਀ऀऀ    䤀䘀 䀀爀攀焀甀攀猀琀开椀搀 䤀匀 一唀䰀䰀 䄀一䐀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
			  BEGIN -- If sid_id is supplied then check if a record exists਀ऀऀऀऀऀऀऀ   ⴀⴀ 刀攀琀爀椀攀瘀攀 琀栀攀 甀猀攀爀渀愀洀攀 漀昀 琀栀攀 甀猀攀爀 爀攀氀愀琀攀搀 琀漀 琀栀攀 爀攀焀甀攀猀琀⸀ 
								SET @subject_sid = (SELECT sl.sid਀ऀऀऀऀऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 愀猀 猀氀 
													WHERE sl.sid_id = @user_sid_id)਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀 㴀 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀猀甀戀樀攀挀琀开猀椀搀⤀Ⰰ ✀✀⤀㬀 
਀ऀऀऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀  ⴀⴀ 䤀昀 渀漀 爀攀挀漀爀搀 琀栀攀渀 挀爀攀愀琀攀 愀 渀攀眀 漀渀攀 愀渀搀 瀀漀瀀甀氀愀琀攀 愀瀀瀀爀漀瘀攀爀 ㄀ 
				                 FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 愀瀀爀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀 
								  AND apr.type = 'Revoke'਀ऀऀऀऀऀऀऀऀ  䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀ 
							BEGIN਀ऀऀऀऀऀऀऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 
							              (sid_id,       type,    approved_by_sid_id_1, approved_by_username_1, approved_on_1, status)਀ऀऀऀऀऀऀऀऀ   嘀䄀䰀唀䔀匀 ⠀䀀甀猀攀爀开猀椀搀开椀搀Ⰰ ✀刀攀瘀漀欀攀✀Ⰰ 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀Ⰰ 䀀甀猀攀爀渀愀洀攀Ⰰ              匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀Ⰰ ✀倀攀渀搀椀渀最✀⤀ 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀瀀瀀爀漀瘀攀爀㄀䌀漀洀瀀氀攀琀攀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage, @subject_username);਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Approver1Complete.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
							END਀ऀऀऀऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  唀瀀搀愀琀攀 椀琀 眀椀琀栀 愀瀀瀀爀漀瘀攀爀 ㈀⸀ 
					  BEGIN਀ऀऀऀऀऀ   唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 
					      SET approved_by_sid_id_2 = @connectedusersid_id,਀ऀऀऀऀऀऀ      愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㈀ 㴀 䀀甀猀攀爀渀愀洀攀Ⰰ 
						      approved_on_2 = SYSDATETIME(),਀ऀऀऀऀऀऀ      猀琀愀琀甀猀 㴀 ✀䄀瀀瀀爀漀瘀攀搀✀ 
					    WHERE sid_id = @user_sid_id਀ऀऀऀऀऀऀ  䄀一䐀 琀礀瀀攀 㴀 ✀刀攀瘀漀欀攀✀ 
						  AND status = 'Pending'਀ऀऀऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开刀䔀嘀伀䬀䔀开愀甀琀栀漀爀椀猀攀爀 
						       @revoke_request_id = @request_id,਀ऀऀऀऀऀऀऀ   䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						  IF @tempmessage = 'Pass'਀ऀऀऀऀऀऀ    䈀䔀䜀䤀一 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage, @subject_username, 'Authoriser privilege revoked');਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		                   END਀ऀऀऀऀऀऀ   䔀䰀匀䔀 
								BEGIN਀ऀऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										  @message_id   = 'ApprovalFailed', ਀ऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									 ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀⸀✀⤀㬀 
									 SET @transaction_status = 'Bad';਀ऀऀऀऀऀऀऀ   䔀一䐀ऀऀऀऀऀऀ    
					  END਀ऀऀऀ  䔀一䐀 
			  ELSE -- A record exists and is referred to by @request_id.  Populate approver 2. ਀ऀऀऀ    䈀䔀䜀䤀一 
					 -- Retrieve the username of the user related to the request.਀ऀऀऀऀऀ  匀䔀吀 䀀猀甀戀樀攀挀琀开猀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
											FROM user_restr.sid_list as sl਀ऀऀऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀 
																FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀⤀⤀ 
					  SET @subject_username = ISNULL(SUSER_SNAME(@subject_sid), '');਀ 
					   UPDATE user_restr.authoriser_privilege_requests਀ऀऀऀऀऀ      匀䔀吀 愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀ 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀开椀搀Ⰰ 
						      approved_by_username_2 = @username,਀ऀऀऀऀऀऀ      愀瀀瀀爀漀瘀攀搀开漀渀开㈀ 㴀 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀Ⰰ 
						      status = 'Approved'਀ऀऀऀऀऀ    圀䠀䔀刀䔀 爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀 
਀ऀऀऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开刀䔀嘀伀䬀䔀开愀甀琀栀漀爀椀猀攀爀 
						       @revoke_request_id = @request_id,਀ऀऀऀऀऀऀऀ   䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						  IF @tempmessage = 'Pass'਀ऀऀऀऀऀऀ    䈀䔀䜀䤀一 
								 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
									  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage, @subject_username, 'Authoriser privilege revoked');਀ऀऀऀऀऀऀऀऀ 䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		                   END਀ऀऀऀऀऀऀ   䔀䰀匀䔀 
								BEGIN਀ऀऀऀऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										  @message_id   = 'ApprovalFailed', ਀ऀऀऀऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									 ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀瀀瀀爀漀瘀愀氀䘀愀椀氀攀搀⸀✀⤀㬀 
									 SET @transaction_status = 'Bad';਀ऀऀऀऀऀऀऀ   䔀一䐀ऀऀ 
				END਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_all_doc_group_names]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀   
-- Output is a table of document groups, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_all_doc_group_names] ਀ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT dgn.doc_group_id       AS 'Doc Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	            dgn.attr_name          AS 'Doc Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀  䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM xref.doc_group_names AS dgn਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀㬀 
	   SET @numrows = @@ROWCOUNT;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开最爀漀甀瀀开瘀椀攀眀攀爀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all document group owners  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 漀眀渀攀爀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开最爀漀甀瀀开瘀椀攀眀攀爀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT dgvp.sid_id            AS 'User ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀    䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
		        ISNULL(sl.username, '')    AS 'System Username',਀ ऀऀ        搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀      䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
	            dgn.attr_name          AS 'Doc Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最瘀瀀⸀渀漀琀攀猀Ⰰ ✀✀⤀ 䄀匀 ✀一漀琀攀猀✀Ⰰ 
                CONVERT(NVARCHAR(30), dgvp.created, 120) AS 'Created',਀ऀऀऀऀ搀最瘀瀀⸀最爀愀渀琀攀搀开戀礀        䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ 
		   FROM user_restr.doc_group_view_permissions AS dgvp਀ऀ 䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
	         ON  dgvp.doc_group_id਀ऀऀऀ    㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
	 INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一  搀最瘀瀀⸀猀椀搀开椀搀 
			    =  sl.sid_id਀ऀ   伀刀䐀䔀刀 䈀夀 ✀唀猀攀爀 䤀䐀✀㬀 
	   SET @numrows = @@ROWCOUNT;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_all_form_group_owners]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 昀漀爀洀 最爀漀甀瀀 漀眀渀攀爀猀   
-- Output is a table of form group owners, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_all_form_group_owners] ਀ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT fgo.sid_id            AS 'User ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀   䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
		        ISNULL(sl.username, '')    AS 'System Username',਀ ऀऀ        昀最漀⸀昀漀爀洀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
	            fgn.attr_name         AS 'Form Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最漀⸀渀漀琀攀猀Ⰰ ✀✀⤀ 䄀匀 ✀一漀琀攀猀✀Ⰰ 
				CONVERT(NVARCHAR(30), fgo.created, 120) AS 'Created',਀ऀऀऀऀ昀最漀⸀最爀愀渀琀攀搀开戀礀        䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                 䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ 
		   FROM user_restr.form_group_owners AS fgo਀ऀ 䤀一一䔀刀 䨀伀䤀一 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
	         ON   fgo.form_group_id਀ऀऀऀ    㴀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
	 INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一   昀最漀⸀猀椀搀开椀搀 
			    =  sl.sid_id਀ऀ   伀刀䐀䔀刀 䈀夀 ✀唀猀攀爀 䤀䐀✀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_all_user_roles]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_all_user_roles] ਀ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀 瀀攀爀洀椀猀猀椀漀渀 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = @username + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT role_name               AS 'Role Name', ਀ऀऀ        甀爀氀欀⸀猀椀搀开椀搀             䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ  
				ISNULL(sl.name, '')     AS 'Database Username',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				ISNULL(sl.descr, '')    AS 'Description',਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 甀爀氀欀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				urlk.granted_by         AS 'Granted By'        ਀ऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 䄀匀 甀爀氀欀 
     INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一 猀氀⸀猀椀搀开椀搀  
		    = urlk.sid_id਀ऀ   伀刀䐀䔀刀 䈀夀 ✀唀猀攀爀 䤀䐀✀㬀 
	   SET @numrows = @@ROWCOUNT;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀甀琀栀漀爀椀猀攀爀开爀攀焀甀攀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all authoriser grant and revoke requests.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus all records from the list of approval requests.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_authoriser_requests] ਀ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)      = 'Fail', ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser or configurator or controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY ਀ऀ     匀䔀䰀䔀䌀吀   愀瀀爀⸀爀攀焀甀攀猀琀开椀搀                     䄀匀 ✀刀攀焀甀攀猀琀 䤀䐀✀Ⰰ 
				  apr.sid_id                         AS 'User ID',਀ऀऀऀऀ  愀瀀爀⸀琀礀瀀攀                           䄀匀 ✀吀礀瀀攀✀Ⰰ 
				  apr.username                       AS 'System Username',਀ऀऀऀऀ  愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀           䄀匀 ✀䄀瀀瀀爀漀瘀攀爀 ㄀ 唀猀攀爀 䤀䐀✀Ⰰ 
				  apr.approved_by_username_1         AS 'Approver 1',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开漀渀开㄀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䘀椀爀猀琀 䄀瀀瀀爀漀瘀愀氀✀Ⰰ 
				  apr.approved_by_sid_id_2           AS 'Approver 2 User ID',਀ऀऀऀऀ  愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开甀猀攀爀渀愀洀攀开㈀         䄀匀 ✀䄀瀀瀀爀漀瘀攀爀 ㈀✀Ⰰ 
		          CONVERT(NVARCHAR(30), apr.approved_on_2, 120) AS 'Second Approval',਀ऀऀऀऀ  䤀匀一唀䰀䰀⠀愀瀀爀⸀猀琀愀琀甀猀Ⰰ ✀✀⤀             䄀匀 ✀匀琀愀琀甀猀✀ 
			FROM user_restr.authoriser_privilege_requests AS apr਀ऀ   䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	          ON    sl.sid_id਀ऀऀऀऀ  㴀 愀瀀爀⸀猀椀搀开椀搀 
		ORDER BY apr.request_id DESC; ਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @message = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
					CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = @message + ' | ' + 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀甀琀栀漀爀椀猀攀爀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all authorisers਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus all records from the sid list.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_authorisers] ਀ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀䘀愀椀氀✀Ⰰ  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 漀爀 挀漀渀昀椀最甀爀愀琀漀爀 漀爀 挀漀渀琀爀漀氀氀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
	     SELECT   sl.sid_id                          AS 'User ID',਀ऀऀ          䤀匀一唀䰀䰀⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀                䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
			      ISNULL(sl.descr, '')               AS 'Description',਀ऀऀ          䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀            䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), sl.created, 120) AS 'User ID Created',਀ऀऀऀऀ  愀⸀渀漀琀攀猀                            䄀匀 ✀一漀琀攀猀✀Ⰰ 
		          CONVERT(NVARCHAR(30), a.created, 120) AS 'Grant Created',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'				  ਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	  INNER JOIN user_restr.authorisers AS a਀ऀ             伀一             猀氀⸀猀椀搀开椀搀 
				    = a.authoriser_sid_id; ਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
					CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = @message + ' | ' + 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all controller level document groups  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀最渀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 䄀匀 ✀䌀漀渀琀爀漀氀氀攀爀 䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(dgn.mnem, '')			 AS 'Mnemonic',਀ऀ            搀最渀⸀愀琀琀爀开渀愀洀攀ऀऀऀऀऀ 䄀匀 ✀䌀漀渀琀爀漀氀氀攀爀 䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(dgn.descr, '')			 AS 'Description',਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀最渀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				dgn.created_by                   AS 'Created By'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀  䄀匀 搀最渀 
	   ORDER BY 'Controller Doc Group ID';਀ऀ   匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开猀椀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all the user IDs for a given controller level document group.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开猀椀搀猀崀  
਀     䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrecords bigint               = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  SET @transaction_status = 'Transaction not attempted';਀ऀ 
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ   ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	     IF @contr_doc_ed_grp_name_id = 0਀ऀऀ    匀䔀吀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @contr_doc_ed_grp_name_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䌀漀渀䐀漀挀䜀爀漀甀瀀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoConDocGroup.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT controller_doc_group_name_id਀ऀऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE controller_doc_group_name_id = @contr_doc_ed_grp_name_id)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀渀䐀漀挀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar(10), @contr_doc_ed_grp_name_id), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
			            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ConDocGpNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT  @contr_doc_ed_grp_name_id          AS 'Controller Doc Group ID',਀ऀऀ         挀搀最猀氀⸀猀椀搀开椀搀                       䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ  
				 ISNULL (sl.name, '')               AS 'Database Usernme',਀ऀऀ         䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀            䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				 CONVERT(NVARCHAR(30), cdgsl.created, 120) AS 'Created',਀ऀऀऀऀ 挀搀最猀氀⸀最爀愀渀琀攀搀开戀礀                   䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀Ⰰ 
				 cdgsl.notes                        AS Notes,਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'਀ऀ     䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀搀最猀氀 
     INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一      猀氀⸀猀椀搀开椀搀  
		        = cdgsl.sid_id਀ऀऀ  圀䠀䔀刀䔀 挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
		        = @contr_doc_ed_grp_name_id;਀      匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all controller level file groups  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 昀椀氀攀 最爀漀甀瀀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 挀昀最渀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 䄀匀 ✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(cfgn.mnem, '')			   AS 'Mnemonic',਀ऀ            挀昀最渀⸀愀琀琀爀开渀愀洀攀ऀऀऀऀऀ   䄀匀 ✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(cfgn.descr, '')			   AS 'Description',਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 挀昀最渀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				cfgn.created_by                    AS 'Created By'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀   䄀匀 挀昀最渀 
	   ORDER BY 'Controller File Group ID';਀ऀ   匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开猀椀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all the user IDs for a given controller level file group.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 䤀䐀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开猀椀搀猀崀  
਀     䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䌀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 䤀䐀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrecords bigint               = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  SET @transaction_status = 'Transaction not attempted';਀ऀ 
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ   ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 
	     IF @contr_file_ed_grp_name_id = 0਀ऀऀ    匀䔀吀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @contr_file_ed_grp_name_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䌀漀渀䘀椀氀攀䜀爀漀甀瀀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoConFileGroup.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT controller_file_group_name_id਀ऀऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE controller_file_group_name_id = @contr_file_ed_grp_name_id)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀渀䘀椀氀攀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar(10), @contr_file_ed_grp_name_id), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
			            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ConFileGpNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT  @contr_file_ed_grp_name_id         AS 'Controller File Group ID',਀ऀऀ         挀昀最猀氀⸀猀椀搀开椀搀                       䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ  
				 ISNULL (sl.name, '')               AS 'Database Username',਀ऀऀ         䤀匀一唀䰀䰀⠀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀               䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				 CONVERT(NVARCHAR(30), cfgsl.created, 120) AS 'Created',਀ऀऀऀऀ 挀昀最猀氀⸀最爀愀渀琀攀搀开戀礀                   䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀Ⰰ 
				 cfgsl.notes                        AS Notes,਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'਀ऀ     䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀昀最猀氀 
     INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一      猀氀⸀猀椀搀开椀搀  
		        = cfgsl.sid_id਀ऀऀ  圀䠀䔀刀䔀 挀昀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
		        = @contr_file_ed_grp_name_id;਀      匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀爀椀瘀椀氀攀最攀猀开戀礀开甀猀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all the privileges for one user.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus the list of privileges.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_privileges_by_user] ਀ 
     @userid bigint                    = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@iscontroller nvarchar(5)            = NULL,਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀䘀愀椀氀✀Ⰰ  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';		;਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser or configurator or controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀   
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- Data validation਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 匀䤀䐀 䤀䐀 椀猀 氀椀洀椀琀攀搀 琀漀 挀栀攀挀欀椀渀最 琀栀愀琀 漀渀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
 -- The log may contain records of SID IDs that have since been deleted from the SID list.  ਀ ऀ ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀猀椀搀爀攀挀漀爀搀椀搀 
	   -- Check that the sid is valid਀ऀऀ 䤀䘀 䀀甀猀攀爀椀搀 㴀 　 
		    SET @userid = NULL;਀ऀऀ 䤀䘀 䀀甀猀攀爀椀搀 䤀匀 一唀䰀䰀  
		    BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NoUserSidID', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀✀⤀㬀ऀ 
			END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀  
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- ====================================================਀ 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 䌀漀渀琀爀漀氀氀攀爀 爀漀氀攀⸀  
	  IF EXISTS (SELECT urlk.sid_id਀ऀ               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 䄀匀 甀爀氀欀 
				  WHERE urlk.sid_id = @userid਀ऀऀऀऀ    䄀一䐀 甀爀氀欀⸀爀漀氀攀开渀愀洀攀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀⤀ 
		 SET @iscontroller = 'Pass'਀ 
਀ऀ     匀䔀䰀䔀䌀吀   ✀䌀漀渀琀爀漀氀氀攀爀 䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀✀                  䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  cdgsl.controller_doc_group_name_id           AS 'Privilege ID',਀ऀऀऀऀ  ⠀匀䔀䰀䔀䌀吀 挀搀最渀⸀愀琀琀爀开渀愀洀攀 
				     FROM xref.controller_doc_group_names AS cdgn਀ऀऀऀऀऀ圀䠀䔀刀䔀  挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
					      = cdgn.controller_doc_group_name_id) AS 'Privilege Name',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 挀搀最猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀    䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  cdgsl.granted_by                             AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀搀最猀氀 
		   WHERE cdgsl.sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
	     SELECT   'Controller File Group'                        AS 'Privilege Type',਀ऀऀऀऀ  挀昀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀            䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  (SELECT cfgn.attr_name਀ऀऀऀऀ     䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 挀昀最渀 
					WHERE  cfgsl.controller_file_group_name_id਀ऀऀऀऀऀ      㴀 挀昀最渀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀⤀  䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), cfgsl.created, 120)      AS 'Granted On',਀ऀऀऀऀ  挀昀最猀氀⸀最爀愀渀琀攀搀开戀礀                               䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM user_restr.controller_file_grp_sid_links AS cfgsl਀ऀऀ   圀䠀䔀刀䔀 挀昀最猀氀⸀猀椀搀开椀搀 
		         = @userid਀ 
		UNION ALL਀ऀ     匀䔀䰀䔀䌀吀   ✀䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀 嘀椀攀眀攀爀✀                  䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  dgvp.doc_group_id                        AS 'Privilege ID',਀ऀऀऀऀ  ⠀匀䔀䰀䔀䌀吀 搀最渀⸀愀琀琀爀开渀愀洀攀 
				     FROM xref.doc_group_names AS dgn਀ऀऀऀऀऀ圀䠀䔀刀䔀   搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
					      = dgn.doc_group_id)              AS 'Privilege Name',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀最瘀瀀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  dgvp.granted_by                          AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
		   WHERE dgvp.sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
	     SELECT   'Form Group Owner'                      AS 'Privilege Type',਀ऀऀऀऀ  昀最漀⸀昀漀爀洀开最爀漀甀瀀开椀搀                       䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  (SELECT fgn.attr_name਀ऀऀऀऀ     䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
					WHERE   fgn.form_group_id਀ऀऀऀऀऀ      㴀 昀最漀⸀昀漀爀洀开最爀漀甀瀀开椀搀⤀            䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), fgo.created, 120) AS 'Granted On',਀ऀऀऀऀ  昀最漀⸀最爀愀渀琀攀搀开戀礀                          䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM user_restr.form_group_owners AS fgo਀ऀऀ   圀䠀䔀刀䔀 昀最漀⸀猀椀搀开椀搀 
		         = @userid਀ 
		UNION ALL਀ऀ     匀䔀䰀䔀䌀吀   ✀倀攀漀瀀氀攀 䰀椀猀琀✀                          䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  pl.people_list_id                      AS 'Privilege ID',਀ऀऀऀऀ  ⠀匀䔀䰀䔀䌀吀 瀀氀渀⸀渀愀洀攀 
				     FROM people.people_list_names AS pln਀ऀऀऀऀऀ圀䠀䔀刀䔀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = pl.people_list_id)           AS 'Privilege Name',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瀀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  pl.granted_by                          AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
		   WHERE pl.sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
	     SELECT   'Role'                                 AS 'Privilege Type',਀ऀऀऀऀ  一唀䰀䰀                                   䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  rl.role_name                           AS 'Privilege Name',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 爀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  rl.granted_by                          AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 䄀匀 爀氀 
		   WHERE rl.sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀ऀऀऀऀ  
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
	     SELECT   'Role'                                AS 'Privilege Type',਀ऀऀऀऀ  一唀䰀䰀                                  䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  'Authorizer'                          AS 'Privilege Name',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 愀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  ''                                    AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
		   WHERE a.authoriser_sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀ऀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
	     SELECT   'Duty Function'                          AS 'Privilege Type',਀ऀऀऀऀ  搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀                         䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  (SELECT df.name਀ऀऀऀऀ     䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
					WHERE     df.function_id਀ऀऀऀऀऀ      㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀⤀              䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), dfsl.created, 120) AS 'Granted On',਀ऀऀऀऀ  搀昀猀氀⸀最爀愀渀琀攀搀开戀礀                          䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM people.duty_function_sid_links AS dfsl਀ऀऀ   圀䠀䔀刀䔀 搀昀猀氀⸀猀椀搀开椀搀 
		         = @userid਀ 
		UNION ALL਀ऀ     匀䔀䰀䔀䌀吀   ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀✀        䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  tbtn.tag_browsing_tree_id  AS 'Privilege ID',਀ऀऀऀऀ  琀戀琀渀⸀渀愀洀攀                  䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          ''                         AS 'Granted On',਀ऀऀऀऀ  ✀✀                         䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM tagging.tag_browsing_tree_names AS tbtn਀ऀऀ   圀䠀䔀刀䔀 琀戀琀渀⸀猀椀搀开椀搀 
		         = @userid਀ 
਀ 
		UNION ALL਀ऀऀ匀䔀䰀䔀䌀吀 ✀吀愀最 刀攀氀愀琀椀漀渀猀栀椀瀀 吀爀攀攀✀   䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				ttn.tag_tree_id          AS 'Privilege ID',਀ऀऀऀऀ琀琀渀⸀渀愀洀攀                 䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
			    ''                       AS 'Granted On',਀ऀऀऀ    ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		FROM tagging.tag_tree_names AS ttn਀ऀऀ圀䠀䔀刀䔀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 
਀ 
		UNION ALL਀ऀऀऀ 匀䔀䰀䔀䌀吀 ✀吀愀最 刀攀氀愀琀椀漀渀猀栀椀瀀 吀爀攀攀✀  䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
			        ttn.tag_tree_id          AS 'Privilege ID',਀ऀऀऀऀऀ琀琀渀⸀渀愀洀攀                 䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
			        ''                       AS 'Granted On',਀ऀऀऀ        ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
					           FROM tagging.tag_tree_names AS ttn਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀琀瀀昀 
						         ON    ttn.tag_tree_id਀ऀऀऀऀऀऀऀऀ    㴀 琀琀瀀昀⸀琀愀最开琀爀攀攀开椀搀 
						 INNER JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ            伀一   琀琀瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   =  fln.function_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						            ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 INNER JOIN people.duty_functions AS df਀ऀऀऀऀऀऀ            伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   = df.function_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						            ON  dfsl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一 搀昀猀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀椀搀 
							    AND @iscontroller <> 'Pass'਀        唀一䤀伀一  
਀ऀऀऀऀऀ  ⠀ 匀䔀䰀䔀䌀吀 ✀吀愀最 刀攀氀愀琀椀漀渀猀栀椀瀀 吀爀攀攀✀  䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
					           ttn2.tag_tree_id         AS 'Privilege ID',਀ऀऀऀऀऀ           琀琀渀㈀⸀渀愀洀攀                䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
			                   ''                       AS 'Granted On',਀ऀऀऀ                   ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
					           FROM tagging.tag_tree_names AS ttn2਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀琀瀀瀀 
						         ON   ttn2.tag_tree_id਀ऀऀऀऀऀऀऀऀ    㴀 琀琀瀀瀀⸀琀愀最开琀爀攀攀开椀搀 
						 INNER JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ            伀一   琀琀瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   =  pln.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						            ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一   瀀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀椀搀 
							    AND @iscontroller <> 'Pass'਀ऀऀऀऀऀऀऀ  ⤀ 
਀ 
		UNION ALL਀ऀऀ匀䔀䰀䔀䌀吀 
			'Tag Group'              AS 'Privilege Type',਀ऀऀऀ琀最渀⸀琀愀最开最爀漀甀瀀开椀搀         䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
			tgn.tag_group_name       AS 'Privilege Name',਀ऀऀऀ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
			''                       AS 'Granted By'਀ऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最渀 
		WHERE @iscontroller = 'Pass'਀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
		SELECT਀ऀऀऀ✀吀愀最 䜀爀漀甀瀀✀              䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
			tgin.tag_group_id        AS 'Privilege ID',਀ऀऀऀ琀最椀渀⸀琀愀最开最爀漀甀瀀开渀愀洀攀      䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
			''                       AS 'Granted On',਀ऀऀऀ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		FROM tagging.tag_group_identifier_names AS tgin਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀最瀀昀 
					 ON tgin.tag_group_id = tgpf.tag_group_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
					 ON tgpf.function_list_id = fln.function_list_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
					 ON fln.function_list_id = fl.function_list_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
					 ON fl.function_id = df.function_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
					 ON dfsl.function_id = df.function_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
					 ON dfsl.sid_id = sl.sid_id਀ऀऀ圀䠀䔀刀䔀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㰀㸀 ✀倀愀猀猀✀ 
		  AND sl.sid_id = @userid਀ 
		UNION਀ऀऀ匀䔀䰀䔀䌀吀 
			'Tag Group'              AS 'Privilege Type',਀ऀऀऀ琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀       䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
			tgin2.tag_group_name     AS 'Privilege Name',਀ऀऀऀ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
			''                       AS 'Granted By'਀ऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最椀渀㈀ 
			 INNER JOIN user_restr.tag_group_permissions_plist AS tgpp਀ऀऀऀऀऀ 伀一 琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀 㴀 琀最瀀瀀⸀琀愀最开最爀漀甀瀀开椀搀 
			 INNER JOIN people.people_list_names AS pln਀ऀऀऀऀऀ 伀一 琀最瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			 INNER JOIN people.people_lists AS pl਀ऀऀऀऀऀ 伀一 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀ 伀一 瀀氀⸀猀椀搀开椀搀 㴀 猀氀⸀猀椀搀开椀搀 
		WHERE @iscontroller <> 'Pass'਀ऀऀ  䄀一䐀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀椀搀 
਀ 
		UNION ALL ਀ऀ     匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀   
		         'Document Group Edit'   AS 'Privilege Type',਀ऀऀऀऀ  搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀       䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  dgn.attr_name          AS 'Privilege Name',਀ऀऀ          ✀✀                     䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  ''                     AS 'Granted By'਀ 
					           FROM xref.doc_group_names AS dgn਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 搀最攀瀀昀氀 ⴀⴀ 䌀栀攀挀欀 昀漀爀 洀攀洀戀攀爀猀栀椀瀀 漀昀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 
						            ON      dgn.doc_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀最攀瀀昀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
						  LEFT JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ            伀一 搀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   =  fln.function_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						            ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						  LEFT JOIN people.duty_functions AS df਀ऀऀऀऀऀऀ            伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   = df.function_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						            ON  dfsl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
					            ਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 䄀匀 搀最攀瀀瀀氀 ⴀⴀ 䌀栀攀挀欀 昀漀爀 洀攀洀戀攀爀猀栀椀瀀 漀昀 愀 瀀攀漀瀀氀攀 氀椀猀琀 
						            ON      dgn.doc_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀最攀瀀瀀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
						  LEFT JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ            伀一 搀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   =  pln.people_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						            ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						  LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一   瀀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀऀऀ伀刀 搀昀猀氀⸀猀椀搀开椀搀 
									     = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
਀ऀऀ唀一䤀伀一 䄀䰀䰀  
	     SELECT DISTINCT  ਀ऀऀ         ✀䘀椀氀攀 䜀爀漀甀瀀 䔀搀椀琀✀       䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  fgn.file_group_id      AS 'Privilege ID',਀ऀऀऀऀ  昀最渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          ''                     AS 'Granted On',਀ऀऀऀऀ  ✀✀                     䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
				  FROM xref.file_group_names AS fgn਀ 
			    LEFT JOIN user_restr.file_group_edit_perm_funct_lst AS fgepfl  -- Check for link through function lists਀ऀऀऀऀ       伀一      昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
					      = fgepfl.file_group_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
					   ON fgepfl.function_list_id ਀ऀऀऀऀऀऀऀ 㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
				LEFT JOIN people.duty_functions AS df਀ऀऀऀऀऀ   伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀  
						   = df.function_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
					   ON     df.function_id ਀ऀऀऀऀऀऀ   㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
਀ऀऀऀ    䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀  ⴀⴀ 䌀栀攀挀欀 昀漀爀 氀椀渀欀 琀栀爀漀甀最栀 瀀攀漀瀀氀攀 氀椀猀琀猀 
				       ON      fgn.file_group_id਀ऀऀऀऀऀ      㴀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
				LEFT JOIN people.people_lists AS pl਀ऀऀऀऀऀ   伀一  昀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
						   =    pl.people_list_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
					   ON   pl.sid_id ਀ऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
						   OR਀ऀऀऀऀऀऀ    搀昀猀氀⸀猀椀搀开椀搀 
							= sl.sid_id਀ऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
਀ऀऀऀऀ 㬀  
਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 唀猀攀爀渀愀洀攀㨀 ✀Ⰰ  
				   ISNULL((SELECT sl.username਀ऀऀऀऀ            䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						   WHERE sl.sid_id = @userid), ''));਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀攀瘀漀欀攀开氀漀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists the user privilege revoke log.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus all records from the list of privilege revokes.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_revoke_log] ਀ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀䘀愀椀氀✀Ⰰ  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 漀爀 挀漀渀昀椀最甀爀愀琀漀爀 漀爀 挀漀渀琀爀漀氀氀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
	     SELECT   uprl.privilege                     AS 'Privilege',਀ऀऀऀऀ  甀瀀爀氀⸀瀀爀椀瘀椀氀攀最攀开渀愀洀攀                䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
				  uprl.sid_id                        AS 'User ID',਀ऀऀऀऀ  甀瀀爀氀⸀甀猀攀爀渀愀洀攀                      䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), uprl.granted_on, 120) AS 'Granted On',਀ऀऀऀऀ  甀瀀爀氀⸀最爀愀渀琀攀搀开戀礀                    䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀Ⰰ 
		          CONVERT(NVARCHAR(30), uprl.revoked_on, 120) AS 'Actioned On',਀ऀऀऀऀ  甀瀀爀氀⸀爀攀瘀漀欀攀搀开戀礀                    䄀匀 ✀刀攀瘀漀欀攀搀 䈀礀✀ 
			FROM user_restr.user_privilege_revoke_log AS uprl਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀䄀挀琀椀漀渀攀搀 伀渀✀ 䐀䔀匀䌀㬀  
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = @message + ' | ' + @tempmessage + ' | ' + ਀ऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_SEL_roles_by_user]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 昀漀爀 愀 最椀瘀攀渀 甀猀攀爀⸀ 
-- Input is a user id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 愀 氀椀猀琀 漀昀 甀猀攀爀猀 昀漀爀 琀栀愀琀 爀漀氀攀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀漀氀攀猀开戀礀开甀猀攀爀崀  
਀     䀀甀猀攀爀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the require permission਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@invaliduseridmessage nvarchar(200)  = '',     -- Communicates that the supplied role id is invalid਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@data_validation_status nchar(10)    = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = @username + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀ 
 IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀  䈀䔀䜀䤀一 
-- Data validation਀ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀爀 椀搀 椀猀 瘀愀氀椀搀 
  IF @userid = 0਀     匀䔀吀 䀀甀猀攀爀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a user id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀甀猀攀爀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoUserSidID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 甀猀攀爀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the user id exists਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
                          FROM user_restr.sid_list ਀                         圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀甀猀攀爀椀搀⤀  
             BEGIN -- The role does not exist਀               匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀               䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                    @message_id = 'UserIdNotExist', ਀ऀऀऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	           IF (@tempmessage IS NOT NULL) ਀ऀ              匀䔀吀 䀀椀渀瘀愀氀椀搀甀猀攀爀椀搀洀攀猀猀愀最攀 㴀 ✀唀猀攀爀 䤀䐀㨀 ✀ ⬀ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀甀猀攀爀椀搀⤀ ⬀ ✀⸀⸀⸀ ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	           ELSE ਀ऀऀऀऀ    匀䔀吀 䀀椀渀瘀愀氀椀搀甀猀攀爀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀⸀✀㬀 
	         END਀ऀ 䔀一䐀 
  END -- END data validation਀  
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT urlk.sid_id AS 'User ID',਀ऀऀ        甀爀氀欀⸀爀漀氀攀开渀愀洀攀  䄀匀 ✀刀漀氀攀 一愀洀攀✀Ⰰ 
		        CONVERT(NVARCHAR(30), urlk.created, 120) AS 'Created',਀ऀऀऀऀ甀爀氀欀⸀最爀愀渀琀攀搀开戀礀 䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀Ⰰ 
				urlk.notes AS Notes਀ऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 䄀匀 甀爀氀欀 
     INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一     猀氀⸀猀椀搀开椀搀  
		        = urlk.sid_id਀ऀ  ऀ  圀䠀䔀刀䔀 甀爀氀欀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀椀渀瘀愀氀椀搀甀猀攀爀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀渀瘀愀氀椀搀甀猀攀爀椀搀洀攀猀猀愀最攀㬀 
	IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开甀猀攀爀猀开戀礀开爀漀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects records from user_restr.user_role_link for a given role.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀漀氀攀 渀愀洀攀 猀琀爀椀渀最⸀ 
-- Output is a status message and a transaction status and a list of users for that role.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_SEL_users_by_role] ਀ 
     @rolename nvarchar(50)           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀 瀀攀爀洀椀猀猀椀漀渀 
		@norecordidmessage nvarchar(200)     = '',     -- Communicates that no record id was supplied਀ऀऀ䀀椀渀瘀愀氀椀搀爀漀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 爀漀氀攀 椀搀 椀猀 椀渀瘀愀氀椀搀 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready';਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
-- Data validation਀ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀漀氀攀 渀愀洀攀 椀猀 瘀愀氀椀搀 
  IF @rolename = ''਀     匀䔀吀 䀀爀漀氀攀渀愀洀攀 㴀 一唀䰀䰀㬀 
   -- Check if a role name has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀爀漀氀攀渀愀洀攀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoRecordID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 爀漀氀攀 渀愀洀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the role name exists਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀漀氀攀开渀愀洀攀 
                          FROM user_restr.role_list ਀                         圀䠀䔀刀䔀 爀漀氀攀开渀愀洀攀 㴀 䀀爀漀氀攀渀愀洀攀⤀  
             BEGIN -- The role does not exist਀               匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀               䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                    @message_id = 'RoleNotExist', ਀ऀऀऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	           IF (@tempmessage IS NOT NULL) ਀ऀ              匀䔀吀 䀀椀渀瘀愀氀椀搀爀漀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀刀漀氀攀 渀愀洀攀㨀 ✀ ⬀ 䰀䔀䘀吀⠀䀀爀漀氀攀渀愀洀攀Ⰰ ㈀　⤀ ⬀ ✀⸀⸀⸀ ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	           ELSE ਀ऀऀऀऀ    匀䔀吀 䀀椀渀瘀愀氀椀搀爀漀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀漀氀攀一漀琀䔀砀椀猀琀⸀✀㬀 
	         END਀ऀ 䔀一䐀 
਀  
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT  @rolename                          AS 'Role Name',਀ऀऀ         甀爀氀欀⸀猀椀搀开椀搀                        䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ  
				 ISNULL (sl.name, '')               AS 'Database Username',਀ऀऀ         䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀            䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				 CONVERT(NVARCHAR(30), urlk.created, 120) AS 'Created',਀ऀऀऀऀ 甀爀氀欀⸀最爀愀渀琀攀搀开戀礀                    䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ऀऀ 
		   FROM user_restr.user_role_link AS urlk਀     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	         ON     sl.sid_id ਀ऀऀ        㴀 甀爀氀欀⸀猀椀搀开椀搀 
	  	  WHERE urlk.role_name = @rolename਀ऀ   伀刀䐀䔀刀 䈀夀 ✀唀猀攀爀 䤀䐀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀椀渀瘀愀氀椀搀爀漀氀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀渀瘀愀氀椀搀爀漀氀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀愀渀挀攀氀开愀甀琀栀漀爀椀猀攀爀开爀攀焀甀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀㄀㄀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䌀愀渀挀攀氀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 瀀攀渀搀椀渀最 最爀愀渀琀 爀攀焀甀攀猀琀⸀    
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [authorising].[usp_UPD_cancel_authoriser_requ] ਀ 
	 @request_id bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀猀甀戀樀攀挀琀开猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀          㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 甀猀攀爀 爀攀氀愀琀椀渀最 琀漀 琀栀攀 爀攀焀甀攀猀琀 戀攀椀渀最 挀愀渀挀攀氀氀攀搀⸀  
		@subject_username nvarchar(150)      = '',  -- The username of the user relating to the request being cancelled.਀ऀऀ䀀爀攀焀甀攀猀琀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㈀　⤀           㴀 ✀✀Ⰰ ⴀⴀ 吀栀攀 琀礀瀀攀 漀昀 瀀爀椀瘀椀氀攀最攀 挀栀愀渀最攀 爀攀焀甀攀猀琀⸀ 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
	਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀焀甀攀猀琀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @request_id = 0਀ऀऀ    匀䔀吀 䀀爀攀焀甀攀猀琀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @request_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀刀攀焀甀攀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRequestID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT request_id 	     -- Check if the request_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀  
								 WHERE request_id = @request_id) ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀焀甀攀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @request_id), 'NULL'), ' | ', @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RequestIDNotExist.');਀ऀऀऀऀऀ   䔀一䐀 
		   END਀ 
		   IF @data_validation_status = 'Pass'਀ऀऀ      䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT request_id 	     -- Check that the status = Pending਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
								 WHERE request_id = @request_id਀ऀऀऀऀऀऀऀऀ   䄀一䐀 愀瀀爀⸀猀琀愀琀甀猀 㴀 ✀倀攀渀搀椀渀最✀⤀  
					   BEGIN਀ऀऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'NotPending', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀爀攀焀甀攀猀琀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀倀攀渀搀椀渀最⸀✀⤀㬀 
					   END਀ऀऀऀऀ䔀一䐀 
਀ 
		   IF @data_validation_status = 'Pass'਀ऀऀ     䈀䔀䜀䤀一 
				-- Authoriser cannot cancel a request to revoke their own authorisation privilege.਀                  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀  
				               FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						         ON  apr.sid_id਀ऀऀऀऀऀऀऀऀ    㴀 猀氀⸀猀椀搀开椀搀 
                              WHERE apr.request_id = @request_id਀ऀऀऀऀऀऀऀ        䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
					   BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'NoSelfCancel', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀攀氀昀䌀愀渀挀攀氀⸀✀⤀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END਀               䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  匀䔀吀 䀀猀甀戀樀攀挀琀开猀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
	                        FROM user_restr.sid_list as sl਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀 
						                        FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀⤀⤀ 
	  SET @subject_username = ISNULL(SUSER_SNAME(@subject_sid), '');਀ऀ  匀䔀吀 䀀爀攀焀甀攀猀琀开琀礀瀀攀 㴀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀琀礀瀀攀 
	                         FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀⤀ 
਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀  
		    SET status = 'Cancelled'਀ऀऀ  圀䠀䔀刀䔀 爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀焀甀攀猀琀开椀搀㬀  
਀        䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀猀甀戀樀攀挀琀开甀猀攀爀渀愀洀攀Ⰰ 䀀爀攀焀甀攀猀琀开琀礀瀀攀Ⰰ ✀刀攀焀甀攀猀琀 挀愀渀挀攀氀氀攀搀⸀✀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the xref.controller_doc_group_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
							  FROM xref.controller_doc_group_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
					   FROM xref.controller_doc_group_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND controller_doc_group_name_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@attribute_name, 10), '... | ', @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     唀倀䐀䄀吀䔀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
਀ऀ 䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_UPD_contr_doc_group_sid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀漀爀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀  
-- Input is the sid_id of the user from the sid_list table, ਀ⴀⴀ 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 愀渀搀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开猀椀搀崀  
਀     䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䌀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀  䴀愀渀搀愀琀漀爀礀  
	 @user_sid_id bigint              = NULL,  -- User sid_id from the sid_list table.  Mandatory਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 搀漀挀 最爀漀甀瀀 攀渀琀爀礀⸀ 伀瀀琀椀漀渀愀氀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
	਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 猀椀搀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT sid_id 	     -- Check sid_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								 WHERE sid_id = @user_sid_id) ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @user_sid_id), 'NULL'), ' | ', @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserIdNotExist.');਀ऀऀऀऀऀ   䔀一䐀 
                  IF EXISTS (SELECT sid -- Check that the supplied sid is not the same as the connected user sid਀ऀऀऀऀ               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                              WHERE sl.sid = @connectedusersid ਀ऀऀऀऀऀऀऀ        䄀一䐀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
					   BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'SelfAuth', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀昀䄀甀琀栀⸀✀⤀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END਀ऀऀ   䔀一䐀 
਀ऀऀ   ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	     IF @contr_doc_ed_grp_name_id = 0਀ऀऀ    匀䔀吀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @contr_doc_ed_grp_name_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䌀漀渀䐀漀挀䜀爀漀甀瀀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoConDocGroup.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT controller_doc_group_name_id਀ऀऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE controller_doc_group_name_id = @contr_doc_ed_grp_name_id)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀渀䐀漀挀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar(10), @contr_doc_ed_grp_name_id), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
			            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ConDocGpNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
      -- Check if the record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀Ⰰ 猀椀搀开椀搀 
				   	      FROM user_restr.controller_doc_group_sid_links ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 
						       AND sid_id = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ 
	     UPDATE user_restr.controller_doc_group_sid_links਀ऀऀ    匀䔀吀 渀漀琀攀猀 㴀 䀀椀渀瀀甀琀渀漀琀攀猀 
		  WHERE  controller_doc_group_name_id  ਀ऀऀ        㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 
		        AND     sid_id ਀ऀऀऀऀ㴀 䀀甀猀攀爀开猀椀搀开椀搀㬀  
਀        䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the xref.controller_file_group_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
							  FROM xref.controller_file_group_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
					   FROM xref.controller_file_group_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND controller_file_group_name_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@attribute_name, 10), '... | ', @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     唀倀䐀䄀吀䔀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
਀ऀऀ䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_UPD_contr_file_group_sid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀漀爀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀  
-- Input is the sid_id of the user from the sid_list table, ਀ⴀⴀ 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 椀搀 愀渀搀 渀漀琀攀猀⸀    
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开猀椀搀崀  
਀     䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @user_sid_id bigint               = NULL,  -- User sid_id from the sid_list table਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀         㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀 攀渀琀爀礀 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
	਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 猀椀搀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT sid_id 	     -- Check sid_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								 WHERE sid_id = @user_sid_id) ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
							  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @user_sid_id), 'NULL'), ' | ', @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserIdNotExist.');਀ऀऀऀऀऀ   䔀一䐀 
                  IF EXISTS (SELECT sid -- Check that the supplied sid is not the same as the connected user sid਀ऀऀऀऀ               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                              WHERE sl.sid = @connectedusersid ਀ऀऀऀऀऀऀऀ        䄀一䐀 猀氀⸀猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
					   BEGIN਀ऀऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							  @message_id   = 'SelfAuth', ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀昀䄀甀琀栀⸀✀⤀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END਀ऀऀ   䔀一䐀 
਀ऀऀ   ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 
	     IF @contr_file_ed_grp_name_id = 0਀ऀऀ    匀䔀吀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @contr_file_ed_grp_name_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䌀漀渀䘀椀氀攀䜀爀漀甀瀀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoConFileGroup.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT controller_file_group_name_id਀ऀऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE controller_file_group_name_id = @contr_file_ed_grp_name_id)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀渀䘀椀氀攀䜀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar(10), @contr_file_ed_grp_name_id), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
			            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ConFileGpNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
      -- Check if the record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀Ⰰ 猀椀搀开椀搀 
				   	      FROM user_restr.controller_file_grp_sid_links ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 
						       AND sid_id = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 
		    SET notes = @inputnotes਀ऀऀ  圀䠀䔀刀䔀  挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀   
		        = @contr_file_ed_grp_name_id਀ऀऀ        䄀一䐀     猀椀搀开椀搀  
				= @user_sid_id;  ਀ 
	   COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_UPD_doc_grp_viewer_notes]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 椀渀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀⸀  
-- Input is the sid_id of the user from the sid_list table, ਀ⴀⴀ 琀栀攀 瘀椀攀眀攀爀 最爀漀甀瀀 椀搀 愀渀搀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开最爀瀀开瘀椀攀眀攀爀开渀漀琀攀猀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @user_sid_id bigint              = NULL,  -- User sid_id from the sid_list table਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 搀漀挀 最爀漀甀瀀 攀渀琀爀礀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀऀ䀀猀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordnotexistsmessage nvarchar(200) = '',  -- Communicates that the record does not exist਀ऀऀ䀀搀漀挀最爀漀甀瀀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ 㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 猀椀搀开椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @sidnotexistmessage = @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @sidnotexistmessage = 'A database level message error occurred on NoUserSidID';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT sid_id 	     -- Check sid_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								 WHERE sid_id = @user_sid_id) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @sidnotexistmessage = ISNULL(CONVERT(nvarchar, @user_sid_id), 'NULL') + ' | ' + @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @sidnotexistmessage = 'A database level message error occurred on UserIdNotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		   END਀ 
	     IF @docgroupid = 0਀ऀऀ    匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		 IF @docgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @docgroupnotexistmsg = @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				SET @docgroupnotexistmsg = 'A database level message error occurred on NoDocGroupId';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT doc_group_id਀ऀऀऀऀ                  䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 
								 WHERE doc_group_id = @docgroupid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀漀挀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @docgroupnotexistmsg =  ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL') + ' | '  + @tempmessage; ਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @docgroupnotexistmsg = 'A database level message error occurred on DocGroupIdNotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		    END਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀Ⰰ 猀椀搀开椀搀 
				   	          FROM user_restr.doc_group_view_permissions ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						       AND sid_id = @user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @recordnotexistsmessage =  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @recordnotexistsmessage = 'A database level message error occurred on NotExist';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 
		    SET notes = @inputnotes਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
		    AND sid_id = @user_sid_id; ਀ 
		COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀猀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀猀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@docgroupnotexistmsg <> '')        SET @message = @message + ' | ' + @docgroupnotexistmsg;਀ऀ䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_UPD_form_group_owner]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 昀漀爀洀 最爀漀甀瀀 漀眀渀攀爀 爀攀挀漀爀搀⸀ 
-- Input is the sid_id of the user from the sid_list table and ਀ⴀⴀ 琀栀攀 昀漀爀洀 最爀漀甀瀀 椀搀 愀渀搀 愀 渀攀眀 甀猀攀爀 猀椀搀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀崀  
਀     䀀昀漀爀洀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䘀漀爀洀 最爀漀甀瀀 琀漀 搀攀氀攀琀攀 漀眀渀攀爀猀栀椀瀀 漀昀 
	 @user_sid_id bigint              = NULL,  -- User sid_id from the sid_list table਀ऀ 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 猀椀搀开椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀 昀漀爀 琀栀攀 渀攀眀 甀猀攀爀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  SET @transaction_status = 'Transaction not attempted';  -- Parameters which have not been explicitly set might be output as null to calling functions਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		 IF @new_user_sid_id = 0਀ऀऀ    匀䔀吀 䀀渀攀眀开甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @new_user_sid_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID.');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
         ELSE ਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT sid_id 	     -- Check sid_id exists਀ऀऀऀऀ  ऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								 WHERE sid_id = @new_user_sid_id) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @new_user_sid_id), 'NULL'), ' | ', @tempmessage);਀ऀऀऀऀऀऀ 䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserIdNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		   END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_group_id, sid_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀  
					    	 WHERE    form_group_id ਀ऀऀऀऀऀऀऀ       㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
						       AND             sid_id ਀ऀऀऀऀऀऀऀ       㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ 
			   -- Check for a duplicate record਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀Ⰰ 猀椀搀开椀搀 
				   	          FROM user_restr.form_group_owners ਀ऀऀऀऀऀ    ऀ 圀䠀䔀刀䔀    昀漀爀洀开最爀漀甀瀀开椀搀  
							       = @formgroupid਀ऀऀऀऀऀऀ       䄀一䐀             猀椀搀开椀搀  
							       = @new_user_sid_id਀ऀऀऀऀऀऀऀ   䄀一䐀        䀀甀猀攀爀开猀椀搀开椀搀 
							       <> @new_user_sid_id)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 	    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
				    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
			   ਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	  BEGIN TRANSACTION;਀ 
	     UPDATE user_restr.form_group_owners਀ऀऀ    匀䔀吀             猀椀搀开椀搀  
		        = @new_user_sid_id਀          圀䠀䔀刀䔀    昀漀爀洀开最爀漀甀瀀开椀搀  
		        = @formgroupid਀ऀऀ    䄀一䐀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀㬀  
਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
  END -- End of IF authentication status = Pass.਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @message + ' | ' + @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开爀攀猀琀漀爀攀开猀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-12-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Restores a user by copying the sid from restore_sid to sid.  ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 匀䤀䐀 䤀䐀⸀ 
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开爀攀猀琀漀爀攀开猀椀搀崀  
਀     䀀猀椀搀爀攀挀漀爀搀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ    ⴀⴀ 匀䤀䐀 䤀䐀 爀攀挀漀爀搀 渀甀洀戀攀爀 ⠀渀漀琀 琀栀攀 匀䤀䐀⤀ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)             = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)       = '',     -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@recordnotexistsmessage nvarchar(200)  = '',     -- Communicates that a matching record does not exist਀ऀऀ䀀椀猀愀甀琀栀漀爀椀猀攀爀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 椀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 愀渀搀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀 瘀椀愀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
		@username nvarchar(150)                = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀       㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10)   = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)           = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	   -- Check that the sid is valid਀ऀऀ 䤀䘀 䀀猀椀搀爀攀挀漀爀搀椀搀 㴀 　 
		    SET @sidrecordid = NULL;਀ऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀  
				  	      FROM user_restr.sid_list ਀ऀऀऀऀऀ     圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀  
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Check if the user is presently de-activated਀      䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀  
			 	      FROM user_restr.sid_list ਀ऀऀऀऀ     圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀 
					   AND sid = restore_sid) ਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀猀䄀挀琀椀瘀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @recordnotexistsmessage = ISNULL(CONVERT(nvarchar, @sidrecordid), 'NULL') + '  ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @recordnotexistsmessage = 'A database level message error occurred on UserIsActive';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		END਀ 
਀       ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀愀琀 琀栀攀 猀椀搀  椀猀 瘀愀氀椀搀 
਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 猀椀搀 椀猀 愀猀猀椀最渀攀搀 愀 爀漀氀攀 愀猀 愀甀琀栀漀爀椀猀攀爀⸀   
	   -- If the sid is asigned to an authoriser then the authoriser privilege must be revoked before the ਀ऀ   ⴀⴀ 甀猀攀爀 挀愀渀 戀攀 爀攀猀琀漀爀攀搀⸀  
       IF EXISTS (SELECT authoriser_sid_id਀ऀ                䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 
				   WHERE authoriser_sid_id = @sidrecordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀猀䄀甀琀栀漀爀椀猀攀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @isauthorisermessage = ISNULL(CONVERT(nvarchar, @sidrecordid), 'NULL') + '  ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @isauthorisermessage = 'A database level message error occurred on IsAuthoriser';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀匀䤀䐀✀Ⰰ     ✀匀䤀䐀 刀攀猀琀漀爀攀搀✀Ⰰ       䀀猀椀搀爀攀挀漀爀搀椀搀Ⰰ  
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @sidrecordid),਀ऀऀ          匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀Ⰰ 
				  @username,਀ऀऀऀऀ  ✀✀⤀ 
਀ 
	     UPDATE user_restr.sid_list ਀ऀऀ    匀䔀吀 猀椀搀 㴀 爀攀猀琀漀爀攀开猀椀搀 
		  WHERE sid_id = @sidrecordid; ਀ 
	    COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@isauthorisermessage <> '')        SET @message = @message + ' | ' + @isauthorisermessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [authorising].[usp_UPD_user_role_link_notes]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 挀漀氀甀洀渀 昀漀爀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀 
-- Input is the sid_id of the user from the sid_list table, ਀ⴀⴀ 琀栀攀 爀漀氀攀 愀渀搀 琀栀攀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀愀甀琀栀漀爀椀猀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开甀猀攀爀开爀漀氀攀开氀椀渀欀开渀漀琀攀猀崀  
਀     䀀爀漀氀攀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 ✀✀Ⰰ    ⴀⴀ 刀漀氀攀 渀愀洀攀 
	 @userid bigint                   = NULL,  -- User sid_id ਀ऀ 䀀爀攀挀漀爀搀渀漀琀攀猀  渀瘀愀爀挀栀愀爀⠀洀愀砀⤀      㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)     = '',     -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
        @recordnotexistmessage nvarchar(200) = '',     -- Communicates that the record does not exist਀ऀऀ䀀爀漀氀攀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ 㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀漀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username of the connected user਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = @username + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
      -- Check if the record does not exist਀ऀ    䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT role_name, sid_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开爀漀氀攀开氀椀渀欀  
						     WHERE role_name = @rolename਀ऀऀऀऀऀऀ       䄀一䐀 猀椀搀开椀搀    㴀 䀀甀猀攀爀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	   BEGIN TRANSACTION;਀ 
	     UPDATE user_restr.user_role_link ਀ऀऀ        匀䔀吀 渀漀琀攀猀 㴀 䀀爀攀挀漀爀搀渀漀琀攀猀 
			WHERE role_name = @rolename਀ऀऀऀ  䄀一䐀 猀椀搀开椀搀    㴀 䀀甀猀攀爀椀搀㬀  
਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_any_form_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 昀漀爀洀 椀搀 
-- Input is a form id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_any_form_id]਀ 
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)    = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀漀爀洀 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@norecordmessage nvarchar(200)      = '', -- Communicates that no record id was supplied਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordmessage = 'A database level message error occurred on NoNameID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
						   WHERE form_id = @id_to_delete) ਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ 
਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ 
	-- End of validation checks਀    䔀一䐀  ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM forms.form_identifier_names ਀ऀऀ       圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ 
	   COMMIT TRANSACTION;਀ 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_com_obj_attribute]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀攀挀漀爀搀 
-- Input is a common object record id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀洀开漀戀樀开愀琀琀爀椀戀甀琀攀崀 
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)      = '', -- Communicates that the form group id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)  = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10) = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as a controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordmessage = 'A database level message error occurred on NoNameID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT common_object_attribute_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE common_object_attribute_id = @id_to_delete) ਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF  EXISTS (SELECT common_object_attribute_id ਀ऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀   
			 WHERE common_object_attribute_id = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀  
					 FROM com_obj.common_objects  ਀ऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM com_obj.common_object_attributes ਀ऀऀ       圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	  COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
    END -- End IF user authentication = Pass਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_com_obj_list_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 渀愀洀攀 爀攀挀漀爀搀 
-- Input is a record id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀洀开漀戀樀开氀椀猀琀开渀愀洀攀崀  
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀ऀ          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @xrefexistmessage nvarchar(200)     = '', -- Communicates that there are cross references that exist਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Record id check਀ऀ  䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
	     SET @id_to_delete = NULL;਀ऀऀ䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
      -- End record ID check਀ 
      -- Check for any referential constraints਀ऀ  䤀䘀  䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			        FROM com_obj.common_object_lists ਀ऀऀऀ       圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT common_object_list_id ਀ऀऀऀ        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀  
			       WHERE common_object_list_id = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			        FROM forms.form_doc_com_obj_rb_lst_links ਀ऀऀऀ       圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT common_object_list_id ਀ऀऀऀ        䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀  
			       WHERE common_object_list_id = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			        FROM forms.form_file_com_obj_rb_lst_links ਀ऀऀऀ       圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM com_obj.common_object_list_names ਀ऀऀ      圀䠀䔀刀䔀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
		COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_doc_date_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_date_field_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 椀琀攀洀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_date_field_name] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the date field name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀  
					   WHERE doc_date_name_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀  
				  WHERE doc_date_name_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
					 FROM forms.form_doc_date_field_links਀ऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT default_doc_date_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
					WHERE default_doc_date_name_id = @id_to_delete) ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀  
		       WHERE doc_date_name_id = @id_to_delete;਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_doc_int_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_integer_field_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 椀琀攀洀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开椀渀琀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the integer name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀ    䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
					       WHERE doc_int_name_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀  
				  WHERE doc_int_name_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀  
					 FROM forms.form_doc_integer_field_links਀ऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM doc_attr.doc_integer_field_names ਀ऀऀ       圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	  COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_doc_ms_attr_fg_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Deletes a document multi-select attribute to filter group link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_ms_attr_fg_link]਀      
	 @docmsattrid bigint              = NULL,਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @docmsattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @docmsattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  IF @docmsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE doc_ms_attr_id = @docmsattrid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀     
		  -- Check if the record exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND NOT EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				    WHERE      doc_ms_attr_id = @docmsattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀  搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
		       WHERE       doc_ms_attr_id = @docmsattrid਀ऀऀऀ          䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀㬀 
	  COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 
-- Input is the id of the radio button attribute to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀崀  
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@nonameidmessage nvarchar(200)          = '', -- Communicates that no name id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀  
							FROM doc_attr.doc_multi_select_attributes ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀  
				   FROM doc_attr.doc_multi_select_links ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
	  OR EXISTS (SELECT doc_ms_attr_id਀ऀ               䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
				  WHERE doc_ms_attr_id = @id_to_delete)਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
		       WHERE doc_ms_attr_id = @id_to_delete;਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开洀猀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 
-- Input is the id of the radio button list to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开洀猀开氀椀猀琀崀  
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@nonameidmessage nvarchar(200)          = '', -- Communicates that no name id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀  
						    FROM doc_attr.doc_multi_select_list_names ਀ऀऀऀऀऀ       圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀  
				   FROM doc_attr.doc_multi_select_attributes ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT doc_ms_list_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀  
					WHERE doc_ms_list_id = @id_to_delete) ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
		       WHERE doc_ms_list_id = @id_to_delete;਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-06-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 
-- Input is the id of the radio button attribute to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_radiob_attr] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the radio button list name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT doc_radiob_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE doc_radiob_attr_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT doc_radiob_attr_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
				  WHERE doc_radiob_attr_id = @id_to_delete)  ਀ऀ  伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
				   FROM doc_attr.doc_radiob_attr_fgroup_links ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM doc_attr.doc_radio_button_attributes ਀ऀऀ       圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	  COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nonameidmessage <> '')            SET @message = @message + ' | ' + @nonameidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开爀愀搀椀漀戀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-06-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
-- Input is the id of the radio button list to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_radiob_list] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@connectedusersid varbinary(100)        = NULL,   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 ✀✀Ⰰ      
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the radio button list name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  匀䔀吀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
  SET @username = ORIGINAL_LOGIN();਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT doc_radiob_list_id ਀ऀऀऀऀऀऀ    䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
					       WHERE doc_radiob_list_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT doc_radiob_list_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
				  WHERE doc_radiob_list_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
					 FROM forms.form_doc_radio_button_links ਀ऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM doc_attr.doc_radio_button_list_names ਀ऀऀ       圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	  COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nonameidmessage <> '')            SET @message = @message + ' | ' + @nonameidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_doc_rb_attr_fg_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Deletes a document radio button attribute to filter group link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_rb_attr_fg_link]਀      
	 @docradiobattrid bigint          = NULL,਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @docradiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @docradiobattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀  洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  IF @docradiobattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT doc_radiob_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE doc_radiob_attr_id = @docradiobattrid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀     
		  -- Check if the record exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND NOT EXISTS (SELECT doc_radiob_attr_id਀ऀऀऀऀऀऀऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				    WHERE doc_radiob_attr_id = @docradiobattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀    昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀  搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
		       WHERE      doc_radiob_attr_id = @docradiobattrid਀ऀऀऀ          䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_doc_real_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_real_number_field_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 椀琀攀洀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_real_field_name] ਀ 
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@nonameidmessage nvarchar(200)          = '', -- Communicates that no name id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
						    FROM doc_attr.doc_real_number_field_names ਀ऀऀऀऀऀ       圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
				   FROM doc_attr.doc_real_number_values ਀ऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT doc_real_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 
					WHERE doc_real_name_id = @id_to_delete) ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
		       WHERE doc_real_name_id = @id_to_delete;਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
-- Input is the id of the item to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_doc_text_field_name] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the document name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT doc_free_text_name_id ਀ऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
					   WHERE doc_free_text_name_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT doc_free_text_name_id ਀ऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀  
				  WHERE doc_free_text_name_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
					 FROM forms.form_doc_free_text_field_links਀ऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM doc_attr.doc_free_text_field_names ਀ऀऀ       圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nonameidmessage <> '')            SET @message = @message + ' | ' + @nonameidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
-- Input is the id of the item to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_file_date_field_name] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the date field name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀  
					   WHERE file_date_name_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT file_date_name_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀  
				  WHERE file_date_name_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
					 FROM forms.form_file_date_field_links਀ऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM file_attr.file_date_field_names ਀ऀऀ       圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nonameidmessage <> '')            SET @message = @message + ' | ' + @nonameidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开椀渀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
-- Input is the id of the item to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_file_int_field_name] ਀ 
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀渀琀攀最攀爀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@nonameidmessage nvarchar(200)          = '', -- Communicates that no name id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
						    FROM file_attr.file_integer_field_names ਀ऀऀऀऀऀ       圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
				   FROM file_attr.file_integer_values ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 
					WHERE file_int_name_id = @id_to_delete) ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
		       WHERE file_int_name_id = @id_to_delete;਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_file_ms_attr_fg_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Deletes a file multi-select attribute to filter group link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_file_ms_attr_fg_link]਀      
	 @filemsattrid bigint             = NULL,਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @filemsattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @filemsattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀  洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  IF @filemsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE file_ms_attr_id = @filemsattrid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀     
		  -- Check if the record exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				    WHERE file_ms_attr_id = @filemsattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀  昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
		       WHERE      file_ms_attr_id = @filemsattrid਀ऀऀऀ          䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开洀猀开愀琀琀爀椀戀甀琀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 
-- Input is the id of the radio button attribute to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开洀猀开愀琀琀爀椀戀甀琀攀崀  
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@nonameidmessage nvarchar(200)          = '', -- Communicates that no name id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀  
							FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀  
				   FROM file_attr.file_multi_select_links ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
	  OR EXISTS (SELECT file_ms_attr_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
				  WHERE file_ms_attr_id = @id_to_delete)  ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
		       WHERE file_ms_attr_id = @id_to_delete;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_file_ms_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_multi_select_list_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_file_ms_list] ਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the radio button list name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT file_ms_list_id ਀ऀऀऀऀऀऀ    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
					       WHERE file_ms_list_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT file_ms_list_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
				  WHERE file_ms_list_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀  
					 FROM forms.form_file_multi_sel_list_links ਀ऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM file_attr.file_multi_select_list_names ਀ऀऀ       圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
       COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nonameidmessage <> '')            SET @message = @message + ' | ' + @nonameidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_file_radiob_attr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_radio_button_attributes਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀崀  
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)    = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)     = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@nonameidmessage nvarchar(200)      = '', -- Communicates that no name id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)        = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT file_radiob_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE file_radiob_attr_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT file_radiob_attr_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
				  WHERE file_radiob_attr_id = @id_to_delete) ਀      伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
				   FROM file_attr.file_radiob_attr_fgroup_links ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM file_attr.file_radio_button_attributes ਀ऀऀ       圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nonameidmessage <> '')            SET @message = @message + ' | ' + @nonameidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_file_radiob_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_radio_button_list_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀崀  
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@nonameidmessage nvarchar(200)          = '', -- Communicates that no name id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
						FROM file_attr.file_radio_button_list_names ਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
				   FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT file_radiob_list_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
					WHERE file_radiob_list_id = @id_to_delete) ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
		       WHERE file_radiob_list_id = @id_to_delete;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_file_rb_attr_fg_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Deletes a file radio button attribute to filter group link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_file_rb_attr_fg_link]਀        
	 @file_radiobattrid bigint        = NULL,਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @file_radiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @file_radiobattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀渀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  IF @file_radiobattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT file_radiob_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE file_radiob_attr_id = @file_radiobattrid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀     
		  -- Check if the record exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND NOT EXISTS (SELECT file_radiob_attr_id਀ऀऀऀऀऀऀऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				    WHERE file_radiob_attr_id = @file_radiobattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀  昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
		       WHERE      file_radiob_attr_id = @file_radiobattrid਀ऀऀऀ          䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_file_real_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from file_real_number_field_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 椀琀攀洀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开爀攀愀氀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the real number name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
						    FROM file_attr.file_real_number_field_names ਀ऀऀऀऀऀ       圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
				   FROM file_attr.file_real_number_values ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		OR EXISTS (SELECT file_real_name_id ਀ऀऀऀऀऀ 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 
					WHERE file_real_name_id = @id_to_delete) ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
		       WHERE file_real_name_id = @id_to_delete;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
-- Input is the id of the item to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_file_text_field_name] ਀ 
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@nonameidmessage nvarchar(200)          = '', -- Communicates that no name id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nonameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nonameidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT file_free_text_name_id ਀ऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
					   WHERE file_free_text_name_id = @id_to_delete)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF EXISTS (SELECT file_free_text_name_id ਀ऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀  
				  WHERE file_free_text_name_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
					 FROM forms.form_file_free_text_links਀ऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM file_attr.file_free_text_field_names ਀ऀऀ       圀䠀䔀刀䔀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	    COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nonameidmessage <> '')            SET @message = @message + ' | ' + @nonameidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_filter_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 昀椀氀琀攀爀 最爀漀甀瀀 
-- Input is a filter group id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_filter_group]਀ 
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that no record id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一愀洀攀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							FROM forms.filter_groups ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀  䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀       圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
	   OR EXISTS (SELECT filter_group_id FROM doc_attr.doc_radiob_attr_fgroup_links   WHERE filter_group_id = @id_to_delete)਀ऀ   伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  ऀ  圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
	   OR EXISTS (SELECT filter_group_id FROM file_attr.file_radiob_attr_fgroup_links WHERE filter_group_id = @id_to_delete)  ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END  -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
		       WHERE filter_group_id = @id_to_delete;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_form_group_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 昀漀爀洀 最爀漀甀瀀 
-- Input is a form group id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_form_group_name]਀ 
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)    = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀漀爀洀 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	    @xrefexistmessage nvarchar(200)     = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@norecordmessage nvarchar(200)      = '', -- Communicates that no record id was supplied਀ऀऀ䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀倀愀猀猀✀Ⰰ 
		@transaction_ready nchar(10)        = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀 挀漀渀琀爀漀氀氀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一愀洀攀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀  
							FROM forms.form_group_names ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
	 -- Check for any referential constraints਀ऀ  䤀䘀  䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀  
			  FROM forms.form_identifier_names  ਀ऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT form_group_id ਀ऀऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀   
					WHERE form_group_id = @id_to_delete)਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  䤀䘀 ⠀䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀⤀ 
		 BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'RefIntegrityError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
  			 ELSE ਀ऀऀऀ   匀䔀吀 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀⸀✀㬀 
	  END਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
		       WHERE form_group_id = @id_to_delete;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀㬀 
	IF (@xrefexistmessage <> '')           SET @message = @message + ' | ' + @xrefexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_general_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Delete a record from people.general_field_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 椀搀 漀昀 琀栀攀 椀琀攀洀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the file name id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 渀愀洀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID exists਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀  
						FROM people.general_field_names ਀ऀऀऀऀऀ   圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
਀ 
	  IF @data_validation_status = 'Fail'  ਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM people.general_field_names ਀ऀऀ       圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	    COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nonameidmessage <> '')            SET @message = @message + ' | ' + @nonameidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_unit_of_measure]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 甀渀椀琀 漀昀 洀攀愀猀甀爀攀 
-- Input is a record id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀 
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notexistmessage nvarchar(200)          = '', -- Communicates that the filter group id does not exist਀ऀ    䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 愀爀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀栀愀琀 攀砀椀猀琀 
		@refintegritymessage nvarchar(200)      = '', -- Communicates that there was a referential integrity check failure਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 䤀䐀 攀砀椀猀琀猀 
	 IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordmessage = 'A database level message error occurred on NoNameID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT unit_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀  
						   WHERE unit_id = @id_to_delete) ਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF  EXISTS (SELECT unit_id ਀ऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀   
			 WHERE unit_id = @id_to_delete) ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 甀渀椀琀开椀搀  
					 FROM doc_attr.doc_real_number_field_names  ਀ऀऀऀऀऀ圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
		OR EXISTS (SELECT unit_id਀ऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
					WHERE unit_id = @id_to_delete)਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 甀渀椀琀开椀搀 
					 FROM file_attr.file_real_number_field_names  ਀ऀऀऀऀऀ圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀   
		  BEGIN਀ ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			  @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @xrefexistmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' +  @tempmessage;਀ऀऀऀ䔀䰀匀䔀 
				 SET @xrefexistmessage = 'A database level message error occurred on XRefExists.';਀ऀऀऀ匀䔀吀 䀀爀攀昀攀爀攀渀琀椀愀氀开挀栀攀挀欀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
	-- End of validation checks਀    䔀一䐀  ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM base.units_of_measure ਀ऀऀ       圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_wf_step_status_defn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Deletes a record from workflow_instances.step_status_definition table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_wf_step_status_defn] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT step_status_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE step_status_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_instances.step_status_definitions ਀ऀऀ       圀䠀䔀刀䔀 猀琀攀瀀开猀琀愀琀甀猀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ   
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_workflow_action]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Deletes a record from workflow_models.workflow_actions table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_workflow_action] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_action_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀 
							 WHERE workflow_action_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_models.workflow_actions ਀ऀऀ       圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_workflow_model]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Deletes a record from workflow_model.workflow_names table ਀ⴀⴀ 瀀氀甀猀 挀愀猀挀愀搀攀 搀攀氀攀琀椀渀最 挀漀爀爀攀猀瀀漀渀搀椀渀最 爀攀挀漀爀搀猀 椀渀 眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀Ⰰ 
-- workflow_step_transitions and workflow_rule_links.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_workflow_model] ਀ 
     @workflow_model_id bigint        = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 　 
		 SET @workflow_model_id = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @workflow_model_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
							 WHERE workflow_model_id = @workflow_model_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		 -- Check if an instance exists.  A model may not be deleted if a corresponding instance exists.਀ 
		 IF EXISTS (SELECT workflow_model_id਀ऀऀ              䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀椀搀 
					 WHERE wid.workflow_model_id ਀ऀऀऀऀऀ       㴀  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀⤀ 
				BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfInstanceExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀愀渀挀攀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀऀⴀⴀ 䐀攀氀攀琀攀 愀渀礀 爀甀氀攀 氀椀渀欀猀 
		DELETE FROM workflow_models.workflow_rule_links਀ऀऀऀ  圀䠀䔀刀䔀 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 䤀一 ⠀ 
					SELECT wrl.step_transition_id਀ऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
				INNER JOIN workflow_models.workflow_rule_links AS wrl਀ऀऀऀऀ        伀一   眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
						   = wrl.step_transition_id਀ऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
				        ON   wst.$from_id਀ऀऀऀऀऀऀ   㴀 眀猀搀⸀␀渀漀搀攀开椀搀 
						OR   wst.$to_id਀ऀऀऀऀऀऀ   㴀 眀猀搀⸀␀渀漀搀攀开椀搀 
				INNER JOIN workflow_models.workflow_model_names AS wmn਀ऀऀऀऀ        伀一   眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
						   = wmn.workflow_model_id਀ऀऀऀऀऀ 圀䠀䔀刀䔀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					       =  @workflow_model_id)਀ 
਀     ⴀⴀ 䐀攀氀攀琀攀 爀攀氀愀琀攀搀 攀搀最攀猀 ⼀ 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀猀⸀  
		DELETE FROM workflow_models.workflow_step_transitions਀ऀऀऀऀ圀䠀䔀刀䔀 ␀昀爀漀洀开椀搀 䤀一 ⠀ 
					  SELECT $node_id਀ऀऀऀऀऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
				  INNER JOIN workflow_models.workflow_model_names AS wmn਀ऀऀऀऀ          伀一   眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
						     = wmn.workflow_model_id਀ऀऀऀऀऀ   圀䠀䔀刀䔀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					         =  @workflow_model_id਀ऀऀऀऀऀ  ⤀ 
				OR $to_id IN (਀ऀऀऀऀऀ  匀䔀䰀䔀䌀吀 ␀渀漀搀攀开椀搀 
					    FROM workflow_models.workflow_step_definitions AS wsd਀ऀऀऀऀ  䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
				          ON   wsd.workflow_model_id਀ऀऀऀऀऀऀ     㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					   WHERE wmn.workflow_model_id਀ऀऀऀऀऀ         㴀  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					  );਀ 
਀     ⴀⴀ 䐀攀氀攀琀攀 爀攀氀愀琀攀搀 猀琀攀瀀 搀攀昀椀渀椀琀椀漀渀猀⸀  
		DELETE FROM workflow_models.workflow_step_definitions਀  ऀऀ      圀䠀䔀刀䔀     眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
					=  @workflow_model_id;਀ऀऀऀऀऀ   
਀        ⴀⴀ 䐀攀氀攀琀攀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 洀漀搀攀氀 渀愀洀攀猀 琀愀戀氀攀 
	     DELETE FROM workflow_models.workflow_model_names ਀ऀऀ       圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀㬀  
਀ऀऀ䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	   IF @@TRANCOUNT > 0    ROLLBACK TRANSACTION;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_workflow_output_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Deletes a record from workflow_instances.workflow_output_definitions table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_workflow_output_def] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT output_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE output_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_instances.workflow_output_definitions ਀ऀऀ       圀䠀䔀刀䔀 漀甀琀瀀甀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_workflow_rule]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Deletes a record from workflow_model.workflow_rules table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_workflow_rule] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT rule_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀 
							 WHERE rule_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_models.workflow_rules ਀ऀऀ       圀䠀䔀刀䔀 爀甀氀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_workflow_rule_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Deletes a workflow model rule to workflow model step transition link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 眀漀爀欀昀氀漀眀 爀甀氀攀 䤀䐀 愀渀搀 愀 眀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 䤀䐀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_workflow_rule_link]਀      
	 @workflow_rule_id bigint         = NULL,਀ऀ 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
	਀     
		  -- Check if the record exists਀ऀऀऀ䤀䘀  一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀甀氀攀开椀搀 
							 FROM workflow_models.workflow_rule_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀             爀甀氀攀开椀搀  
							      = @workflow_rule_id							      ਀ऀऀऀऀऀऀऀ  䄀一䐀     猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
							      =  @step_transitionid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_models.workflow_rule_links ਀ऀऀऀऀ圀䠀䔀刀䔀             爀甀氀攀开椀搀  
						= @workflow_rule_id							      ਀ऀऀऀऀऀ䄀一䐀     猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
						=  @step_transitionid਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_workflow_step_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Deletes a record from workflow_models.step_definition table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_workflow_step_def] ਀ 
     @model_step_id bigint            = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀        䀀搀攀氀攀琀攀搀开渀漀搀攀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @model_step_id = 0਀ऀऀ 匀䔀吀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
							  FROM workflow_models.workflow_step_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY਀ 
	   BEGIN TRANSACTION;਀     ⴀⴀ 䐀攀氀攀琀攀 爀攀氀愀琀攀搀 攀搀最攀猀 ⼀ 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀猀⸀  
		DELETE FROM workflow_models.workflow_step_transitions਀ऀऀऀऀ圀䠀䔀刀䔀 ␀昀爀漀洀开椀搀 䤀一 ⠀ 
					  SELECT $node_id਀ऀऀऀऀऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀猀搀 
					   WHERE wsd.workflow_model_step_id = @model_step_id਀ऀऀऀऀऀ  ⤀ 
				OR $to_id IN (਀ऀऀऀऀऀ  匀䔀䰀䔀䌀吀 ␀渀漀搀攀开椀搀 
					    FROM workflow_models.workflow_step_definitions AS wsd਀ऀऀऀऀऀ   圀䠀䔀刀䔀 眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 
					  );਀ 
਀       ⴀⴀ 䐀攀氀攀琀攀 琀栀攀 猀琀攀瀀 
	     DELETE FROM workflow_models.workflow_step_definitions ਀ऀऀ       圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀㬀  
਀ 
਀ऀऀऀ䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ   䤀䘀 䀀䀀吀刀䄀一䌀伀唀一吀 㸀 　  刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
			CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 琀栀攀 爀攀挀漀爀搀 昀漀爀 愀 最椀瘀攀渀 眀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀⸀  
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_DEL_workflow_step_transn]਀ 
	  @step_transitionid bigint        = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT  -- Transaction status passed back to the application਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10) = 'Fail'; -- The outcome of the authentication check of the user ਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀      ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the workflow step transition exists  ਀ऀ  䤀䘀 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 㴀 　  
		 SET @step_transitionid = NULL;਀ऀऀ䤀䘀 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			BEGIN -- A workflow rule id has not been supplied.਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWflTransID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀氀吀爀愀渀猀䤀䐀⸀✀⤀㬀 
			END਀ 
	  ELSE -- Workflow step transition ID has been supplied.  Check if it exists. ਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT step_transition_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀  
							 WHERE    step_transition_id ਀ऀऀऀऀऀऀऀ       㴀 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀⤀  
				 BEGIN  -- The step transition ID does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfTransIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀吀爀愀渀猀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
    END -- End IF user authentication = Pass  ਀ 
਀ 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀   
   BEGIN਀ऀ䈀䔀䜀䤀一 吀刀夀 
	BEGIN TRANSACTION;਀ऀऀⴀⴀ 䘀椀爀猀琀 搀攀氀攀琀攀 愀渀礀 爀甀氀攀 氀椀渀欀猀 
		DELETE FROM workflow_models.workflow_rule_links ਀ऀऀऀ  圀䠀䔀刀䔀 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
					=  @step_transitionid਀ 
	   -- Delete the step transition ID਀ऀ   䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 
			 WHERE     step_transition_id ਀ऀऀऀऀ   㴀  䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 
    COMMIT TRANSACTION;਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	  IF @@TRANCOUNT > 0    ROLLBACK TRANSACTION;਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_DEL_xref_type]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 琀礀瀀攀⸀ 
-- Input is the recordid.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- ================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开砀爀攀昀开琀礀瀀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT xref_type_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀  
							 WHERE xref_type_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
    END -- End IF user authentication = Pass ਀ 
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀 
		      WHERE xref_type_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_com_obj_attribute]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Creates a common object attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀⸀ 
-- Output is a message, transaction status and the new record id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_com_obj_attribute] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
				FROM com_obj.common_object_attributes ਀ऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO com_obj.common_object_attributes ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description); ਀ऀऀ 匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL)  ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀洀开漀戀樀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a common object list name record਀ⴀⴀ 䤀渀瀀甀琀 椀猀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀⸀   
-- Output is a status message, a transaction status and the id of the new record.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_com_obj_list_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀氀椀猀琀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀漀爀攀椀最渀 欀攀礀 椀猀 椀渀瘀愀氀椀搀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @listname = ''਀ऀऀऀ匀䔀吀 䀀氀椀猀琀渀愀洀攀 㴀 一唀䰀䰀㬀 
		IF EXISTS (SELECT list_name ਀ऀऀ ऀऀ ऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
					WHERE list_name = @listname) ਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notuniquemessage = ISNULL(LEFT(@listname, 10), '') + '... | ' + @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
		 @mnem             = @mnemonic,਀ऀऀ 䀀愀琀琀爀开渀愀洀攀        㴀 䀀氀椀猀琀渀愀洀攀Ⰰ 
		 @descr            = @description,਀ऀऀ 䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
		 @messg            = @validationmessage OUTPUT;਀ऀ   䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
	      BEGIN਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			  SET @data_validation_status = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 愀琀琀爀椀戀甀琀攀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjattrid IS NOT NULL਀ऀऀ   䈀䔀䜀䤀一 
		     IF NOT EXISTS (SELECT common_object_attribute_id਀ऀऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 
						      WHERE common_object_attribute_id = @commonobjattrid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @xrefinvalidmessage = CONVERT(nvarchar(10), @commonobjattrid) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @xrefinvalidmessage = 'A database level message error occurred on ComObjAttrNotExist';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
		             (mnem,      list_name, description,   common_object_attribute_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀氀椀猀琀渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@xrefinvalidmessage <> '')         SET @message = @message + ' | ' + @xrefinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_doc_date_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 挀爀漀猀猀 搀漀挀 搀愀琀攀 昀椀攀氀搀 渀愀洀攀 
-- by inserting a record into doc_attr.doc_date_field_names.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 昀椀攀氀搀 渀愀洀攀㨀 
-- mnemonic, name, description.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 ✀✀ 
		SET @attribute_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT attr_name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀  
					WHERE attr_name = @attribute_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				    SET @message = CONCAT(@message, ' | ', ISNULL(LEFT(@attribute_name, 10), ''), '... | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO doc_attr.doc_date_field_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开椀渀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document integer field name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 搀漀挀开椀渀琀开昀椀攀氀搀开渀愀洀攀猀⸀ 
-- Input is the paramters for a document integer field name:਀ⴀⴀ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 愀 甀渀椀琀 椀搀⸀   
-- Output is a status message, a transaction status and the id of the new record. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_doc_int_field_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀甀渀椀琀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied	਀ऀऀ䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀渀椀琀 䤀䐀 猀甀瀀瀀氀椀攀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 ✀✀ 
		SET @attribute_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT attr_name ਀ऀऀ ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
					WHERE attr_name = @attribute_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @notuniquemessage = ISNULL(LEFT(@attribute_name, 10), '') + '... | ' + @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
        -- Validate the unit_id਀ऀ䤀䘀 䀀甀渀椀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
	  BEGIN਀ऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 甀渀椀琀开椀搀 
		                 FROM base.units_of_measure਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀甀渀椀琀椀搀⤀ 
		   BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';		       ਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'UnitIDNotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀ匀䔀吀 䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀渀椀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
		   END਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀渀椀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @transactionmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO doc_attr.doc_integer_field_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ        甀渀椀琀开椀搀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @unitid); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开洀猀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a multi-select attribute id and filter group id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开洀猀开愀琀琀爀开昀最开氀椀渀欀崀 
     ਀ऀ 䀀搀漀挀洀猀愀琀琀爀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @filtergroupid bigint            = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀    
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 　  
			 SET @docmsattrid = NULL;਀  
		  -- Check if a doc multi-select attribute id was supplied. ਀ऀऀ  䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
								  FROM doc_attr.doc_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀⤀ 
					 BEGIN -- multi-select attribute id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀      ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
		 ELSE਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀琀攀爀䜀爀漀甀瀀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFilterGroup.');਀ऀऀऀऀ 䔀一䐀  
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
							 FROM doc_attr.doc_ms_attr_fgroup_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀      搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								  AND filter_group_id = @filtergroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO doc_attr.doc_ms_attr_fgroup_links ਀ऀऀ             ⠀搀漀挀开洀猀开愀琀琀爀开椀搀Ⰰ 昀椀氀琀攀爀开最爀漀甀瀀开椀搀⤀ 
		      VALUES (@docmsattrid,   @filtergroupid)਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 
-- Input is the text fields, position, filter group and list name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = NULL,਀ऀ 䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),     ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
				   FROM doc_attr.doc_multi_select_attributes ਀ऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀开猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
	  IF @docmslistid = 0 ਀ऀऀ 匀䔀吀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @docmslistid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一   
			 IF NOT EXISTS (SELECT doc_ms_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_ms_list_id = @docmslistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 洀甀氀琀椀开猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
		             (mnem,      attr_name,       descr,       list_position,  doc_ms_list_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀Ⰰ    䀀搀漀挀洀猀氀椀猀琀椀搀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document multi-select list name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀⸀   
-- Output is a status message, a transaction status and the id of the new record.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_doc_multi_select_list] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 ✀✀ 
			SET @attribute_name = NULL;਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 		 	 FROM doc_attr.doc_multi_select_list_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
	   EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀ 䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
		 @attr_name        = @attribute_name,਀ऀऀ 䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
		 @data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀ 䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	   IF @tempvalidationstatus = 'Fail'਀ऀ      䈀䔀䜀䤀一 
		      SET @transaction_ready      = 'Fail';਀ऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    BEGIN TRANSACTION਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
		             (mnem,      attr_name,       descr,         list_position)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ    䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_doc_radiob_attr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Creates a document radio button attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀Ⰰ 瀀漀猀椀琀椀漀渀 愀渀搀 氀椀猀琀 渀愀洀攀 椀搀⸀ 
-- Output is a message, transaction status and the new record id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_doc_radiob_attr] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @doc_radioblistid bigint         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),     ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
				FROM doc_attr.doc_radio_button_attributes ਀ऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀✀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
	  IF @doc_radioblistid = '' ਀ऀऀ 匀䔀吀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @doc_radioblistid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一   
			 IF NOT EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_radiob_list_id = @doc_radioblistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		             (mnem,      attr_name,       descr,         list_position, doc_radiob_list_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀Ⰰ 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开爀愀搀椀漀戀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
/* ਀   䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 
   by inserting a record into doc_radio_button_list_names.਀⨀⼀ 
-- Input is the paramters for a document radio button list name.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_doc_radiob_list] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @restricted bit                  = 0,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @attribute_name = ''਀ऀऀऀ匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		IF EXISTS (SELECT attr_name ਀ऀऀ ऀऀ ऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
					WHERE attr_name = @attribute_name) ਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notuniquemessage = ISNULL(LEFT(@attribute_name, 10), '') + '... | ' + @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
		 @mnem             = @mnemonic,਀ऀऀ 䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
		 @descr            = @description,਀ऀऀ 䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
		 @messg            = @validationmessage OUTPUT;਀ऀ   䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
	      BEGIN਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			  SET @data_validation_status = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO doc_attr.doc_radio_button_list_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ        氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ  爀攀猀琀爀椀挀琀攀搀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @listposition, @restricted); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	    COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_doc_rb_attr_fg_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Inserts a document radio button attribute to filter group link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_doc_rb_attr_fg_link]਀      
	 @docradiobattrid bigint          = NULL,਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @docradiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @docradiobattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀渀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  IF @docradiobattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT doc_radiob_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE doc_radiob_attr_id = @docradiobattrid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ  愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
      -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀ऀऀ 䔀䰀匀䔀 
				 BEGIN  -- The filter group has not been supplied਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoFilterGroup', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀琀攀爀䜀爀漀甀瀀⸀✀⤀㬀 
				 END ਀     
		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT doc_radiob_attr_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				WHERE doc_radiob_attr_id = @docradiobattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
		             (doc_radiob_attr_id, filter_group_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀Ⰰ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_doc_real_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 渀愀洀攀 
-- by inserting a record into doc_real_number_field_names.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 渀愀洀攀㨀 
-- mnemonic, name, description and a unit id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开爀攀愀氀开昀椀攀氀搀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @unitid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@unitnotexistmessage nvarchar(200)	    = '', -- Communicates that the unit ID supplied does not exist਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @attribute_name = ''਀ऀऀ匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 			FROM doc_attr.doc_real_number_field_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀        ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 甀渀椀琀开椀搀 
	  IF @unitid IS NOT NULL਀ऀ   䈀䔀䜀䤀一 
		IF NOT EXISTS (SELECT unit_id਀ऀऀ                 䘀刀伀䴀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 
						WHERE unit_id = @unitid)਀ऀऀ   䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀ऀऀ        
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀渀椀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @unitnotexistmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
				SET @unitnotexistmessage = 'A database level message error occurred on UnitIDNotExist.';਀ऀऀ   䔀一䐀 
	  END਀ऀऀऀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @transactionmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO doc_attr.doc_real_number_field_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ        甀渀椀琀开椀搀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @unitid); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document free text field name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀⸀ 
-- Input is the paramters for a document free text field name:਀ⴀⴀ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 昀漀爀洀愀琀⸀   
-- Output is a status message, a transaction status and the id of the new record. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_doc_text_field_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 ✀✀ 
		SET @attribute_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT attr_name ਀ऀऀ ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
					WHERE attr_name = @attribute_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @notuniquemessage = ISNULL(LEFT(@attribute_name, 10), '') + '... | ' + @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
		             (mnem,      attr_name,       descr)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_file_date_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 昀椀氀攀 搀愀琀攀 昀椀攀氀搀 渀愀洀攀 
-- by inserting a record into file_date_field_names.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 昀椀氀攀 搀愀琀攀 昀椀攀氀搀 渀愀洀攀㨀 
-- mnemonic, name, description and format.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied	਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @attribute_name = ''਀ऀऀ匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 			FROM file_attr.file_date_field_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @transactionmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO file_attr.file_date_field_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开椀渀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new file integer field name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 昀椀氀攀开椀渀琀开昀椀攀氀搀开渀愀洀攀猀⸀ 
-- Input is the paramters for a file integer field name:਀ⴀⴀ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 愀 甀渀椀琀 椀搀⸀   
-- Output is a status message, a transaction status and the id of the new record. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_file_int_field_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀甀渀椀琀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied	਀ऀऀ䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀渀椀琀 䤀䐀 猀甀瀀瀀氀椀攀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 ✀✀ 
		SET @attribute_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT attr_name ਀ऀऀ ऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
					WHERE attr_name = @attribute_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @notuniquemessage = ISNULL(LEFT(@attribute_name, 10), '') + '... | ' + @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
        -- Validate the unit_id਀ऀ䤀䘀 䀀甀渀椀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
	  BEGIN਀ऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 甀渀椀琀开椀搀 
		                 FROM base.units_of_measure਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 甀渀椀琀开椀搀 㴀 䀀甀渀椀琀椀搀⤀ 
		   BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';		       ਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'UnitIDNotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀ匀䔀吀 䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀渀椀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
		   END਀ऀऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀渀椀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
			਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
		             (mnem,      attr_name,       descr,        unit_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀甀渀椀琀椀搀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ    䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开洀猀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a multi-select attribute id and filter group id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开洀猀开愀琀琀爀开昀最开氀椀渀欀崀 
     ਀ऀ 䀀昀椀氀攀洀猀愀琀琀爀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @filtergroupid bigint            = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀    
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 　  
			 SET @filemsattrid = NULL;਀  
		  -- Check if a file multi-select attribute id was supplied. ਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 
								  FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀ 
					 BEGIN -- multi-select attribute id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀      ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
		 ELSE਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀琀攀爀䜀爀漀甀瀀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFilterGroup.');਀ऀऀऀऀ 䔀一䐀  
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 
							 FROM file_attr.file_ms_attr_fgroup_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀     昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								  AND filter_group_id = @filtergroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO file_attr.file_ms_attr_fgroup_links ਀ऀऀ             ⠀昀椀氀攀开洀猀开愀琀琀爀开椀搀Ⰰ 昀椀氀琀攀爀开最爀漀甀瀀开椀搀⤀ 
		      VALUES (@filemsattrid,  @filtergroupid)਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_file_ms_attribute]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Creates a file multi-select attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 昀椀氀琀攀爀 最爀漀甀瀀 愀渀搀 氀椀猀琀 渀愀洀攀 椀搀⸀ 
-- Output is a message, transaction status and the new record id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_file_ms_attribute] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @file_mslistid bigint            = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
				   FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀✀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ 
	  -- Check that the multi_select list name id exists਀ऀ  䤀䘀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀 㴀 　  
		 SET @file_mslistid = NULL;਀ऀ  䤀䘀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN  ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
							  FROM file_attr.file_multi_select_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀⤀  
				 BEGIN -- multi_select list name id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一 
	     INSERT INTO file_attr.file_multi_select_attributes ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ       氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ   昀椀氀攀开洀猀开氀椀猀琀开椀搀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @listposition, @file_mslistid); ਀ऀ      匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL)  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new file multi-select list name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀⸀   
-- Output is a status message, a transaction status and the id of the new record.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_file_multi_select_list] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 ✀✀ 
			SET @attribute_name = NULL;਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 		 	 FROM file_attr.file_multi_select_list_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
	   EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀ 䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
		 @attr_name        = @attribute_name,਀ऀऀ 䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
		 @data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀ 䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	   IF @tempvalidationstatus = 'Fail'਀ऀ      䈀䔀䜀䤀一 
		      SET @transaction_ready      = 'Fail';਀ऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
		             (mnem,      attr_name,       descr,         list_position)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 
-- Input is the text fields, position, filter group and list name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_file_radiob_attr] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @file_radioblistid bigint        = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀          
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
				   FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀✀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ 
	  -- Check that the radio button list name id exists਀ऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　  
		 SET @file_radioblistid = NULL;਀ऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN  ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
							  FROM file_attr.file_radio_button_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀⤀  
				 BEGIN -- Radio button list name id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO file_attr.file_radio_button_attributes ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ        氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ  昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @listposition, @file_radioblistid); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
			CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
/* ਀   䌀爀攀愀琀攀猀 愀 渀攀眀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 
   by inserting a record into file_radio_button_list_names.਀⨀⼀ 
-- Input is the paramters for a file radio button list name.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
-- 05-08-2023  Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_file_radiob_list] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @restricted bit                  = 0,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
					  FROM file_attr.file_radio_button_list_names ਀ऀऀऀऀऀ 圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
		              (mnem,      attr_name,       descr,        list_position, restricted)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀Ⰰ 䀀爀攀猀琀爀椀挀琀攀搀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_file_rb_attr_fg_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Inserts a file radio button attribute to filter group link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_file_rb_attr_fg_link]਀      
	 @file_radiobattrid bigint        = NULL,਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @file_radiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @file_radiobattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀渀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  IF @file_radiobattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT file_radiob_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE file_radiob_attr_id = @file_radiobattrid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ  愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
      -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀ऀऀ 䔀䰀匀䔀 
				 BEGIN  -- The filter group has not been supplied਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoFilterGroup', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀琀攀爀䜀爀漀甀瀀⸀✀⤀㬀 
				 END ਀     
		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT file_radiob_attr_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				WHERE file_radiob_attr_id = @file_radiobattrid							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
		             (file_radiob_attr_id, filter_group_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀Ⰰ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
        COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	  ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_file_real_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 渀愀洀攀 
-- by inserting a record into file_real_number_field_names.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 渀愀洀攀㨀 
-- mnemonic, name, description and a unit id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开爀攀愀氀开昀椀攀氀搀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @unitid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@unitnotexistmessage nvarchar(200)	    = '', -- Communicates that the unit ID supplied does not exist਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @attribute_name = ''਀ऀऀ匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 			FROM file_attr.file_real_number_field_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀        ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 甀渀椀琀开椀搀 
	IF @unitid IS NOT NULL਀ऀ  䈀䔀䜀䤀一 
		IF NOT EXISTS (SELECT unit_id਀ऀऀ                 䘀刀伀䴀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 
						WHERE unit_id = @unitid)਀ऀऀ   䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀ऀऀ        
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀渀椀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @unitnotexistmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
				SET @unitnotexistmessage = 'A database level message error occurred on UnitIDNotExist.';਀ऀऀ   䔀一䐀 
	 END਀ऀऀऀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @transactionmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO file_attr.file_real_number_field_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ        甀渀椀琀开椀搀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @unitid); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	  ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀甀渀椀琀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new file free text field name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀⸀ 
-- Input is the paramters for a file free text field name:਀ⴀⴀ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 昀漀爀洀愀琀⸀   
-- Output is a status message, a transaction status and the id of the new record.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_file_text_field_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 ✀✀ 
		SET @attribute_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT attr_name ਀ऀऀ ऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
					WHERE attr_name = @attribute_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @notuniquemessage = ISNULL(LEFT(@attribute_name, 10), '') + '... | ' + @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
		             (mnem,      attr_name,       descr)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀琀攀爀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 22-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 昀椀氀琀攀爀 最爀漀甀瀀 
-- Input is a mnemonic, name, description and position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_filter_group]਀  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied		਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		 IF EXISTS (SELECT attr_name ਀ऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
					 WHERE attr_name = @attribute_name)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO forms.filter_groups (mnem, attr_name, descr, list_position)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ  䀀氀椀猀琀瀀漀猀椀琀椀漀渀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_form_group_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀  
   Creates a new form group name਀   戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀⸀ 
*/਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀琀攀爀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀⸀   
-- Output is a status message, a transaction status and the id of the new record.  ਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀  䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开最爀漀甀瀀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
					  FROM forms.form_group_names ਀ऀऀऀऀऀ 圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 ⠀洀渀攀洀Ⰰ 愀琀琀爀开渀愀洀攀Ⰰ 搀攀猀挀爀Ⰰ 氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @listposition); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	  ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into [people].[general_field_names] ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_general_field_name] ਀ 
     @mnemonic nvarchar(10)           = '',             ਀ऀ 䀀最攀渀攀爀愀氀昀椀攀氀搀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 @description nvarchar(max)       = '',਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
	  IF EXISTS (SELECT pln.name਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 瀀氀渀 
				  WHERE pln.name = @generalfield_name)਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@generalfield_name, 10), '...  ',  @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique.');਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @generalfield_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
				  SET @message = CONCAT_WS(' |', @message, @validationmessage); ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO people.general_field_names਀ऀऀ             ⠀洀渀攀洀Ⰰ                              渀愀洀攀Ⰰ           搀攀猀挀爀椀瀀琀椀漀渀Ⰰ       氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @generalfield_name,   ISNULL(@description, ''), @listposition); ਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 猀琀愀琀甀猀 搀攀昀椀渀椀琀椀漀渀  
-- Input is the text fields and list position.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),     ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
				FROM workflow_instances.step_status_definitions਀ऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀✀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀  
		             (mnem,      attr_name,       descr,         list_position)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀⤀㬀 
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
  END਀ 
 END -- END IF user authentication = Pass਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_unit_of_measure]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Adds a unit of measure to base.units_of_measure਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 甀渀椀琀猀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀⸀ 
-- Output is a message, transaction status and the new record id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀  
਀ऀ 䀀甀渀椀琀漀昀洀攀愀猀甀爀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀      㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(250)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied		਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ऀ䤀䘀 䀀搀攀猀挀爀椀瀀琀椀漀渀 䤀匀 一唀䰀䰀 匀䔀吀 䀀搀攀猀挀爀椀瀀琀椀漀渀 㴀 ✀✀㬀 
਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check if a unit of measure has been supplied਀ऀ  䤀䘀 䀀甀渀椀琀漀昀洀攀愀猀甀爀攀 䤀匀 一唀䰀䰀 伀刀 䀀甀渀椀琀漀昀洀攀愀猀甀爀攀 㴀 ✀✀ 
	    BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoAttrName', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀一愀洀攀✀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀ 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 甀渀椀琀  
				    FROM base.units_of_measure ਀ऀऀऀऀ   圀䠀䔀刀䔀 甀渀椀琀 㴀 䀀甀渀椀琀漀昀洀攀愀猀甀爀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀甀渀椀琀漀昀洀攀愀猀甀爀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO base.units_of_measure ਀ऀऀ             ⠀甀渀椀琀Ⰰ           搀攀猀挀爀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (@unitofmeasure, @description, @listposition); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL)  ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	  ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开愀挀琀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 渀愀洀攀  
-- Input is the text fields and list position.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开愀挀琀椀漀渀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
				FROM workflow_models.workflow_actions਀ऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀✀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀  
		             (mnem,      attr_name,       descr,         list_position)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ   
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_workflow_model_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Creates a workflow model name ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀⸀ 
-- Output is a message, transaction status and the new record id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_workflow_model_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
	  IF EXISTS (SELECT attr_name ਀ऀऀऀऀ䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
				WHERE attr_name = @attribute_name) ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			  SET @message = CONCAT(@message, ' | ', LEFT(@attribute_name, 10), '...', ' | ', @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @tempmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO workflow_models.workflow_model_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @listposition); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL)  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	  ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_workflow_output_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Creates a workflow instances output definition ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀⸀ 
-- Output is a message, transaction status and the new record id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_workflow_output_def] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
	  IF EXISTS (SELECT attr_name ਀ऀऀऀऀ䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 
				WHERE attr_name = @attribute_name) ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			  SET @message = CONCAT(@message, ' | ', LEFT(@attribute_name, 10), '...', ' | ', @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @tempmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO workflow_instances.workflow_output_definitions ਀ऀऀ             ⠀洀渀攀洀Ⰰ      愀琀琀爀开渀愀洀攀Ⰰ       搀攀猀挀爀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (@mnemonic, @attribute_name, @description, @listposition); ਀ऀ     匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL)  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开爀甀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 眀漀爀欀昀氀漀眀 爀甀氀攀 渀愀洀攀  
-- Input is the text fields and list position.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开爀甀氀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
				FROM workflow_models.workflow_rules਀ऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀✀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀  
		             (mnem,      attr_name,       descr,         list_position)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_workflow_rule_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Inserts a workflow model rule to workflow model step link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 眀漀爀欀昀氀漀眀 爀甀氀攀 䤀䐀 愀渀搀 愀 眀漀爀欀昀氀漀眀 猀琀攀瀀 搀攀昀椀渀椀琀椀漀渀 䤀䐀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_workflow_rule_link]਀      
	 @workflow_rule_id bigint         = NULL,਀ऀ 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @workflow_rule_id = 0 ਀ऀऀऀ 匀䔀吀 䀀眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 眀漀爀欀昀氀漀眀 爀甀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @workflow_rule_id IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 爀甀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀漀爀欀昀氀漀眀刀甀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWorkflowRuleID.');਀ऀऀऀ 䔀一䐀 
		  IF @workflow_rule_id IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT rule_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀  
								 WHERE rule_id = @workflow_rule_id)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 圀漀爀欀昀氀漀眀 爀甀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀漀爀欀昀氀漀眀刀甀氀攀䤀渀瘀愀氀椀搀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WorkflowRuleInvalid.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
      -- Workflow step transition validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 攀砀椀猀琀猀   
	  IF @step_transitionid = '' ਀ऀऀ 匀䔀吀 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
		IF @step_transitionid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 爀甀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀氀吀爀愀渀猀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWflTransID.');਀ऀऀऀ䔀一䐀 
਀ऀ  䔀䰀匀䔀 ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
							  FROM workflow_models.workflow_step_transitions ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 㴀 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀⤀  
				 BEGIN  -- The step transition ID does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfTransIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀吀爀愀渀猀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀甀氀攀开椀搀 
							 FROM workflow_models.workflow_rule_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀     爀甀氀攀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀ऀऀऀऀऀऀऀ       
								  AND step_transition_id = @step_transitionid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO workflow_models.workflow_rule_links ਀ऀऀ             ⠀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀Ⰰ 爀甀氀攀开椀搀⤀ 
		      VALUES (@step_transitionid,  @workflow_rule_id)਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_INS_workflow_step_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Inserts a record into workflow_models.workflow_step_definitions to create a workflow model node. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 洀漀搀攀氀 椀搀Ⰰ 瀀愀爀攀渀琀 猀琀攀瀀 䤀䐀 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 䤀䐀⸀ 
-- Output is a message, transaction status, the new record id and a text representation of the hierarchy id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_workflow_step_def] ਀ 
	 @workflow_model_id bigint        = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @model_stepname nvarchar(50)     = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀搀攀猀挀爀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀   㴀 一唀䰀䰀Ⰰ 
	 @model_steporder int             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
	-- Validate model id਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 　 
		 SET @workflow_model_id = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @workflow_model_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀漀爀欀昀氀䴀漀搀攀氀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWorkflModelID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
							 WHERE workflow_model_id = @workflow_model_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀漀爀欀昀氀䴀漀搀攀氀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WorkflModelInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		 -- Insert the new node਀ऀऀ䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀  
			(workflow_model_id, model_step_mnem, model_step_name, model_step_descr, model_step_order)						 ਀ऀऀऀ嘀䄀䰀唀䔀匀 ⠀䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀Ⰰ 䀀洀漀搀攀氀开猀琀攀瀀洀渀攀洀Ⰰ 䀀洀漀搀攀氀开猀琀攀瀀渀愀洀攀Ⰰ 䀀洀漀搀攀氀开猀琀攀瀀搀攀猀挀爀Ⰰ 䀀洀漀搀攀氀开猀琀攀瀀漀爀搀攀爀⤀㬀  
	    SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀  ऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀ 
   END਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 琀漀 挀爀攀愀琀攀 愀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 攀搀最攀⸀  
-- Input is the model id, parent step ID and an optional workflow action ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀渀崀  
਀ऀ 䀀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @steptransition_mnem nvarchar(10) = NULL,਀ऀ 䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀Ⰰ 
	 @steptransition_descr nvarchar(max) = NULL,਀ऀ 䀀昀爀漀洀开猀琀攀瀀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @to_step_id bigint                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
਀ 
	-- Validate workflow action id਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀椀搀 㴀 　 
		 SET @workflow_actionid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 椀搀 攀砀椀猀琀猀⸀  一唀䰀䰀 椀猀 瀀攀爀洀椀琀琀攀搀⸀  
	  IF @workflow_actionid IS NOT NULL਀         ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the workflow action id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 
							  FROM workflow_models.workflow_actions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfActionIdNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䄀挀琀椀漀渀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  䤀䘀 䀀昀爀漀洀开猀琀攀瀀开椀搀 㴀 　 
		 SET @from_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀漀搀攀氀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @from_step_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䘀爀漀洀匀琀攀瀀一漀琀匀甀瀀氀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfFromStepNotSupl.');਀ऀऀ 䔀一䐀 
	  ELSE -- A model step id been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 洀漀搀攀氀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE workflow_model_step_id = @from_step_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䘀爀漀洀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfFromStepInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  䤀䘀 䀀琀漀开猀琀攀瀀开椀搀 㴀 　 
		 SET @to_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀漀搀攀氀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @to_step_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀吀漀匀琀攀瀀一漀琀匀甀瀀氀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfToStepNotSupl.');਀ऀऀ 䔀一䐀 
	  ELSE -- A model step id been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 洀漀搀攀氀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE workflow_model_step_id = @to_step_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀吀漀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfToStepInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
਀ऀऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀    匀䔀䰀䔀䌀吀 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
				FROM workflow_models.workflow_step_transitions AS wt਀ऀऀऀऀ圀䠀䔀刀䔀 眀琀⸀␀昀爀漀洀开椀搀 㴀 ⠀ 
					SELECT $node_id ਀ऀऀऀऀऀ䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀  
					WHERE workflow_model_step_id = @from_step_id਀ऀऀऀऀ⤀ 
				AND wt.$to_id = (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 ␀渀漀搀攀开椀搀  
					FROM workflow_models.workflow_step_definitions ਀ऀऀऀऀऀ圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀琀漀开猀琀攀瀀开椀搀 
				)਀ऀऀऀऀ⤀ 
				 BEGIN -- Record already exists਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		 -- Insert the new node਀ऀऀ䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀  
			(workflow_action_id, $from_id, $to_id, step_transition_mnem, step_transition_name, step_transition_descr)						 ਀ऀऀऀ嘀䄀䰀唀䔀匀 ⠀䀀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀椀搀Ⰰ  
					(SELECT $node_id ਀ऀऀऀऀऀ 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀  
					 WHERE workflow_model_step_id = @from_step_id),਀ऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 ␀渀漀搀攀开椀搀  
					 FROM workflow_models.workflow_step_definitions ਀ऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀琀漀开猀琀攀瀀开椀搀⤀Ⰰ 
					 ISNULL(@steptransition_mnem, ''),਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
					 ISNULL(@steptransition_descr, '')					 ਀ऀऀऀ       ⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀऀ䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀  ऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀ 
   END਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开䤀一匀开砀爀攀昀开琀礀瀀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document cross reference type਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀⸀ 
-- Input is the paramters for a document cross reference field name:਀ⴀⴀ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀⸀   
-- Output is a status message, a transaction status and the id of the new record.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_INS_xref_type] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @attribute_name = ''਀ऀऀ匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 			 FROM xref.cross_reference_types ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @tempmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀  
		             (mnem,      attr_name,       descr)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_com_obj_attribute]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀洀开漀戀樀开愀琀琀爀椀戀甀琀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
							  FROM com_obj.common_object_attributes ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀  䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀爀攀挀漀爀搀椀搀⤀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
					   FROM com_obj.common_object_attributes਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND common_object_attribute_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀洀开漀戀樀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Updates a common object list name record਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀⸀   
-- The application must re-send all values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀洀开漀戀樀开氀椀猀琀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀ऀ              㴀 一唀䰀䰀Ⰰ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀氀椀猀琀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀漀爀攀椀最渀 欀攀礀 椀猀 椀渀瘀愀氀椀搀 
        @noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 漀戀樀攀挀琀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 刀攀挀漀爀搀 椀搀 挀栀攀挀欀 
	  IF @recordid = 0਀ऀ     匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		IF @recordid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @norecordidmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @recordid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @norecordidmessage = CONVERT(nvarchar(10), @recordid) + ' | ' + @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @norecordidmessage = 'A database level message error occurred on NotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀      ⴀⴀ 䔀渀搀 爀攀挀漀爀搀 䤀䐀 挀栀攀挀欀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
	  -- Includes checking if the name is null਀ऀ   
	   IF @listname = ''਀ऀऀ  匀䔀吀 䀀氀椀猀琀渀愀洀攀 㴀 一唀䰀䰀㬀 
਀ऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
		 @mnem             = @mnemonic,਀ऀऀ 䀀愀琀琀爀开渀愀洀攀        㴀 䀀氀椀猀琀渀愀洀攀Ⰰ 
		 @descr            = @description,਀ऀऀ 䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
		 @messg            = @validationmessage OUTPUT;਀ऀ   䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
	      BEGIN਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			  SET @data_validation_status = 'Fail';਀ऀऀ  䔀一䐀 
਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀ   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 
					  WHERE list_name = @listname਀ऀऀऀऀऀऀऀ䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀氀椀猀琀渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
਀ 
		 -- Check the common object attribute reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		   BEGIN਀ऀऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			                  FROM com_obj.common_object_attributes਀ऀऀऀऀऀऀ      圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'ComObjAttrNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䄀琀琀爀一漀琀䔀砀椀猀琀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ 
		   END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE com_obj.common_object_list_names ਀ऀऀ    匀䔀吀 洀渀攀洀        㴀 䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
			    list_name   = @listname,਀ऀऀऀऀ搀攀猀挀爀椀瀀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀Ⰰ    
				common_object_attribute_id = @commonobjattrid਀          圀䠀䔀刀䔀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀 
		COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
    IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_default_date_style]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 搀攀昀愀甀氀琀 搀愀琀攀 猀琀礀氀攀⸀ 
-- Input is the new default date style਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
--## NOTE that the default style is intended to inform the application of the default style for displaying dates.਀ⴀⴀ 吀栀攀 搀愀琀攀 猀琀礀氀攀 搀漀攀猀 渀漀琀 愀昀昀攀挀琀 栀漀眀 搀愀琀攀猀 愀爀攀 猀琀漀爀攀搀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- ================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀攀昀愀甀氀琀开搀愀琀攀开猀琀礀氀攀崀  
਀     䀀搀愀琀攀琀椀洀攀猀琀礀氀攀 椀渀琀ऀऀऀऀ  㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀搀愀琀攀琀椀洀攀猀琀礀氀攀 㴀 ✀✀ 
		 SET @datetimestyle = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @datetimestyle IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀匀琀礀氀攀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateStyle.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT datetime_style਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀  
							 WHERE datetime_style = @datetimestyle) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀匀琀礀氀攀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateStyleInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE base.global_settings_groups ਀ऀऀ    匀䔀吀 搀愀琀攀开猀琀礀氀攀 㴀 䀀搀愀琀攀琀椀洀攀猀琀礀氀攀 
		  WHERE setting_group_name = 'Master'; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_date_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_date_field_name] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
 		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied	਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_date_name_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_date_field_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE doc_date_name_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开椀渀琀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the doc_integer_field_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开椀渀琀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_int_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_int_name_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT doc_int_name_id਀ऀऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_integer_field_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE doc_int_name_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
			CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开愀琀琀爀开昀最开氀椀渀欀崀 
     ਀ऀ 䀀搀漀挀洀猀愀琀琀爀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @filtergroupid bigint            = NULL,਀ऀ 䀀渀攀眀搀漀挀开洀猀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @docmsattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @docmsattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  IF @docmsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE doc_ms_attr_id = @docmsattrid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
							    FROM doc_attr.doc_ms_attr_fgroup_links਀ऀऀऀ ऀऀऀऀ   圀䠀䔀刀䔀      搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								 AND filter_group_id = @filtergroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ⴀⴀ 搀漀挀 洀甀氀琀椀 猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 瘀愀氀椀搀愀琀椀漀渀 
     IF @newdoc_msattrid = 0਀ऀ    匀䔀吀 䀀渀攀眀搀漀挀开洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
	 IF @newdoc_msattrid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT doc_ms_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE doc_ms_attr_id = @newdoc_msattrid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
			        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ 
਀ 
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
							 FROM doc_attr.doc_ms_attr_fgroup_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀      搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀搀漀挀开洀猀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								  AND filter_group_id = @filtergroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   匀䔀吀 吀刀䄀一匀䄀䌀吀䤀伀一 䤀匀伀䰀䄀吀䤀伀一 䰀䔀嘀䔀䰀 匀䔀刀䤀䄀䰀䤀娀䄀䈀䰀䔀㬀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
		    SET doc_ms_attr_id = @newdoc_msattrid਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
		    AND filter_group_id = @filtergroupid਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开愀琀琀爀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 愀猀猀椀最渀洀攀渀琀 昀漀爀 愀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 
-- Input is a record id and new list id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开愀琀琀爀开氀椀猀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @docmslistid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@linkexistsmessage nvarchar(200)        = '', -- Communicates that the attribute is already linked to an object਀ऀऀ䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @recordid = 0਀ऀऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id exists਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN  -- Check that the record id exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
								  FROM doc_attr.doc_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
					 BEGIN -- Record id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀ  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀⸀  一甀氀氀 椀猀 瀀攀爀洀椀琀琀攀搀⸀  
		  IF @docmslistid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docmslistid IS NOT NULL਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT doc_ms_list_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
								 WHERE doc_ms_list_id = @docmslistid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䴀匀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @list_invalidmessage = @tempmessage;਀ऀऀऀऀऀ   䔀䰀匀䔀  
							SET @list_invalidmessage = 'A database level message error occurred on MSListNotExist.';਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ऀऀⴀⴀ 䌀栀攀挀欀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 眀椀琀栀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 
		-- If the attribute is already linked with a document then it cannot be਀ऀऀⴀⴀ 爀攀ⴀ愀猀猀椀最渀攀搀 琀漀 愀 搀椀昀昀攀爀攀渀琀 氀椀猀琀⸀ 
		IF @data_validation_status = 'Pass'਀ऀऀ   䈀䔀䜀䤀一 
		     IF EXISTS (SELECT doc_ms_list_id਀ऀऀऀ              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 
						 WHERE doc_ms_attr_id = @recordid)਀ऀऀऀ    䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
                   EXEC internal.usp_SEL_message਀ऀऀऀऀ        䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀渀欀攀搀✀Ⰰ 
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					   SET @linkexistsmessage = @tempmessage;਀ऀऀऀऀऀ   䔀䰀匀䔀  
							SET @linkexistsmessage = 'A database level message error occurred on AttrLinked.';਀ऀऀऀऀ䔀一䐀 
		   END਀ 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
		    SET doc_ms_list_id = @docmslistid਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
       COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
    IF (@linkexistsmessage <> '')          SET @message = @message + ' | ' + @linkexistsmessage;਀    䤀䘀 ⠀䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_ms_attr_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list position of a doc multi-select attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_ms_attr_posn] ਀ 
     @recordid bigint                 = NULL, ਀     䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE doc_ms_attr_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_multi_select_attributes ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE doc_ms_attr_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开愀琀琀爀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the doc_multi_select_attributes table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 唀瀀搀愀琀椀渀最 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 椀猀 挀愀爀爀椀攀搀 漀甀琀 瘀椀愀 甀猀瀀开唀倀䐀开搀漀挀开洀猀开氀椀猀琀开瀀漀猀渀 
-- Output is a message and transaction status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开愀琀琀爀开琀攀砀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　  
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 猀甀瀀瀀氀椀攀搀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE doc_ms_attr_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for the record id supplied਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_multi_select_attributes ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE doc_ms_attr_id = @recordid; ਀ऀ    䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_ms_list_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the document multi-select list position਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀 椀搀 愀渀搀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_ms_list_posn] ਀ 
     @recordid bigint                 = NULL, ਀     䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
 		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)     = '', -- Communicates that the record id does not exist਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_ms_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_ms_list_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	    COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_ms_list_text]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Updating the list position is carried out via usp_UPD_doc_ms_list_posn਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀猀开氀椀猀琀开琀攀砀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
							  FROM doc_attr.doc_multi_select_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
					   FROM doc_attr.doc_multi_select_list_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_ms_list_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_multi_select_list_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE doc_ms_list_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 瀀漀猀椀琀椀漀渀 
-- for the doc_radio_button_attributes table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀⸀ 
-- The application must re-send all values, even if only one is being updated.਀ⴀⴀ 唀瀀搀愀琀椀渀最 樀甀猀琀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 漀渀氀礀 挀愀渀 戀攀 挀愀爀爀椀攀搀 漀甀琀 瘀椀愀 甀猀瀀开唀倀䐀开搀漀挀开爀戀开氀椀猀琀开瀀漀猀渀 
-- Output is a message and transaction status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied		਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0 ਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id supplied਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							  FROM doc_attr.doc_radio_button_attributes ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀攀 爀攀挀漀爀搀 椀搀 猀甀瀀瀀氀椀攀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
					   FROM doc_attr.doc_radio_button_attributes਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_radiob_attr_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description,਀ऀऀऀ氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE doc_radiob_attr_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 20-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开愀琀琀爀开昀最开氀椀渀欀崀 
     ਀ऀ 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @filtergroupid bigint            = NULL,਀ऀ 䀀渀攀眀搀漀挀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @docradiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @docradiobattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  IF @docradiobattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT doc_radiob_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE doc_radiob_attr_id = @docradiobattrid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							    FROM doc_attr.doc_radiob_attr_fgroup_links਀ऀऀऀ ऀऀऀऀ   圀䠀䔀刀䔀      搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								 AND filter_group_id = @filtergroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
-- doc radio button attribute validation਀     䤀䘀 䀀渀攀眀搀漀挀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　 
	    SET @newdoc_radiobattrid = NULL;਀ऀ 䤀䘀 䀀渀攀眀搀漀挀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
							FROM doc_attr.doc_radio_button_attributes ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀渀攀眀搀漀挀开爀愀搀椀漀戀愀琀琀爀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'AttrIDNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
--਀     
		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT doc_radiob_attr_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 
			 				WHERE      filter_group_id ਀ऀऀऀऀऀऀऀ      㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀    
						     AND      doc_radiob_attr_id਀ऀऀऀऀऀऀऀ      㴀 䀀渀攀眀搀漀挀开爀愀搀椀漀戀愀琀琀爀椀搀⤀ऀऀऀऀऀऀऀ       
							  ਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_radiob_attr_fgroup_links ਀ऀऀ    匀䔀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀渀攀眀搀漀挀开爀愀搀椀漀戀愀琀琀爀椀搀 
		  WHERE doc_radiob_attr_id = @docradiobattrid਀ऀऀ    䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_rb_attr_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list assignment for a doc radio button attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 椀搀 
-- Output is message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开愀琀琀爀开氀椀猀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @radioblistid bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@linkexistsmessage nvarchar(200)        = '', -- Communicates that the attribute is already linked to an object਀ऀऀ䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @recordid = 0਀ऀऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id exists਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN  -- Check that the record id exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
								  FROM doc_attr.doc_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
					 BEGIN -- Record id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀ  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀⸀  一甀氀氀 椀猀 瀀攀爀洀椀琀琀攀搀⸀  
		  IF @radioblistid = 0਀ऀऀऀ 匀䔀吀 䀀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @radioblistid IS NOT NULL਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
								 WHERE doc_radiob_list_id = @radioblistid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀䈀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @list_invalidmessage = @tempmessage;਀ऀऀऀऀऀ   䔀䰀匀䔀  
							SET @list_invalidmessage = 'A database level message error occurred on RBListNotExist.';਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
		-- Check referential integrity with doc_multi_select_links਀ऀऀⴀⴀ 䤀昀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀猀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 琀栀攀渀 椀琀 挀愀渀渀漀琀 戀攀 
		-- re-assigned to a different list.਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		   BEGIN਀ऀऀ     䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
			              FROM doc_attr.doc_radio_button_links਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
			    BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀                   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
				        @message_id = 'AttrLinked',਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ   匀䔀吀 䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀渀欀攀搀⸀✀㬀 
				END਀ऀऀ   䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		    SET doc_radiob_list_id = @radioblistid਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
    IF (@linkexistsmessage <> '')          SET @message = @message + ' | ' + @linkexistsmessage;਀    䤀䘀 ⠀䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_rb_attr_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list position of a doc radio button attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开愀琀琀爀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							  FROM doc_attr.doc_radio_button_attributes ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开氀椀猀琀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 24-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Input is record id and position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开氀椀猀琀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user   ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)   = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_radiob_list_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
	਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_radio_button_list_names ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE doc_radiob_list_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_rb_list_text]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀 愀渀搀 瀀漀猀椀琀椀漀渀  
-- for the doc_radio_button_list_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开氀椀猀琀开琀攀砀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_radiob_list_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
	਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_radio_button_list_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE doc_radiob_list_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_rb_restriction]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ㄀　ⴀ㈀　㈀㐀 
-- Description:	Updates the document radio button restriction flag which restricts linking਀ⴀⴀ 漀昀 愀渀 愀琀琀爀椀戀甀琀攀 椀渀 琀栀愀琀 氀椀猀琀 琀漀 愀 搀漀挀甀洀攀渀琀 琀漀 挀漀渀琀爀漀氀氀攀爀 爀漀氀攀猀 漀渀氀礀⸀  
-- Input is record id and restriction flag਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀戀开爀攀猀琀爀椀挀琀椀漀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @restricted bit                  = 'False',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user   ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)   = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_radiob_list_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
	਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_radio_button_list_names ਀ऀऀ    匀䔀吀 爀攀猀琀爀椀挀琀攀搀 㴀 䀀爀攀猀琀爀椀挀琀攀搀 
		  WHERE doc_radiob_list_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀攀愀氀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the doc_attr.doc_real_number_field_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀攀愀氀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
							  FROM doc_attr.doc_real_number_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
					   FROM doc_attr.doc_real_number_field_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_real_name_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_doc_text_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_doc_text_field_name] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
 		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied	਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_free_text_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_free_text_name_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT doc_free_text_name_id਀ऀऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE doc_attr.doc_free_text_field_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE doc_free_text_name_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the file_attr.file_date_field_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_date_field_name] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
 		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied	਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_date_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_date_name_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT file_date_name_id਀ऀऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_date_field_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE file_date_name_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_int_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开椀渀琀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀   ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
							  FROM file_attr.file_integer_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
					   FROM file_attr.file_integer_field_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_int_name_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
	਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_integer_field_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE file_int_name_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开愀琀琀爀开昀最开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀⸀ 
-- The primary object is the filter group.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开愀琀琀爀开昀最开氀椀渀欀崀 
     ਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @filemsattrid bigint             = NULL,਀ऀ 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @filemsattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @filemsattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀  洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 
							     FROM file_attr.file_ms_attr_fgroup_links਀ऀऀऀ ऀऀऀऀ    圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								  AND filter_group_id = @filtergroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check new multi-select attribute਀     䤀䘀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 　 
	    SET @newfilemsattrid = NULL;਀ऀ 䤀䘀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀  
							FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'AttrIDNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
		   IF EXISTS (SELECT file_ms_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
						   WHERE    filter_group_id ਀ऀऀऀऀऀऀऀ     㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
							 AND    file_ms_attr_id ਀ऀऀऀऀऀऀऀ     㴀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 
						     AND       @filemsattrid਀ऀऀऀऀऀऀऀ     㰀㸀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'RecordExists', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ 
਀ 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ         唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀  
			    SET       file_ms_attr_id ਀ऀऀऀऀ    㴀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 
		       WHERE      file_ms_attr_id = @filemsattrid਀ऀऀऀ          䄀一䐀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_ms_attr_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list assignment for a file multi-select attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_ms_attr_list] ਀ 
     @recordid bigint                 = NULL, ਀     䀀昀椀氀攀洀猀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀猀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 琀漀 愀渀 漀戀樀攀挀琀 
		@list_invalidmessage nvarchar(200)      = '', -- Communicates that the multi-select list id was invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		  -- Data validation਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
			 SET @recordid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
		  IF @recordid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @norecordidmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
				   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE file_ms_attr_id = @recordid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @norecordmessage = @tempmessage;਀ऀऀऀऀऀ   䔀䰀匀䔀  
							SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
		  -- Validate the multi-select list id.  Null is permitted. ਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 　 
			 SET @filemslistid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
			 BEGIN  -- Check that the multi-select list id exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
								  FROM file_attr.file_multi_select_list_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀  
					 BEGIN -- Multi-select list id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'MSListNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䴀匀䰀椀猀琀一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
		-- Check referential integrity with file_multi_select_links਀ऀऀⴀⴀ 䤀昀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀猀 愀氀爀攀愀搀礀 氀椀渀欀攀搀 眀椀琀栀 愀 昀椀氀攀甀洀攀渀琀 琀栀攀渀 椀琀 挀愀渀渀漀琀 戀攀 
		-- re-assigned to a different list.਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		   BEGIN਀ऀऀ     䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
			              FROM file_attr.file_multi_select_links਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
			    BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀                   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
				        @message_id = 'AttrLinked',਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ   匀䔀吀 䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀渀欀攀搀⸀✀㬀 
				END਀ऀऀ   䔀一䐀 
਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @transactionmessage = @tempmessage;਀ऀऀऀ  䔀䰀匀䔀  
				   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_multi_select_attributes ਀ऀऀ    匀䔀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
		  WHERE file_ms_attr_id = @recordid; ਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀    䤀䘀 ⠀䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀氀椀渀欀攀砀椀猀琀猀洀攀猀猀愀最攀㬀 
    IF (@list_invalidmessage <> '')        SET @message = @message + ' | ' + @list_invalidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_ms_attr_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list position of a file multi-select attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_ms_attr_posn] ਀ 
     @recordid bigint                 = NULL, ਀     䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE file_ms_attr_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_multi_select_attributes ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE file_ms_attr_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_ms_attr_text]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Updating the list position is carried out via usp_UPD_file_ms_list_posn਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开愀琀琀爀开琀攀砀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　  
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 猀甀瀀瀀氀椀攀搀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							 WHERE file_ms_attr_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for the record id supplied਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_multi_select_attributes ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE file_ms_attr_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开氀椀猀琀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Input is record id and position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开氀椀猀琀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)   = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_ms_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE file_ms_list_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_ms_list_text]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Updating the list position is carried out via usp_UPD_file_ms_list_posn਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀猀开氀椀猀琀开琀攀砀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀   ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
							  FROM file_attr.file_multi_select_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
					   FROM file_attr.file_multi_select_list_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_ms_list_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_rb_attr_fg_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description: Updates a file radio button attribute to filter group link.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开愀琀琀爀开昀最开氀椀渀欀崀 
     ਀ऀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @file_radiobattrid bigint        = NULL,਀ऀ 䀀渀攀眀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀     㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @file_radiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @file_radiobattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀渀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
    ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							     FROM file_attr.file_radiob_attr_fgroup_links਀ऀऀऀ ऀऀऀऀ    圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								  AND filter_group_id = @filtergroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
     IF @newfile_radiobattrid = 0਀ऀ    匀䔀吀 䀀渀攀眀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
	 IF @newfile_radiobattrid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT file_radiob_attr_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
						   WHERE file_radiob_attr_id = @newfile_radiobattrid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
			        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ 
		 -- Check for a duplicate record਀ऀऀ   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
							FROM file_attr.file_radiob_attr_fgroup_links ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀    昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							     = @filtergroupid਀ऀऀऀऀऀऀऀ 䄀一䐀    昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
							     = @newfile_radiobattrid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀  
਀ 
--===========================਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	          UPDATE file_attr.file_radiob_attr_fgroup_links ਀ऀऀऀ     匀䔀吀       昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
				     = @newfile_radiobattrid਀ऀऀ       圀䠀䔀刀䔀      昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  
			         = @file_radiobattrid਀ऀऀऀ     䄀一䐀    昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
				     = @filtergroupid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开愀琀琀爀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 愀猀猀椀最渀洀攀渀琀 昀漀爀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 
-- Input is a record id and new list id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_rb_attr_list] ਀ 
     @recordid bigint                 = NULL, ਀     䀀爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							  FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀⸀  一甀氀氀 椀猀 瀀攀爀洀椀琀琀攀搀⸀  
	  IF @radioblistid = 0਀ऀऀ 匀䔀吀 䀀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @radioblistid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE file_radiob_list_id = @radioblistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀䈀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @list_invalidmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @list_invalidmessage = 'A database level message error occurred on RBListNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_radio_button_attributes ਀ऀऀ    匀䔀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀爀愀搀椀漀戀氀椀猀琀椀搀 
		  WHERE file_radiob_attr_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀    䤀䘀 ⠀䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀氀椀猀琀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_rb_attr_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list position of a file radio button attribute਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开愀琀琀爀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @listposition int                = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							  FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	    COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_rb_attr_text]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 漀渀氀礀 椀昀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Updating the list position is carried out via usp_UPD_file_rb_list_posn਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_rb_attr_text] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied		਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0 ਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id supplied਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
							  FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀攀 爀攀挀漀爀搀 椀搀 猀甀瀀瀀氀椀攀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
					   FROM file_attr.file_radio_button_attributes਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_radiob_attr_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_rb_list_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the file radio button list position਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀 椀搀 愀渀搀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开氀椀猀琀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @recordid = 0਀ऀऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN  -- Check that the record id exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
								  FROM file_attr.file_radio_button_list_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
					 BEGIN -- Record id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_radio_button_list_names ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE file_radiob_list_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开氀椀猀琀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the file_radio_button_list_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, only if one is being updated.਀ⴀⴀ 唀瀀搀愀琀椀渀最 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 椀猀 挀愀爀爀椀攀搀 漀甀琀 瘀椀愀 甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开氀椀猀琀开瀀漀猀渀 
-- Output is a message and transaction status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开氀椀猀琀开琀攀砀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE file_radiob_list_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_radio_button_list_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE file_radiob_list_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀戀开爀攀猀琀爀椀挀琀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-10-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 爀攀猀琀爀椀挀琀椀漀渀 昀氀愀最 眀栀椀挀栀 爀攀猀琀爀椀挀琀猀 氀椀渀欀椀渀最 
-- of an attribute in that list to a file to controller roles only. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀 椀搀 愀渀搀 爀攀猀琀爀椀挀琀椀漀渀 昀氀愀最 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_rb_restriction] ਀ 
     @recordid bigint                 = NULL, ਀     䀀爀攀猀琀爀椀挀琀攀搀 戀椀琀                  㴀 ✀䘀愀氀猀攀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		  -- Data validation਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
			 SET @recordid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @recordid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @norecordidmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
				   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
								 WHERE file_radiob_list_id = @recordid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @norecordmessage = @tempmessage;਀ऀऀऀऀऀ   䔀䰀匀䔀  
							SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @transactionmessage = @tempmessage;਀ऀऀऀ  䔀䰀匀䔀  
				   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
		    SET restricted = @restricted਀ऀऀ  圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
		COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_real_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀攀愀氀开昀椀攀氀搀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user   ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
							  FROM file_attr.file_real_number_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
					   FROM file_attr.file_real_number_field_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_real_name_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE file_attr.file_real_number_field_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE file_real_name_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_file_text_field_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_file_text_field_name] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
   		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied	਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_free_text_name_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_filter_group_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list position of a filter group਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀琀攀爀开最爀漀甀瀀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE forms.filter_groups ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE filter_group_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀琀攀爀开最爀漀甀瀀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Updating the list position is carried out via usp_UPD_filter_group_posn਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_filter_group_text] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
   		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied		਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  SET @connectedusersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀  匀䔀吀 䀀甀猀攀爀渀愀洀攀 㴀 匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @recordid = 0਀ऀऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id exists਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN  -- Check that the record id exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
								  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
					 BEGIN -- Record id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
			 IF @data_validation_status = 'Pass' ਀ऀऀऀऀ䄀一䐀ऀ䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
							  FROM forms.filter_groups਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
								   AND filter_group_id <> @recordid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
਀ऀऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END  -- End IF user authentication = Pass ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_form_group_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list position of a form group਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开最爀漀甀瀀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @recordid = 0਀ऀऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id exists਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN  -- Check that the record id exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀 
								  FROM forms.form_group_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
					 BEGIN -- Record id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_form_group_text]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀 昀漀爀 愀 昀漀爀洀 最爀漀甀瀀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 漀渀氀礀 椀昀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Updating the list position is carried out via usp_UPD_form_group_posn਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_form_group_text] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied		਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀 
							  FROM forms.form_group_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
		 IF @data_validation_status = 'Pass' ਀ऀऀऀ䄀一䐀ऀ䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀 
						  FROM forms.form_group_names਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							   AND form_group_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_gen_field_name_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Updates the list position of a general field name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开最攀渀开昀椀攀氀搀开渀愀洀攀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
     @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
							  FROM people.general_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record into people.general_field_names਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀ 
CREATE PROCEDURE [configuring].[usp_UPD_general_field_name] ਀ 
     @recordid bigint                 = NULL,਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ              
	 @generalfield_name nvarchar(50)  = '',਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 ✀✀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	      -- Check the record id਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
			 SET @recordid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @recordid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT gfn.general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
							WHERE gfn.general_field_name_id = @recordid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀⸀ 伀渀氀礀 瀀攀爀昀漀爀洀 琀栀椀猀 挀栀攀挀欀 椀昀 琀栀攀 椀搀 椀猀 瘀愀氀椀搀⸀  伀琀栀攀爀眀椀猀攀 愀 一愀洀攀一漀琀攀唀渀椀焀甀攀 攀爀爀漀爀 洀愀礀 戀攀 洀椀猀氀攀愀搀椀渀最⸀ 
	  IF @data_validation_status = 'Pass' ਀ऀ     䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最昀渀⸀渀愀洀攀 
		 		       FROM people.general_field_names AS gfn਀ऀऀऀऀ      圀䠀䔀刀䔀 最昀渀⸀渀愀洀攀 㴀 䀀最攀渀攀爀愀氀昀椀攀氀搀开渀愀洀攀 
					        AND gfn.general_field_name_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@generalfield_name, 10), '...  ',  @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique.');਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @generalfield_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
				  SET @message = CONCAT_WS(' |', @message, @validationmessage); ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE people.general_field_names਀            匀䔀吀 洀渀攀洀        㴀 䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
		        name        = @generalfield_name,਀ऀऀऀऀ搀攀猀挀爀椀瀀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 
		  WHERE general_field_name_id = @recordid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀⸀  ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开甀渀椀琀开漀昀开洀攀愀猀甀爀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 愀 爀攀挀漀爀搀 椀渀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 
-- Input is the ID, units, description and list position.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_unit_of_measure] ਀ 
     @recordid bigint                 = NULL,਀ऀ 䀀甀渀椀琀漀昀洀攀愀猀甀爀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀      㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(250)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied		਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ऀ䤀䘀 䀀搀攀猀挀爀椀瀀琀椀漀渀 䤀匀 一唀䰀䰀 匀䔀吀 䀀搀攀猀挀爀椀瀀琀椀漀渀 㴀 ✀✀㬀 
਀ऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check the record id਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
			 SET @recordid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
		  IF @recordid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @norecordidmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
				   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT unit_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀  
								 WHERE unit_id = @recordid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @norecordmessage = @tempmessage;਀ऀऀऀऀऀ   䔀䰀匀䔀  
							SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 甀渀椀琀 漀昀 洀攀愀猀甀爀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @unitofmeasure IS NULL OR @unitofmeasure = ''਀ऀ    䈀䔀䜀䤀一 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䄀琀琀爀一愀洀攀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			  SET @noattributenamemessage =  @tempmessage;਀ऀऀ   䔀䰀匀䔀  
				SET @noattributenamemessage = 'A database level message error occurred on NoAttrName';਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 一攀眀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF EXISTS (SELECT unit ਀ऀऀऀऀ    䘀刀伀䴀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀  
				   WHERE unit = @unitofmeasure ਀ऀऀऀऀ   䄀一䐀   甀渀椀琀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀甀渀椀琀漀昀洀攀愀猀甀爀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE  base.units_of_measure ਀ऀऀ       匀䔀吀           甀渀椀琀 㴀 䀀甀渀椀琀漀昀洀攀愀猀甀爀攀Ⰰ 
			                descr = @description,਀ऀऀऀऀऀ氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
			  WHERE unit_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开甀渀氀漀挀欀开搀漀挀甀洀攀渀琀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀渀氀漀挀欀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- by setting the Lock Status to Unlocked.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀⸀ 
-- Output is message and status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开甀渀氀漀挀欀开搀漀挀甀洀攀渀琀开椀搀崀  
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)        = '', -- Communicates that the doc id was invalid਀        䀀渀漀搀愀琀愀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀            㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀愀琀愀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@nodocidmessage nvarchar(200)           = '', -- Communicates that no document id was supplied਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Validation checks਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nodocidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nodocidmessage = 'A database level message error occurred on NoDocID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A doc id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀ ⬀ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀ ⬀ ✀⸀⸀⸀ ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 搀漀挀 椀搀 攀砀椀猀琀猀 
਀  
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'  -- Data validation failed਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			  SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE base.document_id_list ਀ऀऀ           匀䔀吀 搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀氀漀挀欀开猀琀愀琀甀猀 㴀 ✀唀渀氀漀挀欀攀搀✀ 
			     WHERE doc_id = @documentid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ䔀䰀匀䔀  
		    SET @transactionmessage = 'A database level message error occurred on UpdateError';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- End if transaction ready = Ready਀ 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodatamessage <> '')              SET @message = @message + ' | ' + @nodatamessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀昀开猀琀攀瀀开猀琀愀琀甀猀开搀攀昀开瀀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the list position for a workflow step status definition name.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_wf_step_status_def_psn] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀ऀऀऀऀ  㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT step_status_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE step_status_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE workflow_instances.step_status_definitions ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE step_status_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_wf_step_status_defn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_wf_step_status_defn] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀琀攀瀀开猀琀愀琀甀猀开椀搀 
							  FROM workflow_instances.step_status_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 猀琀攀瀀开猀琀愀琀甀猀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀琀攀瀀开猀琀愀琀甀猀开椀搀 
					   FROM workflow_instances.step_status_definitions਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND step_status_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@attribute_name, 10), '... | ', @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 猀琀攀瀀开猀琀愀琀甀猀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_workflow_action]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_workflow_action] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 
							  FROM workflow_models.workflow_actions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 
					   FROM workflow_models.workflow_actions਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND workflow_action_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@attribute_name, 10), '... | ', @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀一䐀 
			ELSE ਀ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_workflow_action_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 昀漀爀 愀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀⸀ 
-- Input is the recordid and list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- ================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @listposition int				  = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 
							  FROM workflow_models.workflow_actions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the workflow_models.workflow_model_names table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
							 WHERE workflow_model_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT workflow_model_id਀ऀऀऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE workflow_models.workflow_model_names ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE workflow_model_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
			CONVERT(nvarchar(10), ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀洀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the list position for a workflow model name.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_workflow_model_nm_posn] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀ऀऀऀऀ  㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
							 WHERE workflow_model_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE workflow_models.workflow_model_names ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE workflow_model_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_workflow_output_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Updates the mnemonic, name and description ਀ⴀⴀ 昀漀爀 琀栀攀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 琀愀戀氀攀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_workflow_output_def] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 漀甀琀瀀甀琀开椀搀 
							  FROM workflow_instances.workflow_output_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 漀甀琀瀀甀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 漀甀琀瀀甀琀开椀搀 
					   FROM workflow_instances.workflow_output_definitions਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND output_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@attribute_name, 10), '... | ', @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀   
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 漀甀琀瀀甀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_workflow_output_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 昀漀爀 愀 眀漀爀欀昀氀漀眀 漀甀琀瀀甀琀 瀀漀猀椀琀椀漀渀 渀愀洀攀⸀ 
-- Input is the recordid and list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- ================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @listposition int				  = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 漀甀琀瀀甀琀开椀搀 
							  FROM workflow_instances.workflow_output_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 漀甀琀瀀甀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 漀甀琀瀀甀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开爀甀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the workflow_models.workflow_rules table.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, even if only one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开爀甀氀攀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT rule_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀 
							 WHERE rule_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT rule_id਀ऀऀऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀 
					  WHERE attr_name = @attribute_name਀ऀऀऀऀऀऀऀ䄀一䐀 爀甀氀攀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				END਀ऀऀऀ䔀䰀匀䔀  
			    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
    END -- End IF user authentication = Pass  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE workflow_models.workflow_rules ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE rule_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
			CONVERT(nvarchar(10), ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 爀甀氀攀 琀漀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 氀椀渀欀⸀ 
-- Input is a workflow rule ID and a workflow step transition ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀崀 
     ਀ऀ 䀀眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @step_transitionid bigint        = NULL,਀ऀ 䀀渀攀眀开眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 戀椀最椀渀琀     㴀 一唀䰀䰀Ⰰ 
	 @new_step_transitionid bigint    = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀    
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 漀氀搀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF  NOT EXISTS (SELECT rule_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀 
			 				WHERE             rule_id ਀ऀऀऀऀऀऀऀ      㴀 䀀眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀ऀऀऀऀऀऀऀ       
							  AND     step_transition_id ਀ऀऀऀऀऀऀऀ      㴀  䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  䤀䘀 䀀渀攀眀开眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 㴀 　  
			 SET @new_workflow_rule_id = NULL;਀  
		  -- Check if a workflow rule id was supplied. ਀ऀऀ  䤀䘀 䀀渀攀眀开眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A workflow rule id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoWorkflowRuleID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀漀爀欀昀氀漀眀刀甀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䤀䘀 䀀渀攀眀开眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀甀氀攀开椀搀 
								  FROM workflow_models.workflow_rules ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀甀氀攀开椀搀 㴀 䀀渀攀眀开眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀⤀ 
					 BEGIN -- Workflow rule id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'WorkflowRuleInvalid', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀漀爀欀昀氀漀眀刀甀氀攀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀      ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the workflow step transition exists  ਀ऀ  䤀䘀 䀀渀攀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 㴀 　  
		 SET @new_step_transitionid = NULL;਀ऀऀ䤀䘀 䀀渀攀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			BEGIN -- A workflow rule id has not been supplied.਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWflTransID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀氀吀爀愀渀猀䤀䐀⸀✀⤀㬀 
			END਀ 
	  ELSE -- Workflow step transition ID has been supplied.  Check if it exists. ਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT step_transition_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀  
							 WHERE step_transition_id = @new_step_transitionid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀吀爀愀渀猀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfTransIDInvalid.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀     
		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT rule_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀 
			 				WHERE     rule_id = @new_workflow_rule_id							      ਀ऀऀऀऀऀऀऀऀ  䄀一䐀 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 㴀 䀀渀攀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ऀ 
    ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
        BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀  
				WHERE             rule_id ਀ऀऀऀऀऀऀ㴀 䀀眀漀爀欀昀氀漀眀开爀甀氀攀开椀搀ऀऀऀऀऀऀऀ       
					AND     step_transition_id ਀ऀऀऀऀऀऀ㴀  䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 
	     INSERT INTO workflow_models.workflow_rule_links ਀ऀऀ             ⠀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀Ⰰ 爀甀氀攀开椀搀⤀ 
		      VALUES (@new_step_transitionid,  @new_workflow_rule_id)਀ 
		COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开爀甀氀攀开瀀漀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the list position for a workflow rule.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀 愀渀搀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_workflow_rule_posn] ਀ 
     @recordid bigint                 = NULL, ਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀ऀऀऀऀ  㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @recordid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT rule_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀猀 
							 WHERE rule_id = @recordid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE workflow_models.workflow_rules ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE rule_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_workflow_step_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Updates a record for a record in workflow_models.workflow_step_definitions to update a workflow model step node. ਀ⴀⴀ 䄀氀氀 瘀愀氀甀攀猀 洀甀猀琀 戀攀 爀攀ⴀ猀攀渀琀Ⰰ 漀琀栀攀爀眀椀猀攀 琀栀攀礀 眀椀氀氀 戀攀 猀攀琀 琀漀 一唀䰀䰀⸀  
-- Output is a message, transaction status, the new record id and a text representation of the hierarchy id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_workflow_step_def] ਀ 
     @model_step_id int, ਀ऀ 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @model_stepmnem nvarchar(10)     = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @model_stepdescr nvarchar(max)   = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀漀爀搀攀爀 椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),     ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
	  IF @model_step_id = 0਀ऀऀ 匀䔀吀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
							  FROM workflow_models.workflow_step_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀攀 洀漀搀攀氀 椀搀 
	  IF @workflow_model_id = 0਀ऀऀ 匀䔀吀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWorkflModelID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀漀爀欀昀氀䴀漀搀攀氀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
							  FROM workflow_models.workflow_model_names਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WorkflModelInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀漀爀欀昀氀䴀漀搀攀氀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
		 -- Insert the new node਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		UPDATE workflow_models.workflow_step_definitions ਀ऀऀऀ匀䔀吀 洀漀搀攀氀开猀琀攀瀀开渀愀洀攀 㴀 䤀匀一唀䰀䰀⠀䀀洀漀搀攀氀开猀琀攀瀀渀愀洀攀Ⰰ ✀✀⤀Ⰰ  
			    model_step_mnem = ISNULL(@model_stepmnem, ''), ਀ऀऀऀऀ洀漀搀攀氀开猀琀攀瀀开搀攀猀挀爀 㴀 䤀匀一唀䰀䰀⠀䀀洀漀搀攀氀开猀琀攀瀀搀攀猀挀爀Ⰰ ✀✀⤀Ⰰ 
				model_step_order = ISNULL(@model_steporder, '')					 ਀ऀऀ圀䠀䔀刀䔀  眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
		      = @model_step_id਀ऀऀ  䄀一䐀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀  
		      = @workflow_model_id ਀ऀऀऀऀ 
	   COMMIT TRANSACTION;਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'Success', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		IF (@tempmessage IS NOT NULL)  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		SET @transaction_status = 'Good';਀ 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀ 
਀   䔀一䐀 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_workflow_step_transn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Updates a record in workflow_models.workflow_step_transitions to update a workflow model edge. ਀ⴀⴀ 一漀琀攀 琀栀愀琀 戀攀挀甀愀猀攀 琀栀椀猀 椀猀 愀 最爀愀瀀栀 琀愀戀氀攀Ⰰ 琀栀攀 昀爀漀洀 愀渀搀 琀漀 挀漀氀甀洀渀猀 挀愀渀渀漀琀 戀攀 甀瀀搀愀琀攀搀⸀   
-- Output is a message, transaction status and the new record id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [configuring].[usp_UPD_workflow_step_transn] ਀ 
	 @step_transitionid int            = NULL,਀ऀ 䀀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @steptransition_mnem nvarchar(10) = NULL,਀ऀ 䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀Ⰰ 
	 @steptransition_descr nvarchar(max) = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
-- Data validation਀ 
      -- Workflow step transition validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 攀砀椀猀琀猀   
	  IF @step_transitionid = 0 ਀ऀऀ 匀䔀吀 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
		IF @step_transitionid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 爀甀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀氀吀爀愀渀猀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWflTransID.');਀ऀऀऀ䔀一䐀 
਀ऀ  䔀䰀匀䔀 ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
							  FROM workflow_models.workflow_step_transitions ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
							       = @step_transitionid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀吀爀愀渀猀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfTransIDInvalid.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀ 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀攀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 椀搀 
	  IF @workflow_actionid = 0਀ऀऀ 匀䔀吀 䀀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check workflow action id exists.  NULL is permitted. ਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀椀搀 䤀匀 一伀吀 一唀䰀䰀 
         -- A workflow action id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_action_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀 
							 WHERE workflow_action_id = @workflow_actionid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䄀挀琀椀漀渀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfActionIdNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀऀ ⴀⴀ 䤀渀猀攀爀琀 琀栀攀 渀攀眀 渀漀搀攀 
		UPDATE workflow_models.workflow_step_transitions ਀ऀऀ   匀䔀吀 眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀椀搀Ⰰ  
			   step_transition_mnem  = ISNULL(@steptransition_mnem, ''), ਀ऀऀऀ   猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开渀愀洀攀  㴀 䤀匀一唀䰀䰀⠀䀀猀琀攀瀀琀爀愀渀猀椀琀椀漀渀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ  
			   step_transition_descr = ISNULL(@steptransition_descr, '')਀ऀऀ 圀䠀䔀刀䔀    猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀  
		       = @step_transitionid ;਀       䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀  ऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀   䔀一䐀 
END਀䜀伀 
/****** Object:  StoredProcedure [configuring].[usp_UPD_xref_type_list_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 氀椀猀琀 瀀漀猀椀琀椀漀渀 昀漀爀 愀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 琀礀瀀攀⸀ 
-- Input is the recordid and list position਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- ================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开砀爀攀昀开琀礀瀀攀开氀椀猀琀开瀀漀猀渀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @listposition int				  = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 砀爀攀昀开琀礀瀀攀开椀搀 
							  FROM xref.cross_reference_types ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 砀爀攀昀开琀礀瀀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     唀倀䐀䄀吀䔀 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀  
		    SET list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 砀爀攀昀开琀礀瀀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' |', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开砀爀攀昀开琀礀瀀攀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the text fields for a cross reference type.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀攀挀漀爀搀椀搀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- The application must re-send all three values, only if one is being updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- ================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀昀椀最甀爀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开砀爀攀昀开琀礀瀀攀开琀攀砀琀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 砀爀攀昀开琀礀瀀攀开椀搀 
							  FROM xref.cross_reference_types ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 砀爀攀昀开琀礀瀀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
		 IF @data_validation_status = 'Pass' ਀ऀऀऀ䄀一䐀ऀ䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 砀爀攀昀开琀礀瀀攀开椀搀 
						  FROM xref.cross_reference_types਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							   AND xref_type_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@attribute_name, 10), '... | ',+ @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     UPDATE xref.cross_reference_types ਀ऀऀ    匀䔀吀      洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    attr_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		  WHERE xref_type_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_common_obj_list_item]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a common object list item਀ⴀⴀ 䤀渀瀀甀琀 椀猀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀⸀  
-- Output is a message and transaction status.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀洀洀漀渀开漀戀樀开氀椀猀琀开椀琀攀洀崀  
਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@nocomobjlistmessage nvarchar(200)      = '', -- Communicates that a common object list id was not supplied਀ऀऀ䀀渀漀挀漀洀漀戀樀攀挀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 
		@comobjlistinvalidmessage nvarchar(200) = '', -- Communicates that the common object list was invalid਀ऀऀ䀀挀漀洀漀戀樀攀挀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 挀漀洀漀渀 漀戀樀攀挀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@fg_invalidmessage nvarchar(200)        = '', -- Communicates that the filter group id was invalid਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0 ਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @nocomobjlistmessage = @tempmessage;					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @nocomobjlistmessage = 'A database level message error occurred on NoComObjList.';਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @comobjlistinvalidmessage = CONVERT(nvarchar(10), @commonobjlistid) + ' | ' + @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @comobjlistinvalidmessage = 'A database level message error occurred on ComObjListNotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0 ਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @nocomobjectmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @nocomobjectmessage = 'A database level message error occurred on NoComObject.';਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @comobjectinvalidmessage = CONVERT(nvarchar(10), @commonobjectid) + ' | ' + @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @comobjectinvalidmessage = 'A database level message error occurred on ComObjectNotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 
					      WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ            䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ ⬀ ✀  ✀ ⬀ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
    -- Reference checks਀      ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
      IF @data_validation_status = 'Pass'  -- Don't perform the reference checks if the record does not exist.਀ऀ  䤀䘀     䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			           FROM com_obj.doc_to_com_obj_ms_list_links  ਀ऀऀऀ          圀䠀䔀刀䔀          挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
					        AND common_object_list_id = @commonobjlistid) ਀          伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			           FROM com_obj.doc_to_com_obj_radiob_links ਀ऀऀऀ          圀䠀䔀刀䔀          挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
					        AND common_object_list_id = @commonobjlistid) ਀          伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			           FROM com_obj.file_to_com_obj_ms_list_links ਀ऀऀऀ          圀䠀䔀刀䔀          挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
					        AND common_object_list_id = @commonobjlistid) ਀          伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			           FROM com_obj.file_to_com_obj_radiob_links ਀ऀऀऀ          圀䠀䔀刀䔀          挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
					        AND common_object_list_id = @commonobjlistid) ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ ⬀ ✀  ✀ ⬀ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀  
		      WHERE          common_object_id = @commonobjectid਀ऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nocomobjlistmessage <> '')        SET @message = @message + ' | ' + @nocomobjlistmessage;਀ऀ䤀䘀 ⠀䀀渀漀挀漀洀漀戀樀攀挀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀挀漀洀漀戀樀攀挀琀洀攀猀猀愀最攀㬀 
	IF (@comobjlistinvalidmessage <> '')   SET @message = @message + ' | ' + @comobjlistinvalidmessage;਀ऀ䤀䘀 ⠀䀀挀漀洀漀戀樀攀挀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀挀漀洀漀戀樀攀挀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@fg_invalidmessage <> '')          SET @message = @message + ' | ' + @fg_invalidmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_common_object]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀攀挀漀爀搀 
-- Input is a record id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀洀洀漀渀开漀戀樀攀挀琀崀  
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀ऀ          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @xrefexistmessage nvarchar(200)         = '', -- Communicates that there are cross references that exist਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀爀攀昀椀渀琀攀最爀椀琀礀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀 爀攀昀攀爀攀渀琀椀愀氀 椀渀琀攀最爀椀琀礀 挀栀攀挀欀 昀愀椀氀甀爀攀 
		@referential_check_status nchar(10)     = 'Pass',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 刀攀挀漀爀搀 椀搀 挀栀攀挀欀 
	    IF @id_to_delete = 0਀ऀऀ   匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
		IF @id_to_delete IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @norecordidmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @id_to_delete) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @norecordidmessage = CONVERT(nvarchar(10), @id_to_delete) + ' | ' + @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @norecordidmessage = 'A database level message error occurred on NotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀      ⴀⴀ 䔀渀搀 爀攀挀漀爀搀 䤀䐀 挀栀攀挀欀 
਀      ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF  EXISTS (SELECT common_object_id ਀ऀऀऀ        䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀   
			       WHERE common_object_id = @id_to_delete) ਀ऀऀ  䈀䔀䜀䤀一 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE਀ऀऀऀऀ 匀䔀吀 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀㬀 
			SET @referential_check_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		  END਀ 
	  IF (@referential_check_status = 'Fail')਀ऀऀ 䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀昀䤀渀琀攀最爀椀琀礀䔀爀爀漀爀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @refintegritymessage = @tempmessage;਀  ऀऀऀ 䔀䰀匀䔀  
			   SET @refintegritymessage = 'A database level message error occurred on RefIntegrityError.';਀ऀ  䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
		      WHERE common_object_id = @id_to_delete;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀ऀ䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@refintegritymessage <> '')        SET @message = @message + ' | ' + @refintegritymessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀攀砀椀猀琀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a document to controller level document group link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_contr_doc_group_link]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		  -- Data validation਀ 
		 IF @documentid = ''਀ऀऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
				   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
						@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have permission to access it or edit it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'NoDocIDAccess', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀  
						 END਀ऀऀऀऀ䔀一䐀 
਀ 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	 -- This also returns fail if the id does not exist਀    䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开挀漀渀琀开搀漀挀开最爀瀀崀 
	     @contr_doc_grp_to_check = @recordid,਀ऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀瘀愀氀椀搀䌀漀渀䐀漀挀䜀爀瀀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidConDocGrp');਀ऀऀ䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
  IF @data_validation_status = 'Pass'਀  ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT controller_doc_group_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀  
							 WHERE controller_doc_group_name_id = @recordid਀ऀऀऀऀऀऀऀ       䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
  ਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM xref.controller_doc_group_links ਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
			    AND controller_doc_group_name_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_contr_file_group_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 昀椀氀攀 琀漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a file id and a controller level file group ID.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @recordid bigint                 = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ 
  -- Authenticate the connected users for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ 䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 漀爀 攀搀椀琀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message , ' | ', 'File ID: ', CONVERT(nvarchar(10), @fileid), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileIDAccess.'); ਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ 
	 -- Authenticate the user for the given controller level file group਀ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
    EXEC [internal].[usp_AUTHENTICATE_cont_file_grp]਀ऀ     䀀挀漀渀琀爀开昀椀氀攀开最爀瀀开琀漀开挀栀攀挀欀 㴀 䀀爀攀挀漀爀搀椀搀Ⰰ 
		 @user_authentication_result_cep = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'InvalidConFileGrp', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䌀漀渀䘀椀氀攀䜀爀瀀✀⤀㬀 
		END਀ 
  -- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
  		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
							  FROM xref.controller_file_group_links ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀 
							       AND file_id = @fileid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀   
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀  
		  WHERE file_id = @fileid਀ऀऀऀ    䄀一䐀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最瀀开攀搀开瀀攀爀洀开昀甀渀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀漀爀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀ 
*਀⨀⼀ 
CREATE PROCEDURE [controlling].[usp_DEL_doc_gp_ed_perm_funct] ਀ 
     @docgroupid bigint            ,  -- Document group ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀        Ⰰ  ⴀⴀ 唀猀攀爀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  IF @docgroupid = 0 SET @docgroupid = NULL਀ऀऀ 䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoDocGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀ     䔀䰀匀䔀 
			 -- Authenticate the user for the given document group਀ऀऀऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 渀攀最愀琀椀瘀攀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			  EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀऀऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 
					@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN  -- The user does not have permission for this action਀ऀऀऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = @message + ' | ' + 'Document group ID: ' + ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL') + '  ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = @message + ' | ' + 'A database level message error occurred on NoDocGroupPermission.';਀ऀऀऀऀ䔀一䐀ऀऀ    
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @functionlistid = 0 ਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @functionlistid IS NULL  ਀ऀ     䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = @message + ' | ' +  @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = @message + ' | ' +  'A database level message error occurred on NoDocGroupId';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
				   	          FROM user_restr.doc_group_edit_perm_funct_lst ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						           AND function_list_id = @functionlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = @message + ' | ' +  @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
					SET @message = @message + ' | ' +  'A database level message error occurred on NotExist.';਀ऀऀऀऀ䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the delete query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM user_restr.doc_group_edit_perm_funct_lst਀ऀऀ  圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
			    AND function_list_id = @functionlistid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = @message + ' | ' +  @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @message = @message + ' | ' +  'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀   
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @message = @message + ' | ' +  'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最瀀开攀搀开瀀攀爀洀开瀀攀漀瀀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀漀爀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 瀀攀漀瀀氀攀 氀椀猀琀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 怀怀䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀怀怀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - ``@peoplelistid bigint``: Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ 
* - ``@message nvarchar(1000) OUTPUT``: Descriptive status message of the procedure's execution.਀⨀ ⴀ 怀怀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀怀怀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing @docgroupid, @peoplelistid, or non-existing record in database.਀⨀ ⴀ 䐀攀氀攀琀攀 伀瀀攀爀愀琀椀漀渀 䘀愀椀氀㨀 䤀渀 挀愀猀攀 漀昀 愀渀 攀砀挀攀瀀琀椀漀渀 搀甀爀椀渀最 琀栀攀 甀瀀搀愀琀攀Ⰰ 爀攀琀甀爀渀猀 愀渀 攀爀爀漀爀 洀攀猀猀愀最攀 眀椀琀栀 搀攀琀愀椀氀猀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 ✀甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - Both @docgroupid and @peoplelistid must be provided and valid.਀⨀ ⴀ 吀栀攀爀攀 洀甀猀琀 戀攀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 洀愀琀挀栀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀 愀渀搀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最瀀开攀搀开瀀攀爀洀开瀀攀漀瀀氀攀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @peoplelistid bigint             = NULL,  -- User duty function list id਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ 䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
			SET @docgroupid = NULL;਀ऀऀ 䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoDocGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
		   BEGIN਀ऀऀऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
			 -- This also returns negative if the id does not exist਀ऀऀऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
					@docgroupid_to_check_vp = @docgroupid,਀ऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			  IF @tempuserauth_status = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					SET @userauthentication_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'NoDocGroupPermission', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
				END਀ऀ        䔀一䐀 
਀ 
      -- Check the people list id has been supplied਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀   
	     BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the people list exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				                  FROM people.people_list_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'PeopleListIDInvalid', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ    䔀一䐀 
਀ 
      -- Check if a matching record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
				   	          FROM user_restr.doc_group_edit_perm_people_lst ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						           AND people_list_id = @peoplelistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = @message + ' | ' +  @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
					SET @message = @message + ' | ' +  'A database level message error occurred on NotExist.';਀ऀऀऀऀ䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the delete query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM user_restr.doc_group_edit_perm_people_lst਀ऀऀ  圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
			    AND people_list_id = @peoplelistid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = @message + ' | ' +  @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @message = @message + ' | ' +  'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀   
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @message = @message + ' | ' +  'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END -- END IF @transaction_ready = 'Ready'਀  䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最爀漀甀瀀开渀愀洀攀开爀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 08-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 渀愀洀攀⸀  
-- Only for document groups which the user has permission to modify.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最爀漀甀瀀开渀愀洀攀开爀猀琀爀崀  
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀搀漀挀最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@nodocgroupid nvarchar(200)             = '', -- Communicates that a document group id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@docgrpexistsmessage nvarchar(200)      = '', -- Communicates that a document to document group link exists਀ऀऀ䀀搀漀挀瀀攀爀洀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 攀渀琀爀礀 攀砀椀猀琀猀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	 -- This also returns negative if the id does not exist਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
			@docgroupid_to_check_vp = @id_to_delete,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @nodocgroup_permissionmsg = 'Document group ID: ' + ISNULL(CONVERT(nvarchar(10), @id_to_delete), 'NULL') + '  ' + @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @nodocgroup_permissionmsg = 'A database level message error occurred on NoDocGroupPermission.';਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		 SET @id_to_delete = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @nodocgroupid = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @nodocgroupid = 'A database level message error occurred on NoDocGroupId.';਀ऀऀ 䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀挀攀猀 琀漀 搀漀挀甀洀攀渀琀猀⸀  䘀愀椀氀 椀昀 愀渀礀 攀砀椀猀琀⸀ 
      IF EXISTS (SELECT dgl.doc_group_id਀ऀ              䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
			LEFT JOIN xref.doc_group_names AS dgn਀ऀऀऀ       伀一 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 
				    = dgn.doc_group_id਀ऀऀऀऀ圀䠀䔀刀䔀 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'DocGrpLinkExists', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀搀漀挀最爀瀀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀搀漀挀最爀瀀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䜀爀瀀䰀椀渀欀䔀砀椀猀琀猀⸀✀㬀 
		 END਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 攀渀琀爀椀攀猀⸀  䘀愀椀氀 椀昀 愀渀礀 攀砀椀猀琀⸀  
      IF EXISTS (SELECT dgn.doc_group_id਀ऀ              䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
			LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀ       伀一 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
				     = dgn.doc_group_id਀ऀऀऀऀ圀䠀䔀刀䔀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'ViewPermExists', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀搀漀挀瀀攀爀洀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀搀漀挀瀀攀爀洀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 嘀椀攀眀倀攀爀洀䔀砀椀猀琀猀⸀✀㬀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM xref.doc_group_names ਀ऀऀ      圀䠀䔀刀䔀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@nodocgroupid <> '')               SET @message = @message + ' | ' + @nodocgroupid;਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀搀漀挀最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
	IF (@docgrpexistsmessage <> '')        SET @message = @message + ' | ' + @docgrpexistsmessage;਀ऀ䤀䘀 ⠀䀀搀漀挀瀀攀爀洀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀瀀攀爀洀攀砀椀猀琀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀甀琀礀开昀甀渀挀琀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a duty function record in people.duty_functions਀ⴀⴀ 䤀渀瀀甀琀 椀猀 爀攀挀漀爀搀 椀搀  
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a duty function record in people.duty_functions਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @id_to_delete bigint: Must be a non-null and non-empty valid identifier.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
* - No cross references must exist਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a record in people.duty_functions ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀椀搀开琀漀开搀攀氀攀琀攀 洀甀猀琀 戀攀 瘀愀氀椀搀 愀渀搀 昀爀攀攀 昀爀漀洀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_duty_function] ਀ 
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀऀ  䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
			 SET @id_to_delete = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @id_to_delete IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT df.function_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
							WHERE df.function_id = @id_to_delete)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ䈀䔀䜀䤀一 
		  IF EXISTS (SELECT fl.function_id਀ऀऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
					  WHERE fl.function_id = @id_to_delete)  ਀ऀऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀  
						 FROM people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
			  BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id = 'XRefExists', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
				   SET @message = CONCAT_WS(' | ', @message,  'A database level message error occurred on XRefExists.');਀ 
			  END਀ऀऀ䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
		  WHERE function_id = @id_to_delete; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_duty_function_sid_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 
-- Input is a function id and sid list id  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀椀搀㨀  䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 搀甀琀礀开昀甀渀挀琀椀漀渀猀 琀愀戀氀攀⸀ 一漀琀 瀀攀爀洀椀琀琀攀搀 琀漀 戀攀 攀洀瀀琀礀 漀爀 一唀䰀䰀 
* - @sidrecordid: Must be a valid id from the sid_list table. Not permitted to be empty or NULL਀⨀ ⴀ 吀栀攀 瀀愀椀爀 䀀昀甀渀挀琀椀漀渀椀搀 愀渀搀 䀀猀椀搀爀攀挀漀爀搀椀搀 洀甀猀琀 戀攀 攀砀椀猀琀 椀渀 琀栀攀 琀愀戀氀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a record in people.duty_function_sid_links ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀崀  
਀     䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @sidrecordid bigint              = NULL,             -- A valid id from the sid_list table, not an actual SID਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 
		  IF @functionid = 0਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ 
਀ऀ ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀猀椀搀爀攀挀漀爀搀椀搀 
	   -- Check that the sid has been supplied਀ऀऀ 䤀䘀 䀀猀椀搀爀攀挀漀爀搀椀搀 㴀 　 
		    SET @sidrecordid = NULL;਀ऀऀ 䤀䘀 䀀猀椀搀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀  
		    BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NoUserSidID', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀✀⤀㬀ऀ 
			END਀ 
਀     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	 IF @data_validation_status = 'Pass'਀ऀ    䄀一䐀 一伀吀 䔀堀䤀匀吀匀  
				(SELECT dfsl.function_id਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
				  WHERE dfsl.function_id = @functionid਀ऀऀऀऀऀऀ䄀一䐀 搀昀猀氀⸀猀椀搀开椀搀  㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀ 
			BEGIN -- Record already exists਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						@message_id = 'NotExist',਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀䘀甀渀挀琀椀漀渀 䰀椀猀琀✀Ⰰ 
		          (SELECT name FROM people.duty_functions਀ऀऀऀऀ                   圀䠀䔀刀䔀    昀甀渀挀琀椀漀渀开椀搀  
								         = @functionid),਀ऀऀ          䀀猀椀搀爀攀挀漀爀搀椀搀Ⰰ 
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @sidrecordid),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 
								 WHERE function_id = @functionid ਀ऀऀऀऀऀऀऀऀऀ   䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ 
		          (SELECT granted_by FROM people.duty_function_sid_links਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀    昀甀渀挀琀椀漀渀开椀搀  
									      = @functionid ਀ऀऀऀऀऀऀऀऀऀऀ  䄀一䐀 猀椀搀开椀搀  
										    = @sidrecordid),਀ऀऀऀऀ  䀀甀猀攀爀渀愀洀攀⤀ 
਀ऀ     䐀䔀䰀䔀吀䔀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀           
		  WHERE function_id = @functionid ਀ऀऀ        䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀㬀  
	  COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_file_gp_ed_perm_funct]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 琀漀 搀攀ⴀ愀甀琀栀漀爀椀猀攀  
-- a function list of users to edit file metadata within a file group. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀Ⰰ 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record to de-authorise a funcion list to edit metadata for files within a file group਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 漀爀 椀渀瘀愀氀椀搀 昀椀氀攀 最爀漀甀瀀 䤀䐀 漀爀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀 漀爀 渀漀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 ✀甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @filegroupid and @functionlistid must be provided and be valid and match an existing record਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开最瀀开攀搀开瀀攀爀洀开昀甀渀挀琀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ             ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @functionlistid bigint           = NULL,          -- User duty function list id਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　   
		    SET @filegroupid = NULL; -- Check if a file group ID has been supplied਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀䐀✀⤀㬀 
		   END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	     IF @functionlistid = 0਀ऀऀ    匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @functionlistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID');਀ऀऀ   䔀一䐀 
਀ 
      -- Check if a matching record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				   	          FROM user_restr.file_group_edit_perm_funct_lst ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀        昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀 
						           AND function_list_id = @functionlistid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 
		       WHERE     file_group_id    = @filegroupid਀ऀऀऀ         䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_file_gp_ed_perm_people]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 琀漀 搀攀ⴀ愀甀琀栀漀爀椀猀攀  
-- a people list of users to edit file metadata within a file group. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀Ⰰ 愀 瀀攀漀瀀氀攀 氀椀猀琀 䤀䐀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record to de-authorise a peopole list to edit metadata for files within a file group਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 漀爀 椀渀瘀愀氀椀搀 昀椀氀攀 最爀漀甀瀀 䤀䐀 漀爀 瀀攀漀瀀氀攀 氀椀猀琀 䤀䐀 漀爀 渀漀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 ✀甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @filegroupid and @peoplelistid must be provided and be valid and match an existing record਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开最瀀开攀搀开瀀攀爀洀开瀀攀漀瀀氀攀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ             ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @peoplelistid bigint             = NULL,          -- User duty people list id਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL; -- Check if a file group ID has been supplied਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀䐀✀⤀㬀 
		   END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	     IF @peoplelistid = 0਀ऀऀ    匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @peoplelistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID');਀ऀऀ   䔀一䐀 
਀ 
      -- Check if a matching record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				   	          FROM user_restr.file_group_edit_perm_ppl_lst ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀        昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀 
						           AND people_list_id = @peoplelistid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 
		       WHERE     file_group_id    = @filegroupid਀ऀऀऀ         䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_file_group_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀 爀攀挀漀爀搀⸀ 
-- Input is a file group id  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a file group name record.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @id_to_delete bigint   Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing, invalid or duplicate @attr_name.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a record in 'xref.file_group_names' table if all conditions are met.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀椀搀开琀漀开搀攀氀攀琀攀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 瘀愀氀椀搀⸀ 
* - There must be no references਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀  
਀ऀ 䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  -- Validate the file group id਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
		SET @id_to_delete = NULL;਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN -- No ID has been supplied਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ  ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the id exists਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀  
						FROM xref.file_group_names AS fgn਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
			   BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ  ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ 䔀一䐀 
  END  -- End IF @userauthentication_status = 'Pass'਀ 
਀  ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀渀礀 爀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀猀 
  IF @data_validation_status = 'Pass'਀    䈀䔀䜀䤀一 
	  IF EXISTS (SELECT fgl.file_group_id਀ऀऀऀऀ   䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
				  WHERE fgl.file_group_id = @id_to_delete)  ਀ऀऀ伀刀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
					 FROM user_restr.file_group_edit_perm_funct_lst AS fgepfl਀ऀऀऀऀऀ圀䠀䔀刀䔀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
		OR EXISTS (SELECT fgeppl.file_group_id ਀ऀऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 
					WHERE fgeppl.file_group_id  = @id_to_delete) ਀ऀऀ  䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
 			EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀刀攀昀䔀砀椀猀琀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ  ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀刀攀昀䔀砀椀猀琀猀⸀✀⤀㬀 
਀ऀऀ  䔀一䐀 
	END਀ 
	-- Output the data validation status failed message਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
	BEGIN਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'FailedDataValidation', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
	END਀ऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  
		      WHERE file_group_id = @id_to_delete;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ   
		    CONVERT(nvarchar(10),ERROR_NUMBER()),  ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_dc_c_ob_ms_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a default document multi-select common object. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀Ⰰ 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_dc_c_ob_ms_def]਀ 
     @formid bigint                   = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ           䔀䰀匀䔀  
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		    SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀 
					      WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ            䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
								AND form_id = @formid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀  
		       WHERE form_id = @formid਀ऀऀऀ         䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					 AND common_object_id = @commonobjectid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_dc_c_ob_ms_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a document common object list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 昀椀攀氀搀 氀椀猀琀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀挀开挀开漀戀开洀猀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @commonobjlistid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
	    SET @commonobjlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @commonobjlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
						   FROM forms.form_doc_com_obj_ms_lst_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND common_object_list_id = @commonobjlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_dc_c_ob_rb_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a document common object radio button list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 昀椀攀氀搀 氀椀猀琀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀挀开挀开漀戀开爀戀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @commonobjlistid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
	    SET @commonobjlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @commonobjlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
						   FROM forms.form_doc_com_obj_rb_lst_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND common_object_list_id = @commonobjlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_doc_bk_id_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Deletes a link between a form and base.document_id_list.booking_id. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开戀欀开椀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_id_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_booking_id_links਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开戀欀开猀琀愀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最⸀戀漀漀欀椀渀最开猀琀愀琀甀猀⸀ 
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_doc_bk_stat_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀 
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_doc_bk_usrid_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Deletes a link between a form and base.document_id_list.user_id. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开戀欀开甀猀爀椀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_user_id_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_booking_user_id_links਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开戀欀开甀猀爀渀洀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀猀礀猀琀攀洀开甀猀攀爀渀愀洀攀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_doc_bk_usrnm_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀 
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_doc_bkg_cmts_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Deletes a link between a form and base.document_id_list.comments. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开戀欀最开挀洀琀猀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_comnts_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_booking_comnts_links਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开戀欀最开搀愀琀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀戀漀漀欀椀渀最开搀愀琀攀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_doc_bkg_date_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀 
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀 
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_doc_bkg_rel_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Deletes a link between a form and base.document_id_list.release_number. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开戀欀最开爀攀氀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_release_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_booking_release_links਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开挀爀琀搀开戀礀开椀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀ⴀ挀爀攀愀琀攀搀ⴀ戀礀ⴀ椀搀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_doc_crtd_by_id_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀  
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_doc_crtd_by_nm_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Deletes a link between a form and a document-created-by-name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开挀爀琀搀开戀礀开渀洀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_created_by_nm_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_created_by_nm_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开昀甀渀挀琀开氀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀  
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开搀漀挀开昀甀渀挀琀开氀猀琀开氀椀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint          = NULL,  ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀   ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_function_list_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开昀氀开挀开漀戀开洀猀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀⸀  
-- Input is a form id and a common object field list id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_fl_c_ob_ms_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
	 IF @commonobjlistid = 0 ਀ऀ    匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc free text field list id has been supplied਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀  
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_com_obj_ms_lst_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND common_object_list_id = @commonobjlistid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_fl_c_ob_rb_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a file common object radio button list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 昀椀攀氀搀 氀椀猀琀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开昀氀开挀开漀戀开爀戀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @commonobjlistid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
	 IF @commonobjlistid = 0 ਀ऀ    匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if  field id has been supplied਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀  
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_com_obj_rb_lst_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND common_object_list_id = @commonobjlistid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	  ਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_fl_com_obj_ms_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a default file multi-select common object. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀Ⰰ 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_fl_com_obj_ms_def]਀ 
     @formid bigint                   = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ           䔀䰀匀䔀  
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0 SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0 SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀 
					      WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ            䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
								AND form_id = @formid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀  
		       WHERE form_id = @formid਀ऀऀऀ         䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					 AND common_object_id = @commonobjectid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开昀氀开挀爀琀搀开戀礀开椀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀ⴀ挀爀攀愀琀攀搀ⴀ戀礀ⴀ椀搀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_fl_crtd_by_id_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀  
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_fm_fl_crtd_by_nm_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Deletes a link between a form and a file-created-by-name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开昀氀开挀爀琀搀开戀礀开渀洀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_created_by_nm_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_created_by_nm_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀洀开昀氀开昀甀渀挀琀开氀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_fm_fl_funct_lst_links] ਀ 
     @formid bigint                   = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_function_list_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_doc_created_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Deletes a link between a form and a document created field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_created_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_created_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开搀愀琀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 16-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a document date name field id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_doc_date_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattridmessage nvarchar(200)          = '', -- Communicates that a doc date name field id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @docdatenameid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc date name field id has been supplied਀ऀ 䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀ 
				BEGIN -- Record doesn't exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_date_field_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND doc_date_name_id = @docdatenameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀㬀 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_doc_int_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀　ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a link between a form and a document integer name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开椀渀琀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docintnameid bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@recordnotexistmessage nvarchar(200)    = '', -- Communicates that a matching record does not exist਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
਀ऀ 䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 　  
	    SET @docintnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docintnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattridmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattridmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 
						   FROM forms.form_doc_integer_field_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND doc_int_name_id = @docintnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordnotexistmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordnotexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ        䄀一䐀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @message + ' | ' + @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@noformidmessage <> '')            SET @message = @message + ' | ' + @noformidmessage;਀    䤀䘀 ⠀䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@noattridmessage <> '')            SET @message = @message + ' | ' + @noattridmessage;਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开氀漀挀欀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 氀漀挀欀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_doc_lock_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀  
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开洀猀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 18-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀⸀  
-- Input is a form id and a document multi-select list id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_doc_ms_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattridmessage nvarchar(200)          = '', -- Communicates that a doc multi-select list id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @docmslistid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc multi-select list id has been supplied਀ऀ 䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT doc_ms_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_multi_sel_list_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND doc_ms_list_id = @docmslistid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀㬀 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_doc_multi_sel_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a default document multi-select object. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀Ⰰ 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_doc_multi_sel_def]਀ 
     @formid bigint                   = NULL,਀     䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @docmsattrid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ           䔀䰀匀䔀  
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @docmslistid = 0 SET @docmslistid = NULL;਀ऀऀ䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @docmsattrid = 0 ਀           匀䔀吀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		IF @docmsattrid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ䔀一䐀 
਀ 
    -- Check if a record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
		                   FROM forms.form_doc_multi_sel_defaults਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
					            AND doc_ms_attr_id = @docmsattrid਀ऀऀऀऀऀऀऀ    䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM forms.form_doc_multi_sel_defaults ਀ऀऀ       圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			         AND doc_ms_list_id = @docmslistid਀ऀऀऀऀऀ 䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_doc_radiob_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㘀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a link between a form and a document radio button list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开爀愀搀椀漀戀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docradioblistid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied doc radio button list id does not exist਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @docradioblistid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc radio button list id has been supplied਀ऀ 䤀䘀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_radio_button_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND doc_radiob_list_id = @docradioblistid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开爀攀愀氀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 30-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a document integer name field id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_doc_real_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattridmessage nvarchar(200)          = '', -- Communicates that a doc integer name field id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @docrealnameid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc integer name field id has been supplied਀ऀ 䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT doc_real_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_real_number_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND doc_real_name_id = @docrealnameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀㬀 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开搀漀挀开琀爀开最爀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_doc_tr_grp_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀  
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_file_created_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Deletes a link between a form and a file created field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_created_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_created_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开搀愀琀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 30-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a file date name field id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_date_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattridmessage nvarchar(200)          = '', -- Communicates that a file date name field id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @filedatenameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file date name field id has been supplied਀ऀ 䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT file_date_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_date_field_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND file_date_name_id = @filedatenameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀㬀 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_file_hash_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a file hash field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开栀愀猀栀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_content_hash_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_content_hash_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	   COMMIT TRANSACTION; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开椀渀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 30-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a file integer name field id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_int_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattridmessage nvarchar(200)          = '', -- Communicates that a file integer name field id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
਀ऀ 䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　  
	    SET @fileintnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @fileintnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattridmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattridmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
						   FROM forms.form_file_integer_field_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND file_int_name_id = @fileintnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordnotexistmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordnotexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ        䄀一䐀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @message + ' | ' + @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@noformidmessage <> '')            SET @message = @message + ' | ' + @noformidmessage;਀    䤀䘀 ⠀䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@noattridmessage <> '')            SET @message = @message + ' | ' + @noattridmessage;਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开洀猀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 01-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀⸀  
-- Input is a form id and a file multi-select list id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_ms_link] ਀ 
     @formid bigint                    = NULL, ਀     䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀 戀椀最椀渀琀     㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattridmessage nvarchar(200)          = '', -- Communicates that a file multi-select list id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @filemultiselectlistid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file multi-select list id has been supplied਀ऀ 䤀䘀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT file_ms_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀⤀ 
				BEGIN -- Record doesn't exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_multi_sel_list_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND file_ms_list_id = @filemultiselectlistid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀㬀 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_file_name_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a file filename field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀  
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开瀀氀椀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 瀀攀漀瀀氀攀 氀椀猀琀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_plist_links] ਀ 
     @formid bigint                   = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_people_list_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_file_radiob_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㄀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Deletes a link between a form and a file radio button list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @file_radioblistid bigint        = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied file radio button list id does not exist਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @file_radioblistid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file radio button list id has been supplied਀ऀ 䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_radio_button_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND file_radiob_list_id = @file_radioblistid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_form_file_real_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a link between a form and a file integer name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开爀攀愀氀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @filerealnameid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@recordnotexistmessage nvarchar(200)    = '', -- Communicates that a matching record does not exist਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
਀ऀ 䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 　  
	    SET @filerealnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filerealnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattridmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattridmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
						   FROM forms.form_file_real_number_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND file_real_name_id = @filerealnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordnotexistmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordnotexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ        䄀一䐀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @message + ' | ' + @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@noformidmessage <> '')            SET @message = @message + ' | ' + @noformidmessage;਀    䤀䘀 ⠀䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@noattridmessage <> '')            SET @message = @message + ' | ' + @noattridmessage;਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀渀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 23-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 爀攀琀攀渀琀椀漀渀 搀愀琀攀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_retentn_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀  
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 昀椀攀氀搀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_size_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀  
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀漀爀洀开昀椀氀攀开琀爀开最爀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 昀椀攀氀搀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_form_file_tr_grp_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀  
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀  
		      WHERE form_id = @formid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开搀漀挀开昀爀攀攀开琀砀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a document free text name field id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_frm_doc_free_txt_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattridmessage nvarchar(200)          = '', -- Communicates that a doc free text name field id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @docfreetextnameid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc free text name field id has been supplied਀ऀ 䤀䘀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT doc_free_text_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_free_text_field_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND doc_free_text_name_id = @docfreetextnameid;਀ऀ    䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀㬀 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开搀漀挀开昀甀渀挀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀甀琀礀 昀甀渀挀琀椀漀渀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_frm_doc_funct_links] ਀ 
     @formid bigint                   = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀  
						  WHERE form_id = @formid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_function_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			    AND general_field_name_id = @genfield_nameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开搀漀挀开瀀瀀氀开氀猀琀开氀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 瀀攀漀瀀氀攀 氀椀猀琀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_frm_doc_ppl_lst_lnks] ਀ 
     @formid bigint                   = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀  
						  WHERE form_id = @formid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_people_list_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			    AND general_field_name_id = @genfield_nameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开搀漀挀开甀猀攀爀开氀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 琀漀 甀猀攀爀 椀搀 氀椀渀欀⸀  
-- Input is a form id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_frm_doc_user_lnks] ਀ 
     @formid bigint                   = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀  
						  WHERE form_id = @formid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_doc_user_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			    AND general_field_name_id = @genfield_nameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开昀椀氀攀开昀爀攀攀开琀砀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 30-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a file free text name field id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_frm_file_free_txt_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattridmessage nvarchar(200)          = '', -- Communicates that a file free text name field id has not been supplied਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ 
	 IF @filefreetextnameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file free text name field id has been supplied਀ऀ 䤀䘀 䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀⤀ 
				BEGIN -- Record doesn't exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    DELETE FROM forms.form_file_free_text_links ਀ऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			        AND file_free_text_name_id = @filefreetextnameid;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀搀洀攀猀猀愀最攀㬀 
    IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_frm_file_funct_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a link between a form and a file duty function. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开昀椀氀攀开昀甀渀挀琀开氀椀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint          = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_function_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_frm_file_multi_sel_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Deletes a default file multi-select object. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀Ⰰ 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_frm_file_multi_sel_def]਀ 
     @formid bigint                   = NULL,਀     䀀昀椀氀攀洀猀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @filemsattrid bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);;਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ           䔀䰀匀䔀  
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @filemslistid = 0਀ऀऀ   匀䔀吀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @filemslistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀ䔀一䐀 
਀ 
	-- Check the multi-select attribute id reference਀ऀ    䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 　 
		   SET @filemsattrid = NULL;਀ऀऀ䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT file_ms_list_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀 
					      WHERE file_ms_list_id = @filemslistid਀ऀऀऀऀऀ            䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 
							    AND form_id = @formid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀  
		       WHERE form_id = @formid਀ऀऀऀ         䄀一䐀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
					 AND file_ms_attr_id = @filemsattrid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_frm_file_user_lnks]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Deletes a link between a form and a file to user id link. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀爀洀开昀椀氀攀开甀猀攀爀开氀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint          = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
਀ 
਀ 
      -- Check if the record doesn't exist਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_user_links ਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ    䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀  
		      WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_function_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 
-- Input is a function list id and a function id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 昀爀漀洀 琀栀攀 昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀⸀ 
* - @functionid bigint: Must be a valid id from the duty_functions table਀⨀ ⴀ 吀栀攀 瀀愀椀爀 漀昀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 愀渀搀 䀀昀甀渀挀琀椀漀渀椀搀 洀甀猀琀 洀愀琀挀栀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a record from people.function_lists ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀甀渀挀琀椀漀渀开氀椀猀琀崀  
਀          
	 @functionlistid bigint           = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	  IF @functionlistid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
      IF @functionlistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID.');਀ऀऀऀ 䔀一䐀 
਀ 
	 -- Check the function id਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 　 
			 SET @functionid = NULL; ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @functionid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionID.');਀ऀऀऀ 䔀一䐀 
਀ 
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  伀渀氀礀 瀀攀爀昀漀爀洀 琀栀椀猀 挀栀攀挀欀 椀昀 戀漀琀栀 瀀愀爀愀洀攀琀攀爀猀 栀愀瘀攀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
	 IF @data_validation_status = 'Pass'਀ऀ    䄀一䐀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT fl.function_list_id਀ऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
			  WHERE fl.function_list_id = @functionlistid਀ऀऀऀऀऀ䄀一䐀 昀氀⸀昀甀渀挀琀椀漀渀开椀搀  㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM people.function_lists਀ऀऀ  圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
		        AND  function_id = @functionid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), '.  ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from people.function_list_names to delete a duty function list name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record from people.function_list_names to delete a duty function list name਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @id_to_delete bigint: Mandatory਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a record from people.function_list_names ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀崀  
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
		  IF @id_to_delete = 0਀ऀऀऀ 匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                 FROM people.function_list_names AS fln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
	  -- Referential constraint error messaging is handled in the CATCH block਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the delete query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM people.function_list_names਀ऀऀ  圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀⸀  ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_people_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀  
-- Input is a people list id and a person id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀  
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 昀爀漀洀 琀栀攀 瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀⸀ 
* - @sid bigint: Must be a valid id from the sid list table਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_people_list] ਀ 
         ਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @sidid bigint                    = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
      IF @peoplelistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID.');਀ऀऀऀ 䔀一䐀 
਀ 
	 -- Check the sid id਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 㴀 　 
			 SET @sidid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @sidid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀匀椀搀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSidId.');਀ऀऀऀ 䔀一䐀 
਀ 
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  伀渀氀礀 瀀攀爀昀漀爀洀 琀栀椀猀 挀栀攀挀欀 椀昀 戀漀琀栀 椀渀瀀甀琀 瘀愀氀甀攀猀 栀愀瘀攀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  
	 IF @data_validation_status = 'Pass'਀ऀ    䄀一䐀 一伀吀 䔀堀䤀匀吀匀  
				(SELECT pl.people_list_id਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
				  WHERE pl.people_list_id = @peoplelistid਀ऀऀऀऀऀऀ䄀一䐀 瀀氀⸀猀椀搀开椀搀  㴀 䀀猀椀搀椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ 
		-- Referential constraint error messaging is handled in the CATCH block. ਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ  䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀甀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀瘀漀欀攀开氀漀最 ⴀⴀ 䌀爀攀愀琀攀 愀渀 愀甀搀椀琀 氀漀最 攀渀琀爀礀 
	              (privilege, privilege_name, sid_id, username, granted_on, granted_by, revoked_by)਀ऀ       嘀䄀䰀唀䔀匀 ⠀✀倀攀漀瀀氀攀 䰀椀猀琀✀Ⰰ 
		          (SELECT name FROM people.people_list_names਀ऀऀऀऀ                   圀䠀䔀刀䔀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
								         = @peoplelistid),਀ऀऀ          䀀猀椀搀椀搀Ⰰ 
		          (SELECT username FROM user_restr.sid_list਀ऀऀऀऀ                  圀䠀䔀刀䔀         猀椀搀开椀搀  
										= @sidid),਀ऀऀ          ⠀匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 
								 WHERE    people_list_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
								  	   AND sid_id ਀ऀऀऀऀऀऀऀऀऀ    㴀 䀀猀椀搀椀搀⤀Ⰰ 
		          (SELECT granted_by FROM people.people_lists਀ऀऀऀऀऀऀऀऀ    圀䠀䔀刀䔀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
								          = @peoplelistid਀ऀऀऀऀऀऀऀऀ  ऀ      䄀一䐀 猀椀搀开椀搀  
									       = @sidid),਀ऀऀऀऀ  䀀甀猀攀爀渀愀洀攀⤀ 
਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 
		  WHERE people_list_id = @peoplelistid਀ऀऀ        䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀㬀 
		COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_people_list_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 琀漀 搀攀氀攀琀攀 愀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀 
-- Input is record  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 琀漀 搀攀氀攀琀攀 愀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀椀搀开琀漀开搀攀氀攀琀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a record from people.people_list_names ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀崀  
਀     䀀椀搀开琀漀开搀攀氀攀琀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	      -- Check the record id਀ऀऀ  䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 　 
			 SET @id_to_delete = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @id_to_delete IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT pln.people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
							WHERE pln.people_list_id = @id_to_delete)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 刀攀昀攀爀攀渀琀椀愀氀 挀漀渀猀琀爀愀椀渀琀 攀爀爀漀爀 洀攀猀猀愀最椀渀最 椀猀 栀愀渀搀氀攀搀 椀渀 琀栀攀 䌀䄀吀䌀䠀 戀氀漀挀欀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
		       WHERE people_list_id = @id_to_delete; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	  ਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_restricted_form_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 昀漀爀洀 椀搀 戀甀琀 渀漀琀 椀昀 漀眀渀攀搀 戀礀 漀琀栀攀爀猀 
-- Input is a form id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- 05-08-2023 Added user authentication਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_restricted_form_id]਀ 
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀漀爀洀 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that no record id was supplied਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
	 -- Authenticate the user for that form group਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @id_to_delete,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @id_to_delete = 0਀ऀऀ匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	 -- Check the ID has not been supplied਀ऀ 䤀䘀 䀀椀搀开琀漀开搀攀氀攀琀攀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一愀洀攀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if the id does not exist਀ऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							FROM forms.form_identifier_names ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀  
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
਀ऀ   
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀   
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
		       WHERE form_id = @id_to_delete;਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀ऀ䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_tag_br_tr_perm_flist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 琀愀最 氀椀渀欀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 爀攀瘀漀欀攀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 洀攀洀戀攀爀猀 漀昀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_tag_br_tr_perm_flist] ਀ 
     @tag_br_treeid bigint            = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 　  
			 SET @tag_br_treeid = NULL;਀  
		  -- Check if a tag browsing tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开戀爀开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag browsing tree id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagBrTreeID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䈀爀吀爀攀攀䤀䐀⸀✀⤀㬀 
			 END਀           䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_browsing_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
								       = @tag_br_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 琀爀攀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @tag_br_treeid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagBrTreeIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀ऀऀ䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀      䔀䰀匀䔀 
			 -- function list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @functionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @functionlistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_br_tree_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
					      = @tag_br_treeid਀ऀऀऀऀऀ  䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @functionlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE user_restr.tag_br_tree_permissions_flist ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		        = @tag_br_treeid਀ऀऀऀ䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			    = @functionlistid;਀ऀ  䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ  ऀ  
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开戀爀开琀爀开瀀攀爀洀开瀀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a tag link permissions record to revoke authorisation for members of a people list to edit a tag browsing tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开戀爀开琀爀开瀀攀爀洀开瀀氀椀猀琀崀  
਀     䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @peoplelistid bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䈀爀吀爀攀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagBrTreeID.');਀ऀऀऀ 䔀一䐀 
           ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagBrTreeIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @peoplelistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS i਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE    tag_browsing_tree_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀 
					  AND    people_list_id਀ऀऀऀऀऀ      㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀  
		  WHERE    tag_browsing_tree_id਀ऀऀ        㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀 
			AND    people_list_id਀ऀऀऀ    㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  	 ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_tag_browsing_tree]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀Ⰰ 戀漀琀栀 琀栀攀 渀愀洀攀 搀攀琀愀椀氀猀 愀渀搀 琀栀攀 渀漀搀攀猀⸀ 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_tag_browsing_tree] ਀ 
     @tag_br_treeid bigint            = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTree.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- Check that the tag browsing tree is valid਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ  ⴀⴀ 䐀攀氀攀琀攀 琀栀攀 琀愀最 琀爀攀攀 
	  DELETE FROM tagging.tag_browsing_tree_nodes਀ऀऀ    圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
				  = @tag_br_treeid; ਀ 
      -- Delete the tag tree name details਀ऀ     䐀䔀䰀䔀吀䔀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
		  WHERE    tag_browsing_tree_id ਀ऀऀऀऀ㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀㬀  
਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_tag_group_id_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 渀攀眀 琀愀最 最爀漀甀瀀 椀搀攀渀琀椀昀椀攀爀 渀愀洀攀 爀攀挀漀爀搀⸀ 
-- All parameters must be sent, otherwise they will be set to null. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开最爀漀甀瀀开椀搀开渀愀洀攀崀  
਀ऀ 䀀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  --  Check the tag group ID.਀ऀ   
	  	  IF @tag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_groupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 最爀漀甀瀀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGroupID.');਀ऀऀऀ 䔀一䐀 
		  IF @tag_groupid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_group_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
								 WHERE    tag_group_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开最爀漀甀瀀椀搀⤀ 
					 BEGIN -- Tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagGroupNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
		  WHERE    tag_group_id਀ऀऀ        㴀 䀀琀愀最开最爀漀甀瀀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开最爀漀甀瀀开瀀攀爀洀开昀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a tag link permissions record to revoke authorisation for members of a function list to link tags to a tag group਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开最爀漀甀瀀开瀀攀爀洀开昀氀椀猀琀崀  
਀ 
     @tag_groupid bigint              = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 SET @tag_groupid = NULL;਀  
		  -- Check if a tag group id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagGroupID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @tag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @tag_groupid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀ऀऀ䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀      䔀䰀匀䔀 
			 -- function list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @functionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @functionlistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
		             FROM user_restr.tag_group_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
					      = @tag_groupid਀ऀऀऀऀऀ  䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @functionlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀  
		  WHERE    tag_group_id਀ऀऀ        㴀 䀀琀愀最开最爀漀甀瀀椀搀 
			AND    function_list_id਀ऀऀऀ    㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_tag_group_perm_plist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 琀愀最 氀椀渀欀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 爀攀瘀漀欀攀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 洀攀洀戀攀爀猀 漀昀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 氀椀渀欀 琀愀最猀 琀漀 愀 琀愀最 最爀漀甀瀀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_tag_group_perm_plist] ਀ 
਀     䀀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @peoplelistid bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_groupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGroupID.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_group_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
								 WHERE    tag_group_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开最爀漀甀瀀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagGroupNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @peoplelistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS i਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF NOT EXISTS (SELECT tag_group_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE    tag_group_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开最爀漀甀瀀椀搀 
					  AND    people_list_id਀ऀऀऀऀऀ      㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀  
		  WHERE    tag_group_id਀ऀऀ        㴀 䀀琀愀最开最爀漀甀瀀椀搀 
			AND    people_list_id਀ऀऀऀ    㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_tag_tree]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 琀愀最 琀爀攀攀Ⰰ 戀漀琀栀 琀栀攀 渀愀洀攀 搀攀琀愀椀氀猀 愀渀搀 琀栀攀 渀漀搀攀猀⸀ 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_tag_tree] ਀ 
     @tag_treeid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  	  IF @tag_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTree.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ  ⴀⴀ 䐀攀氀攀琀攀 琀栀攀 琀愀最 琀爀攀攀 
	  DELETE FROM tagging.tag_tree_nodes਀ऀऀ    圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
				  = @tag_treeid; ਀ 
      -- Delete the tag tree name details਀ऀ     䐀䔀䰀䔀吀䔀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
		  WHERE    tag_tree_id ਀ऀऀऀऀ㴀 䀀琀愀最开琀爀攀攀椀搀㬀  
਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_tag_tree_perm_flist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creationrevoke authoristion for members of a function list to edit a tag tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开琀爀攀攀开瀀攀爀洀开昀氀椀猀琀崀  
਀ 
     @tag_treeid bigint               = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagTree', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀⸀✀⤀㬀 
			 END਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
								       = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 琀爀攀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @tag_treeid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀ऀऀ䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀      䔀䰀匀䔀 
			 -- function list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @functionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @functionlistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_tree_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
					      = @tag_treeid਀ऀऀऀऀऀ  䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @functionlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the Delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀  
		  WHERE    tag_tree_id਀ऀऀ        㴀 䀀琀愀最开琀爀攀攀椀搀 
			AND    function_list_id਀ऀऀऀ    㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_tag_tree_perm_plist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 琀愀最 氀椀渀欀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 爀攀瘀漀欀攀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 洀攀洀戀攀爀猀 漀昀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 攀搀椀琀 愀 琀愀最 琀爀攀攀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_tag_tree_perm_plist] ਀ 
਀     䀀琀愀最开琀爀攀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @peoplelistid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTree.');਀ऀऀऀ 䔀一䐀 
		  IF @tag_treeid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开琀爀攀攀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @peoplelistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS i਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF NOT EXISTS (SELECT tag_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE    tag_tree_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开琀爀攀攀椀搀 
					  AND    people_list_id਀ऀऀऀऀऀ      㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀  
		  WHERE    tag_tree_id਀ऀऀ        㴀 䀀琀愀最开琀爀攀攀椀搀 
			AND    people_list_id਀ऀऀऀ    㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_transaction_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ　㠀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 渀漀琀攀⸀ 
-- Input is a transaction group id ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_transaction_group]਀ 
	 @transactiongroup bigint                       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀                        㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)               = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Validation checks਀ऀ  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 　 
		 SET @transactiongroup = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀  
	  IF @transactiongroup IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			SET @transactiongroup = NULL;਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				 @message_id = 'NoTGroup', @message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTGroup.');਀ऀऀ 䔀一䐀 
	  ELSE਀ऀऀ 䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT transaction_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀  
							 WHERE transaction_group_id = @transactiongroup) ਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TGNotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀一䐀 
		 END   -- End checking transaction group reference਀ 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀  
		       WHERE    transaction_group_id ਀ऀऀऀ         㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀㬀 
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀  ⴀⴀ 䔀渀搀 椀昀 琀爀愀渀猀愀挀琀椀漀渀 爀攀愀搀礀 㴀 刀攀愀搀礀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀昀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from workflow_instances.workflow_step_duty_functions਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 愀渀搀 愀 昀甀渀挀琀椀漀渀 椀搀⸀    
-- Output is a status message and transation status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_wf_step_duty_funct] ਀ 
         ਀ऀ 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @functionid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
	  IF @instance_step_id = 0਀ऀ     匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
      IF @instance_step_id IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
		ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀ  䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
			  @step_authentication_result = @object_auth_result OUTPUT;਀ऀऀ   䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			 BEGIN਀ऀऀ ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
			 END਀ 
		 END਀ 
	  -- Check the duty function id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 　 
	     SET @functionid = NULL;਀      䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ 
   IF @data_validation_status = 'Pass'-- Futher validation checks਀    䈀䔀䜀䤀一  
	 IF NOT EXISTS  -- Check that the record exists਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			   FROM workflow_instances.workflow_step_duty_functions਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
			        =        @instance_step_id਀ऀऀऀऀ䄀一䐀    昀甀渀挀琀椀漀渀开椀搀 
				    = @functionid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀ䔀一䐀 
-- Check if there is a corresponding foreign key for the workflow_instance_step_id / function_id in workflow_function_output_files.਀  䤀䘀 䔀堀䤀匀吀匀  
    (SELECT workflow_instance_step_id਀ऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
	  WHERE workflow_instance_step_id = @instance_step_id਀ऀ    䄀一䐀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- A foreign key exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'WfFunctOutFRef',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䘀甀渀挀琀伀甀琀䘀刀攀昀⸀✀⤀㬀 
		END਀ 
	 END -- END IF @data_validation_status = 'Pass'-- Futher validation checks਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_instances.workflow_step_duty_functions਀ऀऀऀ   圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
			         =        @instance_step_id਀ऀऀऀऀ 䄀一䐀    昀甀渀挀琀椀漀渀开椀搀 
				     = @functionid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), '.  ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_workflow_instance_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
-- Input is a record id.   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀崀  
਀          
	 @recordid bigint                 = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@object_auth_result nvarchar(10) = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
	  IF @recordid = 0਀ऀ     匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
      IF @recordid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀऀ 䔀一䐀 
      ELSE -- A record id has been supplied਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT workflow_instance_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
			  WHERE workflow_instance_id = @recordid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀ䔀一䐀 
	ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀ 䈀䔀䜀䤀一 
	   EXEC [internal].[usp_AUTHENTICATE_wf_instance]਀ऀ      䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀 㴀 䀀爀攀挀漀爀搀椀搀Ⰰ 
		  @wf_instance_auth_result = @object_auth_result OUTPUT;਀ऀ   䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
	     BEGIN਀ऀऀ ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'WFInstanceNotAuth', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀⸀✀⤀㬀 
		 END਀ऀ 䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
		  WHERE workflow_instance_id = @recordid; ਀ऀ   䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), '.  ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END -- END IF @transaction_ready = 'Ready'਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from workflow_instances.workflow_instance_steps਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀⸀    
-- Output is a status message and transation status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_DEL_workflow_instance_step] ਀ 
         ਀ऀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Check the record id਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
	     SET @recordid = NULL;਀      䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
			 END਀      䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			   FROM workflow_instances.workflow_instance_steps਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
		BEGIN਀ऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
			@instance_step_to_check = @recordid,਀ऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
		 IF @object_auth_result = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
		 		SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀ䔀一䐀 
	    END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     DELETE FROM workflow_instances.workflow_instance_steps਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
	   COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀⸀  ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_DEL_workflow_participant]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 
-- Input is an instance step id and a person id.   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀漀爀欀昀氀漀眀开瀀愀爀琀椀挀椀瀀愀渀琀崀  
਀          
	 @instance_step_id bigint         = NULL,਀ऀ 䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Check the instance step id਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
	     SET @instance_step_id = NULL;਀      䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀ 
	  -- Check the person id਀ऀ  䤀䘀 䀀猀椀搀椀搀 㴀 　 
	     SET @sidid = NULL;਀      䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ 
   IF @data_validation_status = 'Pass'  -- Futher checks after initial validation checks਀    䈀䔀䜀䤀一  
	 IF NOT EXISTS -- Check that the record exists਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			   FROM workflow_instances.workflow_step_participants਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
			        =        @instance_step_id਀ऀऀऀऀ䄀一䐀    猀椀搀开椀搀 
				    = @sidid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀ䔀一䐀 
	 ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ䈀䔀䜀䤀一 
		EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
			@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀ䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀ ऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
			END਀ऀ    䔀一䐀 
਀ 
-- Check if there is a corresponding foreign key for the workflow_instance_step_id / sid_id in workflow_person_output_files.਀  䤀䘀 䔀堀䤀匀吀匀  
    (SELECT workflow_instance_step_id਀ऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
	  WHERE workflow_instance_step_id = @instance_step_id਀ऀ    䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
		BEGIN -- A foreign key exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'WfPersOutFRef',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀倀攀爀猀伀甀琀䘀刀攀昀⸀✀⤀㬀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ 
	END -- END IF @data_validation_status = 'Pass'  -- Futher checks after initial validation checks਀ 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 
			   WHERE workflow_instance_step_id ਀ऀऀऀ         㴀        䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
				 AND    sid_id਀ऀऀऀऀ     㴀 䀀猀椀搀椀搀㬀  
	    COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀⸀  ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_common_object]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀攀挀漀爀搀 
-- Input is mnemonic, name, description and a common object attribute id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀洀洀漀渀开漀戀樀攀挀琀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @objectname nvarchar(50)         = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @commonobjattrid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@xrefinvalidmessage nvarchar(200)       = '', -- Communicates that the foreign key is invalid਀ऀ    䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 椀猀 渀漀琀 甀渀椀焀甀攀 
		@noattributenamemessage nvarchar(200)   = '', -- Communicates that no attribute name was supplied਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @objectname = ''਀ऀऀऀ匀䔀吀 䀀漀戀樀攀挀琀渀愀洀攀 㴀 一唀䰀䰀㬀 
		IF EXISTS (SELECT object_name ਀ऀऀ ऀऀ ऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
					WHERE object_name = @objectname) ਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @notuniquemessage = ISNULL(LEFT(@objectname, 10), '') + '... | ' + @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
		 @mnem             = @mnemonic,਀ऀऀ 䀀愀琀琀爀开渀愀洀攀        㴀 䀀漀戀樀攀挀琀渀愀洀攀Ⰰ 
		 @descr            = @description,਀ऀऀ 䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
		 @messg            = @validationmessage OUTPUT;਀ऀ   䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
	      BEGIN਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			  SET @data_validation_status = 'Fail';਀ऀऀ  䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 愀琀琀爀椀戀甀琀攀 爀攀昀攀爀攀渀挀攀 
		 IF @commonobjattrid = 0 ਀ऀऀ    匀䔀吀 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjattrid IS NOT NULL਀ऀऀ   䈀䔀䜀䤀一 
		     IF NOT EXISTS (SELECT common_object_attribute_id਀ऀऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 
						      WHERE common_object_attribute_id = @commonobjattrid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @xrefinvalidmessage = CONVERT(nvarchar(10), @commonobjattrid) + ' | ' +  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @xrefinvalidmessage = 'A database level message error occurred on ComObjAttrNotExist';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
		             (mnem,      object_name, description,   common_object_attribute_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀漀戀樀攀挀琀渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀⤀㬀  
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 攀渀琀爀礀 愀渀搀 爀攀琀爀椀攀瘀攀 琀栀攀 渀攀眀 爀漀眀 椀搀 
  IF (@transaction_status = 'Good')਀    䈀䔀䜀䤀一 吀刀夀 
	  SET @newrecordid = SCOPE_IDENTITY();਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀ऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
     EXEC internal.usp_SEL_message ਀          䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
          @message_text = @tempmessage OUTPUT;਀ऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	    SET @transactionmessage2 = @tempmessage + ' | ' + ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
	 ELSE ਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	END CATCH਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀洀洀漀渀开漀戀樀攀挀琀开氀猀琀开椀琀攀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a common object list record਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀Ⰰ 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 ⠀愀猀 攀氀攀洀攀渀琀 漀昀 愀 氀椀猀琀⤀ 
-- list position and filter group.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀洀洀漀渀开漀戀樀攀挀琀开氀猀琀开椀琀攀洀崀 
਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀ऀ              㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		 -- Check the common object list reference਀ऀऀ  䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
		     SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT common_object_list_id਀ऀऀ               䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 
					  WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO com_obj.common_object_lists ਀ऀऀ             ⠀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀Ⰰ 氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (@commonobjlistid,     @commonobjectid,  @listposition); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 搀漀挀甀洀攀渀琀 琀漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Only permits a document group and document which the user has rights to.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 愀渀搀 渀漀琀攀猀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_contr_doc_group_link]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ 
	 @inputnotes nvarchar(max)        = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ䤀䘀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 　 
		   SET @contr_doc_ed_grp_name_id = NULL;਀ 
		IF @contr_doc_ed_grp_name_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䌀漀渀䐀漀挀䜀爀漀甀瀀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoConDocGroup');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ 
	 -- Authenticate the user for the given controller level document group਀ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
    EXEC [internal].[usp_AUTHENTICATE_cont_doc_grp]਀ऀ     䀀挀漀渀琀爀开搀漀挀开最爀瀀开琀漀开挀栀攀挀欀 㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀Ⰰ 
		 @user_authentication_result_cep = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'InvalidConDocGrp', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䌀漀渀䐀漀挀䜀爀瀀✀⤀㬀 
		END਀ 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ 
		   ELSE਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ 
 ਀ऀऀऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最爀漀甀瀀 栀愀猀 戀攀攀渀 氀椀渀欀攀搀 琀漀 琀栀愀琀 搀漀挀甀洀攀渀琀 愀氀爀攀愀搀礀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
							 FROM xref.controller_doc_group_links਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 
								  AND doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO xref.controller_doc_group_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀Ⰰ       渀漀琀攀猀⤀ 
		      VALUES (@documentid, @contr_doc_ed_grp_name_id,    @inputnotes)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 昀椀氀攀 琀漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Only permits a file group and file which the user has rights to.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 椀搀 愀渀搀 渀漀琀攀猀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_contr_file_group_link]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ 
	 @inputnotes nvarchar(max)        = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ䤀䘀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀 㴀 　 
		   SET @contr_file_ed_grp_name_id = NULL;਀ 
		IF @contr_file_ed_grp_name_id IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䌀漀渀䘀椀氀攀䜀爀漀甀瀀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoConFileGroup');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ 
	 -- Authenticate the user for the given file group਀ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
    EXEC [internal].[usp_AUTHENTICATE_cont_file_grp]਀ऀ     䀀挀漀渀琀爀开昀椀氀攀开最爀瀀开琀漀开挀栀攀挀欀 㴀 䀀挀漀渀琀爀开昀椀氀攀开攀搀开最爀瀀开渀愀洀攀开椀搀Ⰰ 
		 @user_authentication_result_cep = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'InvalidConFileGrp', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䌀漀渀䘀椀氀攀䜀爀瀀✀⤀㬀 
		END਀ 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ   䔀䰀匀䔀 
				BEGIN -- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 							@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(10), @fileid), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀  
			-- Check if the group has been linked to that file already਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT file_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 
			 				WHERE controller_file_group_name_id = @contr_file_ed_grp_name_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO xref.controller_file_group_links ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀Ⰰ       渀漀琀攀猀⤀ 
		      VALUES (@fileid, @contr_file_ed_grp_name_id,     @inputnotes)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开最瀀开攀搀开瀀攀爀洀开昀甀渀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into user_restr.doc_group_edit_perm_funct_lst to authorise a user਀ⴀⴀ 琀漀 攀搀椀琀 搀漀挀甀洀攀渀琀猀 眀椀琀栀椀渀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀  
-- Input is a document group ID, a function list ID and ਀ⴀⴀ 愀渀搀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开最瀀开攀搀开瀀攀爀洀开昀甀渀挀琀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @functionlistid bigint           = NULL,  -- User duty function list id਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 攀渀琀爀礀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
		@recordexistsmessage nvarchar(200)   = '',     -- Communicates that a matching record already exists਀        䀀渀漀搀漀挀最爀漀甀瀀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 
		@nofunctionlistidmsg nvarchar(200)   = '',     -- Communicates that no function list ID was supplied਀ऀऀ䀀昀甀渀挀琀椀漀渀氀椀猀琀椀渀瘀愀氀椀搀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 眀愀猀 椀渀瘀愀氀椀搀 
		@docgroupinvalidmsg nvarchar(200)    = '', -- Communicates that the document group does not exist or the user does not have rights to it਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transactionmessage2 nvarchar(200)   = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
		    SET @docgroupid = NULL;਀ऀऀ 䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoDocGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
		   BEGIN਀ऀऀऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
			 -- This also returns negative if the id does not exist਀ऀऀऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
					@docgroupid_to_check_vp = @docgroupid,਀ऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			  IF @tempuserauth_status = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					SET @userauthentication_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @docgroupinvalidmsg = 'Document group ID: ' + ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL') + '  ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docgroupinvalidmsg = 'A database level message error occurred on NoDocGroupPermission.';਀ऀऀऀऀ䔀一䐀 
            END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @functionlistid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @functionlistid IS NULL  ਀ऀ     䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @nofunctionlistidmsg  = @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				SET @nofunctionlistidmsg  = 'A database level message error occurred on NoFunctionListID';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT function_list_id਀ऀऀऀऀ                  䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 
								 WHERE function_list_id = @functionlistid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @functionlistinvalid =  ISNULL(CONVERT(nvarchar(10), @functionlistid), 'NULL') + ' | '  + @tempmessage; ਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @functionlistinvalid = 'A database level message error occurred on FunctListIDInvalid';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
 		    END਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
				   	      FROM user_restr.doc_group_edit_perm_funct_lst ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						       AND function_list_id = @functionlistid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @recordexistsmessage =  @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @recordexistsmessage = 'A database level message error occurred on RecordExists';਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO user_restr.doc_group_edit_perm_funct_lst਀ऀऀ             ⠀搀漀挀开最爀漀甀瀀开椀搀Ⰰ 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀Ⰰ   渀漀琀攀猀Ⰰ 最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@docgroupid, @functionlistid,   @inputnotes, @username); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nodocgroupmsg <> '')              SET @message = @message + ' | ' + @nodocgroupmsg;਀ऀ䤀䘀 ⠀䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最㬀 
	IF (@recordexistsmessage <> '')        SET @message = @message + ' | ' + @recordexistsmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀甀渀挀琀椀漀渀氀椀猀琀椀搀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀甀渀挀琀椀漀渀氀椀猀琀椀搀洀猀最㬀 
	IF (@functionlistinvalid <> '')        SET @message = @message + ' | ' + @functionlistinvalid;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_doc_gp_ed_perm_people]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 琀漀 愀甀琀栀漀爀椀猀攀 愀 甀猀攀爀 
-- to edit documents within a document group. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀Ⰰ 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀 愀渀搀  
-- and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 琀漀 瀀攀漀瀀氀攀 氀椀猀琀 氀椀渀欀 爀攀挀漀爀搀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @peoplelistid bigint: Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ ⴀ 怀怀䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀怀怀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - ``@transaction_status nchar(50) OUTPUT``: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - The document group id must be one which the connected user has view permissions for.਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing @docgroupid, @peoplelistid, or non-existing record in database.਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =============================================================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开最瀀开攀搀开瀀攀爀洀开瀀攀漀瀀氀攀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @peoplelistid bigint             = NULL,  -- User duty function list id਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 攀渀琀爀礀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀甀猀攀爀渀愀洀攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		IF @docgroupid = 0਀ऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		 IF @docgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupId');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀऀऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
			 -- This also returns negative if the id does not exist਀ऀऀऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
					@docgroupid_to_check_vp = @docgroupid,਀ऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			  IF @tempuserauth_status = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					SET @userauthentication_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', 'Document group ID: ', ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL'), '  ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupPermission.');਀ऀऀऀऀ䔀一䐀 
਀ 
      -- Check the people list id has been supplied਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀   
	     BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the people list exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				                  FROM people.people_list_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ 
		END਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
				   	      FROM user_restr.doc_group_edit_perm_people_lst ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						       AND people_list_id = @peoplelistid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO user_restr.doc_group_edit_perm_people_lst਀ऀऀ             ⠀搀漀挀开最爀漀甀瀀开椀搀Ⰰ 瀀攀漀瀀氀攀开氀椀猀琀开椀搀Ⰰ   渀漀琀攀猀Ⰰ 最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@docgroupid, @peoplelistid,   @inputnotes, @username); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ',  @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document group name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 搀漀挀开最爀漀甀瀀开渀愀洀攀猀⸀ 
-- Input is the paramters for a document group name:਀ⴀⴀ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀⸀   
-- Output is a status message, a transaction status and the id of the new record.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_doc_group_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀猀 
    EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀    䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @attribute_name = ''਀ऀऀ匀䔀吀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀琀琀爀开渀愀洀攀  
		 			FROM xref.doc_group_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @transactionmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀  
		             (mnem,      attr_name,       descr)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀洀渀攀洀漀渀椀挀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䀀搀攀猀挀爀椀瀀琀椀漀渀⤀㬀  
	    SET @newrecordid = SCOPE_IDENTITY();਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_document_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Creates a new document ID record.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 ⠀漀瀀琀椀漀渀愀氀⤀ 愀渀搀 愀渀 䤀䐀 氀漀挀欀 猀琀愀琀甀猀⸀ 
-- Output is status messages.਀ⴀⴀ 匀攀攀 攀搀椀琀椀渀最⸀甀猀瀀开䤀一匀开搀漀挀甀洀攀渀琀开椀搀开爀攀猀琀爀 昀漀爀 挀爀攀愀琀椀渀最 搀漀挀甀洀攀渀琀 䤀䐀 戀礀 攀搀椀琀漀爀 
--਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀甀洀攀渀琀开椀搀崀  
	਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ  
	 @transactiongroup bigint         = NULL,਀ऀ 䀀椀搀氀漀挀欀猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㄀　⤀       㴀 ✀唀渀氀漀挀欀攀搀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newdocumentid nvarchar(50)      = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
	DECLARE਀ 
		@tempmessage nvarchar(300)           = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @transactionmessage nvarchar(300)    = '', -- Communicates what was the outcome of the transaction਀        䀀渀漀搀愀琀愀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀         㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀愀琀愀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@nopermissionmessage nvarchar(200)   = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀猀椀搀椀搀 戀椀最椀渀琀                        㴀 一唀䰀䰀Ⰰ   
		@tempuserauth_status nchar(10)       = 'Fail',  -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @toolong50message nvarchar(200)      = '', -- Communicates that a string was longer than 50 characters and may have been truncated਀ऀऀ䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 眀愀猀 渀漀琀 甀渀椀焀甀攀 
		@invaliddocid nvarchar(200)          = '', -- Communicates that the document ID is invalid਀ऀऀ䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@maxiterationcount int	             = NULL, -- Maximum number of attempts to autogenerate a document ID਀ऀऀ䀀栀愀猀开渀漀渀开瀀爀椀渀琀愀戀氀攀开挀栀愀爀 椀渀琀          㴀 一唀䰀䰀Ⰰ ⴀⴀ 䄀 挀漀甀渀琀 漀昀 琀栀攀 渀甀洀戀攀爀 漀昀 渀漀渀ⴀ瀀爀椀渀琀愀戀氀攀 挀栀愀爀愀挀琀攀爀猀 椀渀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 
		@transaction_ready nchar(10)         = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted'; ਀  匀䔀吀 䀀椀搀氀漀挀欀猀琀愀琀甀猀 㴀 ✀唀渀氀漀挀欀攀搀✀㬀 
਀ 
਀匀䔀吀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开愀甀琀漀最攀渀开洀愀砀开琀爀椀攀猀  
                           FROM base.global_settings_groups);਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ 
  -- Select the SID ID for the connected user਀ऀ  匀䔀䰀䔀䌀吀 䀀猀椀搀椀搀 㴀 猀氀⸀猀椀搀开椀搀 
		FROM user_restr.sid_list AS sl਀ऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀㬀 
਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check if the document ID is NULL਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN਀ऀऀऀऀ䤀䘀 ⠀匀䔀䰀䔀䌀吀 甀猀攀开愀甀琀漀开最攀渀开搀漀挀开椀搀开漀渀开渀甀氀氀 
					  FROM base.global_settings_groups) = 'No'਀ऀऀऀऀऀ䈀䔀䜀䤀一 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀愀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀愀⸀✀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 一唀䰀䰀 愀渀搀 琀栀攀 愀甀琀漀 最攀渀攀爀愀琀攀 漀瀀琀椀漀渀 椀猀 渀漀琀 ✀一漀✀ 
				   BEGIN -- Auto generate a document ID਀ऀऀऀऀऀऀ圀䠀䤀䰀䔀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㸀 　 
							BEGIN਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㴀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 ⴀ ㄀㬀 
								IF (SELECT doc_id_format਀ऀऀऀऀऀऀऀऀ      䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⤀ 㴀 ✀䤀渀琀攀最攀爀✀ 
								  BEGIN਀ऀऀऀऀऀऀऀऀ    匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㔀　⤀Ⰰ 䤀匀一唀䰀䰀⠀搀漀挀开椀搀开氀愀猀琀开椀渀琀攀最攀爀Ⰰ 　⤀ ⬀ ㄀⤀ 
								      FROM base.global_settings_groups;਀ऀऀऀऀऀऀऀऀऀ唀倀䐀䄀吀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
									  SET doc_id_last_integer = doc_id_last_integer + 1;਀ऀऀऀऀऀऀऀऀ  䔀一䐀 
								ELSE -- The document ID format is not Integer. ਀ऀऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开爀愀渀搀漀洀开搀漀挀开椀搀 
										@randomdocumentid = @documentid OUTPUT;਀ऀऀऀऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀  
													FROM base.document_id_list਀ऀऀऀऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
									BREAK਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  䌀伀一吀䤀一唀䔀 
							END ਀ऀऀऀऀऀऀ䤀䘀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㰀 ㄀  ⴀⴀ 䌀愀渀✀琀 最攀渀攀爀愀琀攀 愀 甀渀椀焀甀攀 爀愀渀搀漀洀 搀漀挀甀洀攀渀琀 䤀䐀 
						   BEGIN਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䴀愀砀䐀漀挀吀爀椀攀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䴀愀砀䐀漀挀吀爀椀攀猀⸀✀㬀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   END਀ऀऀऀऀऀऀⴀⴀ 䄀搀搀 琀栀攀 瀀爀攀昀椀砀 椀昀 瀀爀攀昀椀砀 椀猀 猀攀氀攀挀琀攀搀 椀渀 琀栀攀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 琀愀戀氀攀 
						IF (SELECT is_register_code_applied ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⤀ 㴀 ✀夀攀猀✀ 
							   AND @data_validation_status = 'Pass'਀ऀऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 爀攀最椀猀琀攀爀开挀漀搀攀 
									                FROM base.global_settings_groups)਀ऀऀऀऀऀऀऀऀऀऀऀऀऀ⬀ ✀ⴀ✀ ⬀ 䀀搀漀挀甀洀攀渀琀椀搀                     
				   END -- End autogenerate document ID਀ऀऀऀ 䔀一䐀 
		  ELSE -- document ID supplied.਀ऀऀऀ䈀䔀䜀䤀一   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 甀渀椀焀甀攀⸀ 
			   IF EXISTS (SELECT doc_id ਀   ऀऀऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
							   WHERE doc_id = @documentid) ਀ऀऀऀऀ  䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀漀挀一漀琀唀渀椀焀甀攀✀Ⰰ  
						 @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					   SET @notuniquemessage = LEFT(@documentid, 6) + '...' + ' | ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @notuniquemessage = 'A database level message error occurred on DocNotUnique.';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 甀渀椀焀甀攀渀攀猀猀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 
਀ऀऀऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 洀椀最栀琀 栀愀瘀攀 戀攀攀渀 愀甀琀漀洀愀琀椀挀愀氀氀礀 琀爀甀渀挀愀琀攀搀 
			 IF (LEN(@documentid) >= 50)਀ऀऀऀऀ䈀䔀䜀䤀一 
				  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀漀漀䰀漀渀最㔀　✀Ⰰ  
					   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					 SET @toolong50message = LEFT(@documentid, 8) + '...' + ' | ' + @tempmessage;਀ऀऀऀऀ  䔀䰀匀䔀  
					   SET @toolong50message = 'A database level message error occurred on TooLong50.';਀ऀऀऀऀऀ ⴀⴀ 䐀漀渀✀琀 昀愀椀氀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀⸀  吀栀攀 猀琀爀椀渀最 椀猀 樀甀猀琀 琀爀甀渀挀愀琀攀搀⸀  
				 END -- End checking the length of the document ID਀ऀऀ  䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 攀氀猀攀 昀漀爀 渀漀 搀漀挀甀洀攀渀琀 椀猀 猀甀瀀瀀氀椀攀搀 
਀ 
		  -- Check if the document ID contains any non-printable characters਀ऀऀ  匀䔀吀 䀀栀愀猀开渀漀渀开瀀爀椀渀琀愀戀氀攀开挀栀愀爀 㴀 倀䄀吀䤀一䐀䔀堀⠀一✀─嬀✀ ⬀ 一䌀䠀䄀刀⠀　⤀ ⬀ ✀ⴀ✀ ⬀ 一䌀䠀䄀刀⠀㌀㄀⤀ ⬀ 一✀崀─✀Ⰰ 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
		  IF @has_non_printable_char > 0਀ऀऀऀऀ  䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀瘀愀氀椀搀䐀漀挀䤀搀✀Ⰰ  
						 @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					   SET @invaliddocid = @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @invaliddocid = 'A database level message error occurred on InvalidDocId.';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀 愀渀礀 渀漀渀ⴀ瀀爀椀渀琀愀戀氀攀 挀栀愀爀愀挀琀攀爀猀 椀渀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 
਀ 
਀ऀऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀 
			 IF @transactiongroup = 0 ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 一唀䰀䰀㬀  ⴀⴀ 一甀氀氀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 愀氀氀漀眀攀搀 
			 IF @transactiongroup IS NOT NULL਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   IF NOT EXISTS (SELECT transaction_group_id ਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀  
								   WHERE transaction_group_id = @transactiongroup) ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
 						  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
							   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀 ऀऀऀऀऀऀऀ  
                             SET @tg_invalidmessage = CONCAT(CONVERT(nvarchar(20), @transactiongroup), '   ',  @tempmessage);਀ऀऀऀऀऀऀ  䔀䰀匀䔀  
							   SET @tg_invalidmessage = 'A database level message error occurred on TGNotExist.';਀ऀऀऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						  SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀一䐀 
				 END   -- End checking transaction group reference਀ 
		  IF @idlockstatus <> 'Locked'਀ऀऀऀ 匀䔀吀 䀀椀搀氀漀挀欀猀琀愀琀甀猀 㴀 ✀唀渀氀漀挀欀攀搀✀㬀 
਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO base.document_id_list (doc_id, transaction_group_id, lock_status, created_by_sid_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀Ⰰ 䀀椀搀氀漀挀欀猀琀愀琀甀猀Ⰰ 䀀猀椀搀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @transactionmessage = @tempmessage + '  Document ID: ' + @documentid + ' created.';਀ऀ          䔀䰀匀䔀  
			        SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		   CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END -- End executing the insert query਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@nodatamessage <> '')              SET @message = @message + ' | ' + @nodatamessage;਀    䤀䘀 ⠀䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀㬀 
    IF (@tg_invalidmessage <> '')          SET @message = @message + ' | ' + @tg_invalidmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@invaliddocid <> '')               SET @message = @message + ' | ' + @invaliddocid;਀ऀ 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀ 
     SET @newdocumentid = @documentid;਀  䔀䰀匀䔀 匀䔀吀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_duty_function]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 琀漀 挀爀攀愀琀攀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 
-- Input is mnemonic, name and description ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 渀攀眀 爀攀挀漀爀搀 椀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 琀漀 挀爀攀愀琀攀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
* - @function_name nvarchar(50): Must be a non-null and non-empty valid identifier which is unique.਀⨀ ⴀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
* - @newrecordid bigint: Record id of the new record਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀搀搀猀 愀 渀攀眀 爀攀挀漀爀搀 琀漀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @function_name must be unique਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀甀琀礀开昀甀渀挀琀椀漀渀崀  
਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ              
	 @function_name nvarchar(50),਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 ✀✀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
	  IF EXISTS (SELECT df.name਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
				  WHERE df.name = @function_name)਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@function_name, 10), '...  ',  @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique.');਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @function_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
				  SET @message = CONCAT_WS(' |', @message, @validationmessage); ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO people.duty_functions਀ऀऀ             ⠀洀渀攀洀Ⰰ                            渀愀洀攀Ⰰ            搀攀猀挀爀椀瀀琀椀漀渀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @function_name,   ISNULL(@description, '')); ਀ऀ       匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into people.duty_function_sid_links਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀甀渀挀琀椀漀渀 椀猀Ⰰ 愀 猀椀搀 爀攀挀漀爀搀 椀搀 愀渀搀 渀漀琀攀猀  
-- Output is a status message, and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a record into people.duty_function_sid_links਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @functionid:  Must be a valid id from the duty_functions table. Not permitted to be empty or NULL਀⨀ ⴀ 䀀猀椀搀爀攀挀漀爀搀椀搀㨀 䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀⸀ 一漀琀 瀀攀爀洀椀琀琀攀搀 琀漀 戀攀 攀洀瀀琀礀 漀爀 一唀䰀䰀 
* - @inputnotes: Optional਀⨀ ⴀ 吀栀攀 瀀愀椀爀 䀀昀甀渀挀琀椀漀渀椀搀 愀渀搀 䀀猀椀搀爀攀挀漀爀搀椀搀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Adds a new record to people.duty_function_sid_links ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀崀  
਀     䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @sidrecordid bigint              = NULL,             -- A valid id from the sid_list table, not an actual SID਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 
		  IF @functionid = 0਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions AS df਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctionIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀昀甀渀挀琀椀漀渀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀ऀ ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀猀椀搀爀攀挀漀爀搀椀搀 
	   -- Check that the sid is valid਀ऀऀ 䤀䘀 䀀猀椀搀爀攀挀漀爀搀椀搀 㴀 　 
		    SET @sidrecordid = NULL;਀ऀऀ 䤀䘀 䀀猀椀搀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀  
		    BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NoUserSidID', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀✀⤀㬀ऀ 
			END਀ऀऀ䔀䰀匀䔀 ⴀⴀ 䀀猀椀搀爀攀挀漀爀搀椀搀 椀猀 渀漀琀 一唀䰀䰀 
		  BEGIN਀ऀऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀  
				  				FROM user_restr.sid_list ਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
				   END਀ऀऀ   䔀一䐀 
਀     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀渀✀琀 愀氀爀攀愀搀礀 攀砀椀猀琀 
	 IF @data_validation_status = 'Pass'਀ऀ    䄀一䐀 䔀堀䤀匀吀匀  
				(SELECT dfsl.function_id਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
				  WHERE dfsl.function_id = @functionid਀ऀऀऀऀऀऀ䄀一䐀 搀昀猀氀⸀猀椀搀开椀搀  㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀ 
			BEGIN -- Record already exists਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						@message_id = 'RecordExists',਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO people.duty_function_sid_links਀ऀऀ             ⠀昀甀渀挀琀椀漀渀开椀搀Ⰰ  猀椀搀开椀搀Ⰰ              渀漀琀攀猀Ⰰ  最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@functionid, @sidrecordid, ISNULL(@inputnotes, ''), @username); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开最瀀开攀搀开瀀攀爀洀开昀甀渀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into user_restr.file_group_edit_perm_funct_lst to authorise function list members਀ⴀⴀ 琀漀 攀搀椀琀 昀椀氀攀猀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀⸀  
-- Input is a file group ID, a function list ID and ਀ⴀⴀ 愀渀搀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a record to authorise the users who are members of a function list to edit files within a file group਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @inputnotes nvarchar(max) Optional਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 漀爀 椀渀瘀愀氀椀搀 昀椀氀攀 最爀漀甀瀀 䤀䐀 漀爀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀搀搀猀 愀 渀攀眀 爀攀挀漀爀搀 琀漀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @filegroupid and @functionlistid must be provided and be valid਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开最瀀开攀搀开瀀攀爀洀开昀甀渀挀琀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀    Ⰰ               ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @functionlistid bigint  ,              -- User duty function list id਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 攀渀琀爀礀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL;਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀搀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 昀椀氀攀 最爀漀甀瀀 䤀䐀 攀砀椀猀琀猀 
		   BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				             FROM xref.file_group_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'FileGroupIdNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
਀ऀऀऀऀ䔀一䐀 
            END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @functionlistid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @functionlistid IS NULL  ਀ऀ     䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID');਀ऀऀ 䔀一䐀 
	  ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT function_list_id਀ऀऀऀऀ                  䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 
								 WHERE function_list_id = @functionlistid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ISNULL(CONVERT(nvarchar(10), @functionlistid), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid');਀ऀऀऀऀ   䔀一䐀 
 		    END਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				   	      FROM user_restr.file_group_edit_perm_funct_lst ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀        昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀 
						       AND function_list_id = @functionlistid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists');਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO user_restr.file_group_edit_perm_funct_lst਀ऀऀ             ⠀昀椀氀攀开最爀漀甀瀀开椀搀Ⰰ 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀Ⰰ              渀漀琀攀猀Ⰰ 最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@filegroupid, @functionlistid,   ISNULL(@inputnotes, ''), @username); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_file_gp_ed_perm_people]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 琀漀 愀甀琀栀漀爀椀猀攀 瀀攀漀瀀氀攀 氀椀猀琀 洀攀洀戀攀爀猀 
-- to edit files within a file group. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀Ⰰ 愀 瀀攀漀瀀氀攀 氀椀猀琀 䤀䐀 愀渀搀  
-- and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 琀漀 愀甀琀栀漀爀椀猀攀 琀栀攀 甀猀攀爀猀 眀栀漀 愀爀攀 洀攀洀戀攀爀猀 漀昀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 昀椀氀攀猀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @peoplelistid bigint Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀ 伀瀀琀椀漀渀愀氀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid file group ID or function list ID.਀⨀ 
* **Side Effects:**਀⨀ 
* - Adds a new record to user_restr.file_group_edit_perm_ppl_lst਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 愀渀搀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_file_gp_ed_perm_people] ਀ 
     @filegroupid bigint    ,               -- File group ਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀  Ⰰ              ⴀⴀ 唀猀攀爀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	 @inputnotes nvarchar(max)        = '',    -- Notes for the entry਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL;਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀搀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 昀椀氀攀 最爀漀甀瀀 䤀䐀 攀砀椀猀琀猀 
		   BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				             FROM xref.file_group_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'FileGroupIdNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
਀ऀऀऀऀ䔀一䐀 
            END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @peoplelistid IS NULL  ਀ऀ     䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀ 䔀一䐀 
	  ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT people_list_id਀ऀऀऀऀ                  䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
								 WHERE people_list_id = @peoplelistid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ISNULL(CONVERT(nvarchar(10), @peoplelistid), 'NULL'), ' | ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist');਀ऀऀऀऀ   䔀一䐀 
 		    END਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				   	      FROM user_restr.file_group_edit_perm_ppl_lst ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀      昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀 
						       AND people_list_id = @peoplelistid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists');਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO user_restr.file_group_edit_perm_ppl_lst਀ऀऀ             ⠀昀椀氀攀开最爀漀甀瀀开椀搀Ⰰ 瀀攀漀瀀氀攀开氀椀猀琀开椀搀Ⰰ              渀漀琀攀猀Ⰰ      最爀愀渀琀攀搀开戀礀⤀ 
		      VALUES (@filegroupid, @peoplelistid,   ISNULL(@inputnotes, ''), @username); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new file group name਀ⴀⴀ 戀礀 椀渀猀攀爀琀椀渀最 愀 爀攀挀漀爀搀 椀渀琀漀 昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀⸀ 
-- Input is the paramters for a file group name:਀ⴀⴀ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀Ⰰ 搀攀猀挀爀椀瀀琀椀漀渀⸀   
-- Output is a status message, a transaction status and the id of the new record.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䌀爀攀愀琀攀猀 愀 渀攀眀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀 爀攀挀漀爀搀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 
* - @attribute_name nvarchar(50): Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀㨀 䤀䐀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing, invalid or duplicate @attr_name.਀⨀ 
* **Side Effects:**਀⨀ 
* - Adds a record in 'xref.file_group_names' table if all conditions are met.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 瘀愀氀椀搀⸀ 
* - There must not be an existing record matching @attribute_name.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50),਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 㴀 ✀✀ 
		   SET @attribute_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT attr_name ਀ऀऀ ऀऀऀ䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  
					WHERE attr_name = @attribute_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ISNULL(LEFT(@attribute_name, 10), ''), '... | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @validationmessage);਀ऀऀऀ䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  
		             (mnem,                   attr_name,              descr)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀⤀㬀 
            SET @newrecordid = SCOPE_IDENTITY();			  ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ   
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀挀开挀开漀戀开洀猀开搀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 挀漀洀洀漀渀 漀戀樀攀挀琀⸀  
-- Input is a form id, a document multi-select list id and a common object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀挀开挀开漀戀开洀猀开搀攀昀崀 
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		        SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ           䔀䰀匀䔀  
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), '  ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT( @message, ' | ', CONVERT(nvarchar(10), @commonobjectid), '  ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		               FROM forms.form_doc_com_obj_ms_defaults਀ऀऀऀऀऀ  圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					        AND common_object_id = @commonobjectid਀ऀऀऀऀऀऀऀ䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
  -- Check if the common object is valid਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                   FROM com_obj.common_object_lists਀ऀऀऀऀऀ      圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					            AND common_object_id = @commonobjectid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT(@message, ' | List: ', CONVERT(nvarchar(10), @commonobjlistid), ', Object: ', ਀ऀऀऀऀऀ                        䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀  
		             (form_id, common_object_list_id, common_object_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀Ⰰ     䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀㬀  
       COMMIT TRANSACTION਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀挀开挀开漀戀开洀猀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 挀漀洀洀漀渀 漀戀樀攀挀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀⸀  
-- Input is a form id and a document common object multi-select list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_fm_dc_c_ob_ms_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
	    SET @commonobjlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @commonobjlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A common object list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE common_object_list_id = @commonobjlistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
						   FROM forms.form_doc_com_obj_ms_lst_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND common_object_list_id = @commonobjlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_doc_com_obj_ms_lst_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀挀开挀开漀戀开爀戀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a common object radio button list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_fm_dc_c_ob_rb_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @defcommonobjid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
	    SET @commonobjlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @commonobjlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A common object list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE common_object_list_id = @commonobjlistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @defcommonobjid = 0਀ऀऀ   匀䔀吀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 㴀 一唀䰀䰀㬀 
		   IF @defcommonobjid IS NOT NULL ਀ऀऀऀ䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'DefaultInvalid', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀  
		            (form_id, common_object_list_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀Ⰰ 搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀⤀ 
			 VALUES (@formid, @commonobjlistid,   @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀Ⰰ 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_bk_id_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and base.document_id_list.booking_id. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开戀欀开椀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_id_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀  
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_bk_stat_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and base.booking_log.booking_status. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开戀欀开猀琀愀琀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_status_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀  
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_bk_usrid_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and base.booking_log.user_id਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开戀欀开甀猀爀椀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_user_id_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀 
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_bk_usrnm_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and base.booking_log.system_username਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开戀欀开甀猀爀渀洀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_usernm_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀 
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_bkg_cmts_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and base.booking_log.comments਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开戀欀最开挀洀琀猀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_comnts_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀渀琀猀开氀椀渀欀猀 
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_bkg_date_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and base.booking_log.booking_date਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开戀欀最开搀愀琀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_date_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀 
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_bkg_rel_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and base.booking_log.release_number਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开戀欀最开爀攀氀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_booking_release_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀 
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_crtd_by_id_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Creates a link between a form and the doc-created-by-id field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开挀爀琀搀开戀礀开椀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_created_by_id_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀  
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_crtd_by_nm_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Creates a link between a form and the doc-created-by-name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开搀漀挀开挀爀琀搀开戀礀开渀洀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_created_by_nm_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀  
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
		 EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_doc_funct_lst_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a general field name field. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_fm_doc_funct_lst_links] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@dateformat nchar(3)                    = 'dmy',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_function_list_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
							AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀  
		            (form_id,      general_field_name_id,          mandatory,        length,                position,      ਀ऀऀऀऀऀ          愀琀琀爀椀戀甀琀攀㄀Ⰰ               愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @genfield_nameid, @ismandatory, @fieldlength,    ISNULL(@formposition, ''), ਀ऀऀऀ           䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
        EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开昀氀开挀开漀戀开洀猀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀⸀  
-- Input is a form id and a file common object multi-select list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_fm_fl_c_ob_ms_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
	    SET @commonobjlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @commonobjlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A file common object list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE common_object_list_id = @commonobjlistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
						   FROM forms.form_file_com_obj_ms_lst_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND common_object_list_id = @commonobjlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_com_obj_ms_lst_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_fm_fl_c_ob_rb_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and a file common object radio button list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开昀氀开挀开漀戀开爀戀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @commonobjlistid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @commonobjlistid = 0 ਀ऀ    匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file common object list id has been supplied਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
							  FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @defcommonobjid = 0਀ऀऀ   匀䔀吀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 㴀 一唀䰀䰀㬀 
		   IF @defcommonobjid IS NOT NULL ਀ऀऀऀ䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀  
		            (form_id, common_object_list_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀Ⰰ 搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀⤀ 
			 VALUES (@formid, @commonobjlistid,   @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀Ⰰ 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀⤀ 
		 EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开昀氀开挀漀洀开漀戀樀开洀猀开搀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 搀攀昀愀甀氀琀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 挀漀洀洀漀渀 漀戀樀攀挀琀⸀  
-- Input is a form id, a file multi-select list id and a common object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开昀氀开挀漀洀开漀戀樀开洀猀开搀攀昀崀 
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ           䔀䰀匀䔀  
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0 ਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀  㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), '  ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
        IF @commonobjectid = 0 ਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT( @message, ' | ', CONVERT(nvarchar(10), @commonobjectid), '  ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		               FROM forms.form_file_com_obj_ms_defaults਀ऀऀऀऀऀ  圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					        AND common_object_id = @commonobjectid਀ऀऀऀऀऀऀऀ䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀猀 瘀愀氀椀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 
					      WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ            䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䰀椀猀琀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀Ⰰ 伀戀樀攀挀琀㨀 ✀Ⰰ  
					                        CONVERT(nvarchar(10), @commonobjectid), '  ', @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO forms.form_file_com_obj_ms_defaults ਀ऀऀ             ⠀昀漀爀洀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀⤀ 
		      VALUES (@formid, @commonobjlistid,     @commonobjectid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开昀氀开挀爀琀搀开戀礀开椀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 琀栀攀 昀椀氀攀ⴀ挀爀攀愀琀攀搀ⴀ戀礀ⴀ椀搀 昀椀攀氀搀⸀  
-- Input is a form id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_fm_fl_crtd_by_id_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_created_by_id_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ       氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ  䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开昀氀开挀爀琀搀开戀礀开渀洀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 琀栀攀 昀椀氀攀ⴀ挀爀攀愀琀攀搀ⴀ戀礀ⴀ渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_fm_fl_crtd_by_nm_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀 
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_created_by_nm_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ       氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ  䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀洀开昀氀开昀甀渀挀琀开氀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 渀愀洀攀 昀椀攀氀搀⸀  
-- Input is a form id and a duty function list name id field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_fm_fl_funct_lst_links] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@dateformat nchar(3)                    = 'dmy',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_function_list_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
							AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀  
		            (form_id,      general_field_name_id,          mandatory,        length,                position,      ਀ऀऀऀऀऀ          愀琀琀爀椀戀甀琀攀㄀Ⰰ               愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @genfield_nameid, @ismandatory, @fieldlength,    ISNULL(@formposition, ''), ਀ऀऀऀ           䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_doc_created_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Creates a link between a form and the document created field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_created_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀  
		            (form_id,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_doc_date_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Creates a link between a form and a document date field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开搀愀琀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docdatenameid bigint            = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 搀愀琀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied doc date field id does not exist਀ऀऀ䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @docdatenameid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc date field id has been supplied਀ऀ 䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 搀愀琀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the attribute id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
							  FROM doc_attr.doc_date_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 
							WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'RecordExists',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
							ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀  
		            (form_id, doc_date_name_id, mandatory,           length,       ਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @docdatenameid,   @ismandatory, @fieldlength, ਀ऀऀऀ         䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;਀    䤀䘀 ⠀䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_doc_free_text_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Creates a link between a form and a document free text field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docfreetextnameid bigint        = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ()਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattrnameidmessage nvarchar(200)      = '', -- Communicates that a doc free text field id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordexistsmessage nvarchar(200)      = '', -- Communicates that a matching record already exists਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 㴀 　  
	    SET @docfreetextnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docfreetextnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A doc free text field id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_free_text_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_free_text_name_id = @docfreetextnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT doc_free_text_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀  
		            (form_id, doc_free_text_name_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @docfreetextnameid,    @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开椀渀琀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 19-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀⸀  
-- Input is a form id and a document free text field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_doc_int_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattrnameidmessage nvarchar(200)      = '', -- Communicates that a doc free text field id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordexistsmessage nvarchar(200)      = '', -- Communicates that a matching record already exists਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 　  
	    SET @docintnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docintnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A doc free text field id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_int_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_int_name_id = @docintnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT doc_int_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀  
		            (form_id, doc_int_name_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @docintnameid,   @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_doc_lock_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a document lock status field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开氀漀挀欀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 　 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀 
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_doc_lock_status_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开洀猀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀⸀  
-- Input is a form id and a document multi-select list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_doc_ms_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattrnameidmessage nvarchar(200)      = '', -- Communicates that a doc multi-select list id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordexistsmessage nvarchar(200)      = '', -- Communicates that a matching record already exists਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　  
	    SET @docmslistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docmslistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrListID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A doc multi-select list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_ms_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_ms_list_id = @docmslistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrListNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT doc_ms_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀  
		            (form_id, doc_ms_list_id,           mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @docmslistid,   @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_doc_multi_sel_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a default document multi-select object. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀Ⰰ 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 漀戀樀攀挀琀 椀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_doc_multi_sel_def]਀ 
     @formid bigint                   = NULL,਀     䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @docmsattrid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ           䔀䰀匀䔀  
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @docmslistid = 0 ਀ऀऀ   匀䔀吀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @docmslistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT doc_ms_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							WHERE doc_ms_list_id  = @docmslistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀琀琀爀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @docmslistid), '  ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListIDNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @docmsattrid = 0 ਀ऀऀ   匀䔀吀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		IF @docmsattrid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT doc_ms_attr_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
							WHERE doc_ms_attr_id  = @docmsattrid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT( @message, ' | ', CONVERT(nvarchar(10), @docmsattrid), '  ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
		               FROM forms.form_doc_multi_sel_defaults਀ऀऀऀऀऀ  圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
					        AND doc_ms_attr_id = @docmsattrid਀ऀऀऀऀऀऀऀ䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀猀 瘀愀氀椀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT doc_ms_list_id਀ऀऀ                   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 
					      WHERE doc_ms_list_id = @docmslistid਀ऀऀऀऀऀ            䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䰀椀猀琀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀洀猀氀椀猀琀椀搀⤀Ⰰ ✀Ⰰ 伀戀樀攀挀琀㨀 ✀Ⰰ  
					                        CONVERT(nvarchar(10), @docmsattrid), '  ', @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO forms.form_doc_multi_sel_defaults ਀ऀऀ             ⠀昀漀爀洀开椀搀Ⰰ 搀漀挀开洀猀开氀椀猀琀开椀搀Ⰰ 搀漀挀开洀猀开愀琀琀爀开椀搀⤀ 
		      VALUES (@formid, @docmslistid,     @docmsattrid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开爀愀搀椀漀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 05-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a document radio button list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_doc_radiob_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @defaultdocrb_attrid bigint      = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @docradioblistid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc radio button list id has been supplied਀ऀ 䤀䘀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
							  FROM doc_attr.doc_radio_button_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀     ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀攀昀愀甀氀琀 爀愀搀椀漀 戀甀琀琀漀渀 䤀䐀 椀猀 瘀愀氀椀搀 
	  IF @defaultdocrb_attrid IS NOT NULL਀ऀ     䈀䔀䜀䤀一 
		 IF NOT EXISTS (SELECT drba.doc_radiob_attr_id਀ऀऀ                  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 搀爀戀愀 
						 WHERE     drba.doc_radiob_attr_id = @defaultdocrb_attrid਀ऀऀऀऀऀऀ       䄀一䐀 搀爀戀愀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀⤀ 
					 BEGIN -- Radio button does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DefaultInvalid', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
					 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
		            (form_id, doc_radiob_list_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀Ⰰ             搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀⤀ 
			 VALUES (@formid, @docradioblistid,   @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀Ⰰ 䀀搀攀昀愀甀氀琀搀漀挀爀戀开愀琀琀爀椀搀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_doc_real_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Creates a link between a form and a document free text field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开爀攀愀氀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docrealnameid bigint            = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied doc free text field id does not exist਀ऀऀ䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @docrealnameid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc free text field id has been supplied਀ऀ 䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the attribute id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
							  FROM doc_attr.doc_real_number_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
						   FROM forms.form_doc_real_number_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND doc_real_name_id = @docrealnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordexistsmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordexistsmessage = 'A database level message error occurred on RecordExists.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_doc_real_number_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @message + ' | ' + @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@noformidmessage <> '')            SET @message = @message + ' | ' + @noformidmessage;਀    䤀䘀 ⠀䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@noattrnameidmessage <> '')        SET @message = @message + ' | ' + @noattrnameidmessage;਀    䤀䘀 ⠀䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最㬀ऀ 
    IF (@recordexistsmessage <> '')        SET @message = @message + ' | ' + @recordexistsmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开搀漀挀开琀爀开最爀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 昀椀攀氀搀⸀  
-- Input is a form id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_doc_tr_grp_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_doc_transaction_grp_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀  
		            (form_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_created_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Creates a link between a form and the file created field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_created_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀  
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_date_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Creates a link between a form and a file date field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 搀愀琀攀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开搀愀琀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @filedatenameid bigint           = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀椀氀攀 搀愀琀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied file date field id does not exist਀ऀऀ䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 　  
	    SET @filedatenameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 搀愀琀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filedatenameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A file date field id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_date_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_date_name_id = @filedatenameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
						   FROM forms.form_file_date_field_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND file_date_name_id = @filedatenameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordexistsmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordexistsmessage = 'A database level message error occurred on RecordExists.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_date_field_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                   attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			         ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @message + ' | ' + @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@noformidmessage <> '')            SET @message = @message + ' | ' + @noformidmessage;਀    䤀䘀 ⠀䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@noattrnameidmessage <> '')        SET @message = @message + ' | ' + @noattrnameidmessage;਀    䤀䘀 ⠀䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最㬀ऀ 
    IF (@recordexistsmessage <> '')        SET @message = @message + ' | ' + @recordexistsmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开昀爀攀攀开琀砀琀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 16-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀⸀  
-- Input is a form id and a file free text field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_file_free_txt_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀       㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattrnameidmessage nvarchar(200)      = '', -- Communicates that a file free text field id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordexistsmessage nvarchar(200)      = '', -- Communicates that a matching record already exists਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 㴀 　  
	    SET @filefreetextnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filefreetextnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A file free text field id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_free_text_name_id = @filefreetextnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀  
		            (form_id, file_free_text_name_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @filefreetextnameid,    @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_hash_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a file hash field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开栀愀猀栀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_content_hash_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀猀  
		            (form_id,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开椀渀琀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 30-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀⸀  
-- Input is a form id and a file free text field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_file_int_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀऀ䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ऀ    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 洀漀搀椀昀礀 琀栀攀 昀漀爀洀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattrnameidmessage nvarchar(200)      = '', -- Communicates that a filefree text field id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀椀氀攀昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordexistsmessage nvarchar(200)      = '', -- Communicates that a matching record already exists਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　  
	    SET @fileintnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @fileintnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A filefree text field id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_int_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_int_name_id = @fileintnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT file_int_name_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀  
		            (form_id, file_int_name_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid, @fileintnameid,   @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_ms_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㄀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Creates a link between a form and a file multi-select list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开洀猀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @filemultiselectlistid bigint    = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied file multi-select list id does not exist਀ऀऀ䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @filemultiselectlistid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file multi-select list id has been supplied਀ऀ 䤀䘀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
							  FROM file_attr.file_multi_select_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT file_ms_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀  
		            (form_id, file_ms_list_id, mandatory,           length,       position,      attribute1,  attribute2,  attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ 䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ 䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ 䀀愀琀琀爀椀戀甀琀攀㌀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_name_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a file filename field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀 
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_name_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_plist_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a file people list name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开瀀氀椀猀琀开氀椀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_people_list_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ          洀愀渀搀愀琀漀爀礀Ⰰ        氀攀渀最琀栀Ⰰ                瀀漀猀椀琀椀漀渀Ⰰ       
					          attribute1,               attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ    䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ  
			           ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_radiob_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㄀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Creates a link between a form and a file radio button list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @file_radioblistid bigint        = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀搀攀昀愀甀氀琀昀椀氀攀开爀戀开愀琀琀爀椀搀 戀椀最椀渀琀    㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.														 ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　  
	    SET @file_radioblistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @file_radioblistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A file radio button list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE file_radiob_list_id = @file_radioblistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
 ਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
						   FROM forms.form_file_radio_button_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND file_radiob_list_id = @file_radioblistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀   
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
      -- Check the default਀ऀ  䤀䘀 䀀搀攀昀愀甀氀琀昀椀氀攀开爀戀开愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 
	  BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
			SELECT file_radiob_list_id਀ऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 
			 WHERE file_radiob_list_id = @file_radioblistid਀ऀऀऀ   䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀攀昀愀甀氀琀昀椀氀攀开爀戀开愀琀琀爀椀搀⤀ 
			 BEGIN -- Default is invalid਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						@message_id = 'DefaultInvalid',਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
							ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			 END ਀ऀ  䔀一䐀 
	  ਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
		            (form_id, file_radiob_list_id, mandatory,           length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀Ⰰ               搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀⤀ 
			 VALUES (@formid, @file_radioblistid,  @ismandatory, @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀Ⰰ 䀀搀攀昀愀甀氀琀昀椀氀攀开爀戀开愀琀琀爀椀搀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_real_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㄀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Creates a link between a form and a file free text field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开爀攀愀氀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @filerealnameid bigint           = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied file free text field id does not exist਀ऀऀ䀀爀攀挀漀爀搀攀砀椀猀琀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @filerealnameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if file free text field id has been supplied਀ऀ 䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the attribute id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
							  FROM file_attr.file_real_number_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
						   FROM forms.form_file_real_number_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								AND file_real_name_id = @filerealnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordexistsmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordexistsmessage = 'A database level message error occurred on RecordExists.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_real_number_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀Ⰰ   䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @message + ' | ' + @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@noformidmessage <> '')            SET @message = @message + ' | ' + @noformidmessage;਀    䤀䘀 ⠀䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀 
    IF (@noattrnameidmessage <> '')        SET @message = @message + ' | ' + @noattrnameidmessage;਀    䤀䘀 ⠀䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最㬀ऀ 
    IF (@recordexistsmessage <> '')        SET @message = @message + ' | ' + @recordexistsmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_retentn_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㌀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and a file retention date field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀渀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 刀攀愀搀礀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
		@data_validation_status nchar(10)       = 'Pass';   -- Defaults to Pass until it is set to Fail਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						   FROM forms.form_file_retention_date_links਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidations.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀  
		            (form_id,       length,       ਀ऀऀऀऀऀ瀀漀猀椀琀椀漀渀Ⰰ                  愀琀琀爀椀戀甀琀攀㄀Ⰰ              愀琀琀爀椀戀甀琀攀㈀Ⰰ              愀琀琀爀椀戀甀琀攀㌀⤀ 
			 VALUES (@formid,  @fieldlength, ਀ऀऀऀ        䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 猀椀稀攀 昀椀攀氀搀⸀  
-- Input is a form id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_file_size_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀 
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_size_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ       氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ  䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_form_file_tr_grp_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a file transaction group field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开昀椀氀攀开琀爀开最爀瀀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀 
						  WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_transactn_grp_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ           氀攀渀最琀栀Ⰰ        
					position,                  attribute1,              attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ  
			        ISNULL(@formposition, ''), ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀漀爀洀开椀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 昀漀爀洀 椀搀攀渀琀椀昀椀攀爀 渀愀洀攀 
-- Input is a mnemonic, form name, description, list position and form group id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 琀栀攀 渀攀眀 爀攀挀漀爀搀 椀搀⸀ 
-- If the connected user is a controller but not a configurator then the form group must be owned by the ਀ⴀⴀ 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_form_id_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @formgroupid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀      㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)               = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)            = '',਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀䘀愀椀氀✀Ⰰ 
		@tempvalidationstatus nchar(10)       = '',਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀             㴀 ✀一漀✀Ⰰ 
		@isconfigurator nvarchar(3)           = 'No',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)     = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  匀䔀吀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
  SET @username = SUSER_SNAME(@connectedusersid);਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
     BEGIN਀         匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
		 SET @isconfigurator = 'Yes';਀ऀ 䔀一䐀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' ਀      䈀䔀䜀䤀一 
		  SET @userauthentication_status = 'Pass';਀ऀऀ  匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
      END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
				   FROM forms.form_identifier_names ਀ऀऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开渀愀洀攀 㴀 䀀昀漀爀洀渀愀洀攀⤀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NameNotUnique', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀昀漀爀洀渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
	    SET @tempmessage = NULL;਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀昀漀爀洀渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @tempmessage OUTPUT;਀  ऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ 
	  -- Check if the form group exists  ਀ऀ  䤀䘀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 　  
		 SET @formgroupid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开最爀漀甀瀀开椀搀  
							  FROM forms.form_group_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The form group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FmGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀洀䜀一漀琀䔀砀椀猀琀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 END ਀ऀऀऀ 䔀䰀匀䔀  ⴀⴀ 䔀砀椀猀琀猀⸀  䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀Ⰰ 挀栀攀挀欀 椀昀 琀栀攀 昀漀爀洀 最爀漀甀瀀 椀猀 渀漀琀 漀渀攀 眀栀椀挀栀 椀猀 漀眀渀攀搀 戀礀 琀栀攀 挀漀渀渀渀攀挀琀攀搀 甀猀攀爀 
			   IF @iscontroller = 'Yes' AND @isconfigurator = 'No'਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   IF NOT EXISTS (SELECT fgn.form_group_id AS fgi਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
							INNER JOIN user_restr.form_group_owners AS fo਀ऀऀऀऀऀऀऀऀऀऀ伀一 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
										  = fo.form_group_id਀ऀऀऀऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
										ON fo.sid_id਀ऀऀऀऀऀऀऀऀऀऀ 㴀 猀氀⸀猀椀搀开椀搀 
								  WHERE  sl.sid = @connectedusersid                                         ਀ऀऀऀऀऀऀऀऀ         䄀一䐀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀⤀ 
					 BEGIN  -- The form group is not owned by the user਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀䜀爀漀甀瀀一漀琀伀眀渀攀搀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormGroupNotOwned');਀ऀऀऀऀऀ 䔀一䐀  
				 END਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 最爀漀甀瀀  
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO forms.form_identifier_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ      昀漀爀洀开渀愀洀攀Ⰰ 搀攀猀挀爀Ⰰ        氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ  昀漀爀洀开最爀漀甀瀀开椀搀⤀ 
		      VALUES (@mnemonic, @formname, @description, @listposition, @formgroupid); ਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀   
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_frm_doc_funct_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a document duty function field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀爀洀开搀漀挀开昀甀渀挀琀开氀椀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_doc_function_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ          洀愀渀搀愀琀漀爀礀Ⰰ        氀攀渀最琀栀Ⰰ                瀀漀猀椀琀椀漀渀Ⰰ       
					          attribute1,               attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ    䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ  
			           ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_frm_doc_ppl_lst_lnks]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a people list name field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀爀洀开搀漀挀开瀀瀀氀开氀猀琀开氀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_doc_people_list_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ          洀愀渀搀愀琀漀爀礀Ⰰ        氀攀渀最琀栀Ⰰ                瀀漀猀椀琀椀漀渀Ⰰ       
					          attribute1,               attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ    䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ  
			           ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_frm_doc_user_lnks]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and document to user ID field link. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀爀洀开搀漀挀开甀猀攀爀开氀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_doc_user_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ          洀愀渀搀愀琀漀爀礀Ⰰ        氀攀渀最琀栀Ⰰ                瀀漀猀椀琀椀漀渀Ⰰ       
					          attribute1,               attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ    䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ  
			           ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_frm_file_funct_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a link between a form and a file duty function field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀爀洀开昀椀氀攀开昀甀渀挀琀开氀椀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 　 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_function_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ          洀愀渀搀愀琀漀爀礀Ⰰ        氀攀渀最琀栀Ⰰ                瀀漀猀椀琀椀漀渀Ⰰ       
					          attribute1,               attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ    䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ  
			           ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 搀攀昀愀甀氀琀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 漀戀樀攀挀琀⸀  
-- Input is a form id, a file multi-select list id and a multi-select object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀崀 
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @filemslistid bigint             = NULL,਀ऀ 䀀昀椀氀攀洀猀愀琀琀爀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		           ELSE ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		 -- Check the multi-select list reference਀ऀऀ䤀䘀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 　  
		   SET @filemslistid = NULL;਀ऀऀ䤀䘀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀  
		 		 			 FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀  㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'AttrListIDNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the multi-select attribute id reference਀ऀ    䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 　 
		   SET @filemsattrid = NULL;਀ऀऀ䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀  
		 		 			 FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀  㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'AttrIDNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT file_ms_list_id਀ऀऀ               䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀 
					  WHERE file_ms_list_id = @filemslistid਀ऀऀऀऀऀ        䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 
							AND form_id = @formid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
  -- Check if the multi-select attribute is valid਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
		                   FROM file_attr.file_multi_select_attributes਀ऀऀऀऀऀ      圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
					            AND file_ms_attr_id = @filemsattrid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT(@message, ' | List: ', CONVERT(nvarchar(10), @filemslistid), ', Object: ', ਀ऀऀऀऀऀ                        䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀  
		             (form_id, file_ms_list_id, file_ms_attr_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀昀椀氀攀洀猀氀椀猀琀椀搀Ⰰ     䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_frm_file_user_lnks]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Creates a link between a form and a file to user ID field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀爀洀开昀椀氀攀开甀猀攀爀开氀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF EXISTS (SELECT form_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'RecordExists',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀猀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    INSERT INTO forms.form_file_user_links ਀ऀऀ            ⠀昀漀爀洀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ          洀愀渀搀愀琀漀爀礀Ⰰ        氀攀渀最琀栀Ⰰ                瀀漀猀椀琀椀漀渀Ⰰ       
					          attribute1,               attribute2,              attribute3)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀漀爀洀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀Ⰰ 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ    䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ  
			           ISNULL(@attribute1, ''), ISNULL(@attribute2, ''), ISNULL(@attribute3, ''))਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_function_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 琀漀 挀爀攀愀琀攀 愀 攀氀攀洀攀渀琀 椀渀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 
-- Input is a function list id, a function id, list position and filter group id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 琀漀 挀爀攀愀琀攀 愀 攀氀攀洀攀渀琀 椀渀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 昀爀漀洀 琀栀攀 昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀⸀ 
* - @functionid bigint: Must be a valid id from the duty_functions table਀⨀ ⴀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 猀洀愀氀氀椀渀琀㨀 伀瀀琀椀漀渀愀氀 
* - @filtergroupid bigint:  Optional.  Must be a valid id from the forms.filter_groups table਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀搀搀猀 愀 渀攀眀 爀攀挀漀爀搀 琀漀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_function_list] ਀ 
         ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @functionid bigint               = NULL, ਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 　Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　  
	     SET @functionlistid = NULL;਀      䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 昀甀渀挀琀椀漀渀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                 FROM people.function_list_names AS fln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 
		  IF @functionid = 0਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions AS df਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctionIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT fl.function_list_id਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
		  WHERE fl.function_list_id = @functionlistid਀ऀऀ        䄀一䐀 昀氀⸀昀甀渀挀琀椀漀渀开椀搀  㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 
		             (function_list_id,  function_id,         list_position)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀Ⰰ  䀀昀甀渀挀琀椀漀渀椀搀Ⰰ  䤀匀一唀䰀䰀⠀䀀氀椀猀琀瀀漀猀椀琀椀漀渀Ⰰ 　⤀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into people.function_list_names to create a duty function list name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a record into people.function_list_names to create a duty function list name਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @mnemonic nvarchar(10): Can be null.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 眀栀椀挀栀 椀猀 甀渀椀焀甀攀⸀ 
* - @description nvarchar(max): Can be null.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ ⴀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀㨀 刀攀挀漀爀搀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Adds a new record to people.function_list_names ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_function_list_name] ਀ 
     @mnemonic nvarchar(10)           = '',             ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 @description nvarchar(max)       = '', ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀渀愀洀攀 
				   FROM people.function_list_names AS fln਀ऀऀऀऀ  圀䠀䔀刀䔀 昀氀渀⸀渀愀洀攀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀⤀ 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀⸀✀⤀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀⤀㬀  
				  SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 
		             (mnem,                                name,            description)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀Ⰰ   䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀⤀㬀  
	  SET @newrecordid = SCOPE_IDENTITY();਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开瀀攀漀瀀氀攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into people.people_lists to create an element in a people list਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀Ⰰ 愀 瀀攀爀猀漀渀 椀搀Ⰰ 氀椀猀琀 瀀漀猀椀琀椀漀渀 愀渀搀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀⸀   
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a record into people.people_lists to create an element in a people list਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @peoplelistid bigint: Must be a non-null and non-empty valid identifier from the people_list_names table.਀⨀ ⴀ 䀀猀椀搀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 匀䤀䐀 氀椀猀琀 琀愀戀氀攀 
* - @listposition smallint: Optional਀⨀ ⴀ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀㨀  伀瀀琀椀漀渀愀氀⸀  䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 琀愀戀氀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Adds a new record to people.people_lists ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开瀀攀漀瀀氀攀开氀椀猀琀崀  
਀          
	 @peoplelistid bigint             = NULL,਀ऀ 䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ  
	 @listposition int                = 0,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 伀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
      IF @peoplelistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID.');਀ऀऀऀ 䔀一䐀 
	  ELSE -- People list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT i.people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 椀 
							WHERE i.people_list_id = @peoplelistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	 -- Check the person id਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 㴀 　 
			 SET @sidid = NULL; ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @sidid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀匀椀搀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSidId.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT sl.sid_id਀ऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
							WHERE sl.sid_id = @sidid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀匀椀搀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SidIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ 
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT pl.people_list_id਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
		  WHERE pl.people_list_id = @peoplelistid਀ऀऀ        䄀一䐀 瀀氀⸀猀椀搀开椀搀  㴀 䀀猀椀搀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 
		             (people_list_id,  sid_id,         list_position,    granted_by)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀瀀攀漀瀀氀攀氀椀猀琀椀搀Ⰰ  䀀猀椀搀椀搀Ⰰ  䤀匀一唀䰀䰀⠀䀀氀椀猀琀瀀漀猀椀琀椀漀渀Ⰰ 　⤀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into people.people_list_names to create a people list name਀ⴀⴀ 䤀渀瀀甀琀 椀猀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Inserts a record into people.people_list_names to create a people list name਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @mnemonic nvarchar(10): Can be null.਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 眀栀椀挀栀 椀猀 甀渀椀焀甀攀⸀ 
* - @description nvarchar(max): Can be null.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ ⴀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀㨀 刀攀挀漀爀搀 椀搀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Adds a new record to people.people_list_names ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_people_list_name] ਀ 
     @mnemonic nvarchar(10)           = '',             ਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 @description nvarchar(max)       = '', ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Attribute name must be unique਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀氀渀⸀渀愀洀攀 
				   FROM people.people_list_names AS pln਀ऀऀऀऀ  圀䠀䔀刀䔀 瀀氀渀⸀渀愀洀攀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀⤀ 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀⸀✀⤀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀⤀㬀  
				  SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
		             (mnem,                              name,           description)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀Ⰰ   䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀⤀㬀  
	  SET @newrecordid = SCOPE_IDENTITY();਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_tag_br_tr_perm_flist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 琀愀最 最爀漀甀瀀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 最爀愀渀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 洀攀洀戀攀爀猀 漀昀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_tag_br_tr_perm_flist] ਀ 
਀     䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @functionlistid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䈀爀吀爀攀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagBrTreeID.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagBrTreeIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	  IF @functionlistid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @functionlistid  IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
      ELSE਀ऀऀऀ ⴀⴀ 昀甀渀挀琀椀漀渀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                 FROM people.function_list_names AS fln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF EXISTS (SELECT tag_browsing_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE    tag_browsing_tree_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀 
					  AND    function_list_id਀ऀऀऀऀऀ      㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO user_restr.tag_br_tree_permissions_flist ਀ऀऀ             ⠀ 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀⤀ 
		      VALUES (@tag_br_treeid,          @functionlistid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_tag_br_tr_perm_plist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 琀愀最 最爀漀甀瀀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 最爀愀渀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 洀攀洀戀攀爀猀 漀昀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 攀搀椀琀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_tag_br_tr_perm_plist] ਀ 
਀     䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @peoplelistid bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䈀爀吀爀攀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagBrTreeID.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagBrTreeIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @peoplelistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS i਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF EXISTS (SELECT tag_browsing_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE    tag_browsing_tree_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀 
					  AND    people_list_id਀ऀऀऀऀऀ      㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO user_restr.tag_br_tree_permissions_plist ਀ऀऀ             ⠀ 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀Ⰰ  瀀攀漀瀀氀攀开氀椀猀琀开椀搀⤀ 
		      VALUES (@tag_br_treeid,          @peoplelistid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_tag_browsing_tree_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 琀愀最 琀爀攀攀 渀愀洀攀⸀ 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_tag_browsing_tree_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 㴀 ✀✀ 
		   SET @browsing_tree_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
					WHERE name = @browsing_tree_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', ISNULL(LEFT(@browsing_tree_name, 10), ''), '... | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @browsing_tree_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @validationmessage);਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO tagging.tag_browsing_tree_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ                                 渀愀洀攀Ⰰ         搀攀猀挀爀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @browsing_tree_name, ISNULL(@description, ''),  @listposition); ਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开最爀漀甀瀀开椀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 22-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new tag group identifier name.਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开最爀漀甀瀀开椀搀开渀愀洀攀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @tag_group_name nvarchar(50),਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @tag_group_name = ''਀ऀऀ   匀䔀吀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开渀愀洀攀  
		 			 FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 琀愀最开最爀漀甀瀀开渀愀洀攀 㴀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀琀愀最开最爀漀甀瀀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
		             (mnem,                   tag_group_name,              descr,    list_position)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 䀀琀愀最开最爀漀甀瀀开渀愀洀攀Ⰰ 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀Ⰰ  䀀氀椀猀琀瀀漀猀椀琀椀漀渀⤀㬀  
	      SET @newrecordid = SCOPE_IDENTITY();਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开最爀漀甀瀀开瀀攀爀洀开昀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new tag group permissions record to grant permission for members of a function list to link tags with a tag group਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开最爀漀甀瀀开瀀攀爀洀开昀氀椀猀琀崀  
਀ 
     @tag_groupid bigint              = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀  　 
			 SET @tag_groupid = NULL;਀  
		  -- Check if a tag group id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag group id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagGroupID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @tag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀ऀऀ䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀      䔀䰀匀䔀 
			 -- function list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @functionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
		             FROM user_restr.tag_group_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
					      = @tag_groupid਀ऀऀऀऀऀ  䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @functionlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀  
		             ( tag_group_id,   function_list_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀琀愀最开最爀漀甀瀀椀搀Ⰰ   䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开最爀漀甀瀀开瀀攀爀洀开瀀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new tag group permissions record to grant permission for members of a people list to link tags with a tag group਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开最爀漀甀瀀开瀀攀爀洀开瀀氀椀猀琀崀  
਀ 
     @tag_groupid bigint              = NULL,਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 SET @tag_groupid = NULL;਀  
		  -- Check if a tag group id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag group id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagGroupID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @tag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @peoplelistid IS NULL  ਀ऀ     䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
		 ELSE਀ऀ        䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT people_list_id਀ऀऀऀऀ                  䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
								 WHERE people_list_id =@peoplelistid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', 'People List ID: ', ISNULL(CONVERT(nvarchar(10), @peoplelistid), 'NULL'), ' ', @tempmessage); ਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
਀ऀऀ䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF EXISTS (SELECT tag_group_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE    tag_group_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开最爀漀甀瀀椀搀 
					  AND    people_list_id਀ऀऀऀऀऀ      㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO user_restr.tag_group_permissions_plist ਀ऀऀ             ⠀ 琀愀最开最爀漀甀瀀开椀搀Ⰰ   瀀攀漀瀀氀攀开氀椀猀琀开椀搀⤀ 
		      VALUES (@tag_groupid,   @peoplelistid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_tag_tree_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 琀愀最 琀爀攀攀 渀愀洀攀⸀ 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_tag_tree_name] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀琀愀最开琀爀攀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀琀愀最开琀爀攀攀开渀愀洀攀 㴀 ✀✀ 
		   SET @tag_tree_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
					WHERE name = @tag_tree_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', ISNULL(LEFT(@tag_tree_name, 10), ''), '... | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @tag_tree_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @validationmessage);਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO tagging.tag_tree_names ਀ऀऀ             ⠀洀渀攀洀Ⰰ                   渀愀洀攀Ⰰ                  搀攀猀挀爀Ⰰ         氀椀猀琀开瀀漀猀椀琀椀漀渀⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @tag_tree_name, ISNULL(@description, ''),  @listposition); ਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开琀爀攀攀开瀀攀爀洀开昀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new tag group permissions record to grant permission for members of a function list to edit a tag tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开琀爀攀攀开瀀攀爀洀开昀氀椀猀琀崀  
਀ 
     @tag_treeid bigint               = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag tree id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagTree', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
								       = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀ऀऀ䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀      䔀䰀匀䔀 
			 -- function list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @functionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_tree_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
					      = @tag_treeid਀ऀऀऀऀऀ  䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @functionlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀  
		             ( tag_tree_id,  function_list_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀琀愀最开琀爀攀攀椀搀Ⰰ   䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开琀爀攀攀开瀀攀爀洀开瀀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new tag group permissions record to grant permission for members of a people list to edit a tag relationship tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开琀爀攀攀开瀀攀爀洀开瀀氀椀猀琀崀  
਀ 
     @tag_treeid bigint               = NULL,਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag tree id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagTree', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
								       = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the people list id਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀ऀऀ䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
 -- People list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT i.people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 椀 
							WHERE i.people_list_id = @peoplelistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_tree_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
					      = @tag_treeid਀ऀऀऀऀऀ  䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = @peoplelistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀  
		             ( tag_tree_id,  people_list_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀琀愀最开琀爀攀攀椀搀Ⰰ   䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new transaction group.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀爀愀渀猀愀挀琀椀漀渀 渀漀琀攀 
-- Output is a message, transaction status and the new record id਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀  
਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开渀漀琀攀 渀瘀愀爀挀栀愀爀⠀䴀䄀堀⤀      㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)              = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newgroupid bigint                   = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)         = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                  㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)     = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀               㴀 ✀✀Ⰰ 
	    @transactionmessage  nvarchar(200)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀爀攀 眀愀猀 愀渀 椀猀猀甀攀 眀椀琀栀 琀栀攀 猀挀漀瀀攀 椀搀攀渀琀椀琀礀 挀栀攀挀欀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 愀瀀瀀氀椀挀愀戀氀攀⸀ 
 ਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as a controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		 -- Insert the new record.਀ऀऀऀ䈀䔀䜀䤀一 
			  BEGIN TRY਀ऀऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀 ⠀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀⤀ 
					  VALUES (@transaction_note); ਀ऀऀऀ  匀䔀吀 䀀渀攀眀最爀漀甀瀀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					SET @transactionmessage = @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   			  END TRY਀ऀऀऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
				 SET @transaction_status = 'Bad';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'InsertError', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
					CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀऀऀ 䔀䰀匀䔀  
					  SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀऀऀ  䔀一䐀 䌀䄀吀䌀䠀 
			END਀ 
    END -- End if user authentication = Pass਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_INS_wf_step_duty_funct]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 琀漀 挀爀攀愀琀攀 愀 渀攀眀 眀漀爀欀昀氀漀眀 猀琀攀瀀 琀漀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀渀欀⸀   
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀昀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀崀  
਀          
	 @instance_step_id bigint         = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  
	 @outputid bigint                 = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
		 SET @instance_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @instance_step_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀ 䔀一䐀 
	  ELSE -- An instance step id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_instance_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
							 WHERE workflow_instance_step_id = @instance_step_id ) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	 -- Check the function id਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 　 
			 SET @functionid = NULL; ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 昀甀渀挀琀椀漀渀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @functionid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A person id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 瀀攀爀猀漀渀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT df.function_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
							WHERE df.function_id = @functionid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctionIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ 
-- Validate @outputid਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 漀甀琀瀀甀琀 椀搀 攀砀椀猀琀猀   
	  IF @outputid = 0 ਀ऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀椀搀 㴀 一唀䰀䰀㬀  
		IF @outputid IS NOT NULL  -- NULL output ID is permitted਀     ⴀⴀ 圀漀爀欀昀氀漀眀 漀甀琀瀀甀琀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 漀甀琀瀀甀琀开椀搀  
							  FROM workflow_instances.workflow_output_definitions ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 漀甀琀瀀甀琀开椀搀 㴀 䀀漀甀琀瀀甀琀椀搀⤀  
				 BEGIN  -- The output does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfOutputIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀伀甀琀瀀甀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
		 ਀ 
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT wdsf.workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 眀搀猀昀 
		  WHERE wdsf.workflow_instance_step_id ਀ऀऀ        㴀            䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND wdsf.function_id ਀ऀऀऀऀ㴀   䀀昀甀渀挀琀椀漀渀椀搀 
		    AND wdsf.output_id਀ऀऀऀ    㴀   䀀漀甀琀瀀甀琀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 
		             (workflow_instance_step_id,  function_id,  output_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀        䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 䀀昀甀渀挀琀椀漀渀椀搀Ⰰ  䀀漀甀琀瀀甀琀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀  
਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into workflow_instances.workflow_instance_definitions to create a new workflow instance.  ਀ⴀⴀ 䄀氀猀漀 挀氀漀渀攀猀 琀栀攀 洀漀搀攀氀 猀琀攀瀀猀 椀渀琀漀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀猀⸀  
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀崀  
਀          
	 @documentid nvarchar(50)         = '',਀ऀ 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ  
	 @present_step_id bigint          = NULL,਀ऀ 䀀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
		ELSE -- Doc id was supplied਀ऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 搀漀挀甀洀攀渀琀 
			EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
				@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀 Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 搀漀挀 椀搀 攀砀椀猀琀猀 
਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 　 
		 SET @workflow_model_id = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @workflow_model_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀漀爀欀昀氀䴀漀搀攀氀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWorkflModelID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
							 WHERE workflow_model_id = @workflow_model_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀漀爀欀昀氀䴀漀搀攀氀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WorkflModelInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
-- Validate @present_step_id਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀 攀砀椀猀琀猀   
	  IF @present_step_id = 0 ਀ऀऀ 匀䔀吀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 ⴀⴀ 一唀䰀䰀 瀀爀攀猀攀渀琀 猀琀攀瀀 䤀䐀 椀猀 瀀攀爀洀椀琀琀攀搀 
		IF @present_step_id IS NOT NULL਀     ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
							  FROM workflow_models.workflow_step_definitions ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 
							   AND workflow_model_id = @workflow_model_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 猀琀攀瀀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WorkflowStepInvalid.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
		             (doc_id,        workflow_model_id,   present_step_id, notes)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀Ⰰ  䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀Ⰰ 䀀渀漀琀攀猀⤀㬀  
	     SET @newrecordid = SCOPE_IDENTITY();਀ 
		 -- Clone the workflow model tree into the instance tree.਀ऀऀ䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 ⠀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀Ⰰ 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀⤀ 
		     SELECT @newrecordid, workflow_model_step_id ਀ऀऀ       䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
		      WHERE    workflow_model_id ਀ऀऀऀ        㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀㬀 
         COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into workflow_instances.workflow_instance_steps to create a new workflow instance step.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 渀攀眀 爀攀挀漀爀搀 椀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_workflow_instance_step] ਀ 
         ਀ऀ 䀀椀渀猀琀愀渀挀攀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @model_step_id bigint            = NULL, ਀ऀ 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @date1 datetime2(7)              = NULL,਀ऀ 䀀搀愀琀攀㈀ 搀愀琀攀琀椀洀攀㈀⠀㜀⤀              㴀 一唀䰀䰀Ⰰ 
	 @date3 datetime2(7)              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@docauthenticationstatus nchar(10)   = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀椀搀 㴀 　 
		 SET @instanceid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @instanceid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀䘀䤀渀猀琀愀渀挀攀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWFInstanceID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_instance_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE workflow_instance_id = @instanceid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀䤀渀猀琀愀渀挀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFInstanceIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
			ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀऀ 䈀䔀䜀䤀一 
			   EXEC [internal].[usp_AUTHENTICATE_wf_instance]਀ऀऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀椀搀Ⰰ 
				  @wf_instance_auth_result = @object_auth_result OUTPUT;਀ऀऀऀ   䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN਀ऀऀ ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'WFInstanceNotAuth', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀⸀✀⤀㬀 
				 END਀ऀऀऀ 䔀一䐀 
		 END਀ 
	  IF @model_step_id = 0਀ऀऀ 匀䔀吀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if a model step id was supplied.਀ऀ  䤀䘀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWorkflowStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀漀爀欀昀氀漀眀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 洀漀搀攀氀 猀琀攀瀀 椀搀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that a model step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
							  FROM workflow_models.workflow_step_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WorkflowStepInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
-- Validate @step_status_id਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 猀琀攀瀀 猀琀愀琀甀猀 攀砀椀猀琀猀   
	  IF @step_status_id = 0 ਀ऀऀ 匀䔀吀 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀 㴀 一唀䰀䰀㬀  
		IF @step_status_id IS NOT NULL  -- NULL step status ID is permitted਀     ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 猀琀愀琀甀猀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀琀攀瀀开猀琀愀琀甀猀开椀搀  
							  FROM workflow_instances.step_status_definitions ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 猀琀攀瀀开猀琀愀琀甀猀开椀搀 㴀 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀⤀  
				 BEGIN  -- The step status does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'StepStatusIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀琀攀瀀匀琀愀琀甀猀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
		 ਀ 
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT wis.workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
		  WHERE wis.workflow_instance_id ਀ऀऀ        㴀           䀀椀渀猀琀愀渀挀攀椀搀 
		    AND wis.workflow_model_step_id ਀ऀऀऀऀ㴀           䀀洀漀搀攀氀开猀琀攀瀀开椀搀 
		    AND wis.step_status_id਀ऀऀऀ    㴀  䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
	਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO workflow_instances.workflow_instance_steps਀ऀऀ             ⠀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀Ⰰ 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀Ⰰ   猀琀攀瀀开猀琀愀琀甀猀开椀搀⤀ 
		      VALUES (        @instanceid,          @model_step_id,  @step_status_id); ਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀  
਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀漀爀欀昀氀漀眀开瀀愀爀琀椀挀椀瀀愀渀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into workflow_instances.workflow_step_participants to create a new workflow step to participant link.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_INS_workflow_participant] ਀ 
         ਀ऀ 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @sidid bigint                    = NULL, ਀ऀ 䀀漀甀琀瀀甀琀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
		 SET @instance_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @instance_step_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀ 䔀一䐀 
	  ELSE -- An instance step id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_instance_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
							 WHERE workflow_instance_step_id = @instance_step_id ) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀऀऀ 䔀一䐀 
			 ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀऀऀ䈀䔀䜀䤀一 
				EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
					@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀऀऀ 䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
					BEGIN਀ऀऀ ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
		END਀ 
	 -- Check the sid id਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 㴀 　 
			 SET @sidid = NULL; ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 猀椀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @sidid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀匀椀搀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSidId.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A sid id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 猀椀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT sl.sid_id਀ऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
							WHERE sl.sid_id = @sidid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀匀椀搀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SidIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ 
-- Validate @outputid਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 漀甀琀瀀甀琀 椀搀 攀砀椀猀琀猀   
	  IF @outputid = 0 ਀ऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀椀搀 㴀 一唀䰀䰀㬀  
		IF @outputid IS NOT NULL  -- NULL output ID is permitted਀     ⴀⴀ 圀漀爀欀昀氀漀眀 漀甀琀瀀甀琀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 漀甀琀瀀甀琀开椀搀  
							  FROM workflow_instances.workflow_output_definitions ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 漀甀琀瀀甀琀开椀搀 㴀 䀀漀甀琀瀀甀琀椀搀⤀  
				 BEGIN  -- The output does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfOutputIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀伀甀琀瀀甀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
		 ਀ 
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT wisp.workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 䄀匀 眀椀猀瀀 
		  WHERE wisp.workflow_instance_step_id ਀ऀऀ        㴀            䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND wisp.sid_id ਀ऀऀऀऀ㴀   䀀猀椀搀椀搀 
		    AND wisp.output_id਀ऀऀऀ    㴀   䀀漀甀琀瀀甀琀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 
		             (workflow_instance_step_id,  sid_id,  output_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀        䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 䀀猀椀搀椀搀Ⰰ  䀀漀甀琀瀀甀琀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀  
਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all people list names from people.people_list_names.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ一漀渀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of people list name details.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - None਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),  ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)      = 'Fail',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀ 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀          䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ  
				 ISNULL(pln.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ 瀀氀渀⸀渀愀洀攀                    䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 ISNULL(pln.description, '') AS 'Description',਀ऀऀऀऀ 瀀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		    FROM people.people_list_names AS pln  ਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开瀀攀漀瀀氀攀开氀椀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all records from people.people_lists.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀 搀攀琀愀椀氀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ一漀渀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of people list records.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - None਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开瀀攀漀瀀氀攀开氀椀猀琀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),  ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)      = 'Fail',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 pln.people_list_id          AS 'People List ID',਀ऀऀऀऀ 瀀氀渀⸀洀渀攀洀                    䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 pln.name                    AS 'People List Name',਀ऀऀऀऀ 瀀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀             䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 pl.sid_id                   AS 'User ID', ਀ऀऀऀऀ 猀氀⸀渀愀洀攀                     䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
		         ISNULL(sl.username, '')     AS 'System Username',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀瀀氀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ 　⤀ 䄀匀 ✀倀攀爀猀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
		         CONVERT(NVARCHAR(30), pl.created, 120) AS 'Created',਀ऀऀऀऀ 瀀氀⸀最爀愀渀琀攀搀开戀礀               䄀匀 ✀䌀爀攀愀琀攀搀 䈀礀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ 
            FROM people.people_lists AS pl਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
	          ON     pl.people_list_id਀ऀऀऀ      㴀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
	   LEFT JOIN user_restr.sid_list AS sl਀ऀ          伀一   瀀氀⸀猀椀搀开椀搀 
			     = sl.sid_id਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀ 䄀匀䌀Ⰰ ✀倀攀爀猀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 䄀匀䌀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_all_recent_sids]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 挀爀攀愀琀攀搀 愀昀琀攀爀 愀 最椀瘀攀渀 琀椀洀攀 
-- Output is a status message and a transaction status਀ⴀⴀ 瀀氀甀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 猀椀搀 氀椀猀琀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开爀攀挀攀渀琀开猀椀搀猀崀  
਀ऀ 䀀洀椀渀甀琀攀猀 椀渀琀                      㴀 一唀䰀䰀Ⰰ   ⴀⴀ 伀瀀琀椀漀渀愀氀 椀渀瀀甀琀 瀀愀爀愀洀攀琀攀爀⸀  一甀洀戀攀爀 漀昀 洀椀渀甀琀攀猀 戀攀昀漀爀攀 瀀爀攀猀攀渀琀 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                   = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)     = '',     -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)      = 'Fail', ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transactionmessage2 nvarchar(300)   = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser or configurator or controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = @username + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY ਀ 
		 -- Check minutes.  Retrieve value from global settings if NULL.  ਀ऀऀ 䤀䘀 䀀洀椀渀甀琀攀猀 㴀✀✀ 
		    SET @minutes = NULL;਀ऀऀ 䤀䘀 䀀洀椀渀甀琀攀猀 䤀匀 一唀䰀䰀 
		    BEGIN਀ऀऀऀ  匀䔀吀 䀀洀椀渀甀琀攀猀 㴀 ⠀ 
			     SELECT created_last_minutes ਀ऀऀऀ       䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			      WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ䔀一䐀 
਀ 
	     SELECT   sid_id                          AS 'User ID',਀ऀऀ          䤀匀一唀䰀䰀⠀渀愀洀攀Ⰰ ✀✀⤀                䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
			      ISNULL(descr, '')               AS 'Description',਀ऀऀ          䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀         䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				  ISNULL(email_address, '')       AS 'Email Address',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ 
			FROM user_restr.sid_list AS sl਀ऀऀ   圀䠀䔀刀䔀 ⠀猀氀⸀挀爀攀愀琀攀搀 㸀 䐀䄀吀䔀䄀䐀䐀⠀䴀䤀一唀吀䔀Ⰰ ⴀ䀀洀椀渀甀琀攀猀Ⰰ 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀⤀⤀㬀  
			SET @numrows = @@ROWCOUNT;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
     ਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_all_sid_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
-- Output is a status message and a transaction status਀ⴀⴀ 瀀氀甀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 猀椀搀 氀椀猀琀⸀   
-- If Current returns No then either the user record has been de-activated or਀ⴀⴀ 琀栀攀 圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 栀愀猀 戀攀攀渀 爀攀洀漀瘀攀搀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开猀椀搀开氀椀猀琀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀䘀愀椀氀✀Ⰰ  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀 漀爀 挀漀渀昀椀最甀爀愀琀漀爀 漀爀 挀漀渀琀爀漀氀氀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY ਀ऀ     匀䔀䰀䔀䌀吀   猀椀搀开椀搀                          䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
		          ISNULL(name, '')                AS 'Database Username',਀ऀऀऀ      䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀               䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		          ISNULL(username, '')            AS 'System Username',਀ऀऀऀऀ  䤀匀一唀䰀䰀⠀攀洀愀椀氀开愀搀搀爀攀猀猀Ⰰ ✀✀⤀       䄀匀 ✀䔀洀愀椀氀 䄀搀搀爀攀猀猀✀Ⰰ 
		          CONVERT(NVARCHAR(30), sl.created, 120) AS 'Created',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀㬀  
			SET @numrows = @@ROWCOUNT;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
     ਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_booking_ids_by_date]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Selects all booking IDs for between given dates.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_booking_ids_by_date]਀ 
	 @earlier_date datetime2(7)       = NULL,਀ऀ 䀀氀愀琀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀椀搀 戀椀最椀渀琀                          㴀 一唀䰀䰀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀     
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ऀऀⴀⴀ 刀攀琀爀椀攀瘀攀 甀猀攀爀 䤀䐀 
		SET @userid = (SELECT sid_id਀ऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						WHERE sl.sid = @connectedusersid)਀ 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY਀ 
       SELECT ਀ऀ          戀漀漀欀椀渀最开椀搀       䄀匀 嬀䈀漀漀欀椀渀最 䤀䐀崀Ⰰ 
			  bl.doc_id        AS [Document ID],਀ऀऀऀ  戀漀漀欀椀渀最开猀琀愀琀甀猀   䄀匀 嬀䈀漀漀欀椀渀最 匀琀愀琀甀猀崀Ⰰ 
			  CONVERT(NVARCHAR(10), user_id)    AS [User ID],਀ऀऀऀ  猀礀猀琀攀洀开甀猀攀爀渀愀洀攀  䄀匀 嬀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀崀Ⰰ 
			  CONVERT(NVARCHAR(30), booking_date, 120)    AS [Booking Date],਀ऀऀऀ  䤀匀一唀䰀䰀⠀挀漀洀洀攀渀琀猀Ⰰ ✀✀⤀       䄀匀 嬀䌀漀洀洀攀渀琀猀崀Ⰰ 
			  ISNULL(release_number, '') AS [Release Number]਀ ऀऀ 䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
   INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm -- Apply permission filter਀           伀一 戀氀⸀搀漀挀开椀搀 㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE (bl.booking_date < @later_date AND bl.booking_date > @earlier_date)਀ऀ 伀刀䐀䔀刀 䈀夀 嬀䈀漀漀欀椀渀最 䐀愀琀攀崀 䐀䔀匀䌀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ     刀伀䰀䰀䈀䄀䌀䬀㬀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开戀漀漀欀椀渀最开椀搀猀开戀礀开搀漀挀椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 匀攀氀攀挀琀猀 愀氀氀 戀漀漀欀椀渀最 䤀䐀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 䤀䐀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开戀漀漀欀椀渀最开椀搀猀开戀礀开搀漀挀椀搀崀 
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  ⴀⴀ 䴀愀渀搀愀琀漀爀礀 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀椀搀 戀椀最椀渀琀                          㴀 一唀䰀䰀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀     
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
 IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		-- Retrieve user ID਀ऀऀ匀䔀吀 䀀甀猀攀爀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
		                 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 搀愀琀愀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not has data edit permission for the document਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);;਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
਀ 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀       匀䔀䰀䔀䌀吀  
	          booking_id       AS [Booking ID],਀ऀऀऀ  戀氀⸀搀漀挀开椀搀        䄀匀 嬀䐀漀挀甀洀攀渀琀 䤀䐀崀Ⰰ 
			  booking_status   AS [Booking Status],਀ऀऀऀ  䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 甀猀攀爀开椀搀⤀    䄀匀 嬀唀猀攀爀 䤀䐀崀Ⰰ 
			  system_username  AS [System Username],਀ऀऀऀ  䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 戀漀漀欀椀渀最开搀愀琀攀Ⰰ ㄀㈀　⤀    䄀匀 嬀䈀漀漀欀椀渀最 䐀愀琀攀崀Ⰰ 
			  ISNULL(comments, '')       AS [Comments],਀ऀऀऀ  䤀匀一唀䰀䰀⠀爀攀氀攀愀猀攀开渀甀洀戀攀爀Ⰰ ✀✀⤀ 䄀匀 嬀刀攀氀攀愀猀攀 一甀洀戀攀爀崀 
 		 FROM base.booking_log AS bl਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
           ON bl.doc_id = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
	 ORDER BY [Booking Date] DESC਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     ROLLBACK;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_booking_ids_by_sidid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Selects all booking IDs for a given sid ID.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_booking_ids_by_sidid]਀ 
     @user_sid_id bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userid bigint                          = NULL,਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
    ਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ऀ ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀猀椀搀爀攀挀漀爀搀椀搀 
	   -- Check that the sid is valid਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 　 
		    SET @user_sid_id = NULL;਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一唀䰀䰀  
		    BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NoUserSidID', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀✀⤀㬀ऀ 
			END਀ऀऀ䔀䰀匀䔀 ⴀⴀ 䀀猀椀搀爀攀挀漀爀搀椀搀 椀猀 渀漀琀 一唀䰀䰀 
		  BEGIN਀ऀऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀  
				  				FROM user_restr.sid_list ਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀甀猀攀爀开猀椀搀开椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀甀猀攀爀开猀椀搀开椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
				   END਀ऀऀ   䔀一䐀 
				਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ 
਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY਀ 
       SELECT ਀ऀ          戀漀漀欀椀渀最开椀搀       䄀匀 嬀䈀漀漀欀椀渀最 䤀䐀崀Ⰰ 
			  bl.doc_id        AS [Document ID],਀ऀऀऀ  戀漀漀欀椀渀最开猀琀愀琀甀猀   䄀匀 嬀䈀漀漀欀椀渀最 匀琀愀琀甀猀崀Ⰰ 
			  CONVERT(NVARCHAR(10), user_id)    AS [User ID],਀ऀऀऀ  猀礀猀琀攀洀开甀猀攀爀渀愀洀攀  䄀匀 嬀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀崀Ⰰ 
			  CONVERT(NVARCHAR(30), booking_date, 120)    AS [Booking Date],਀ऀऀऀ  䤀匀一唀䰀䰀⠀挀漀洀洀攀渀琀猀Ⰰ ✀✀⤀       䄀匀 嬀䌀漀洀洀攀渀琀猀崀Ⰰ 
			  ISNULL(release_number, '') AS [Release Number]਀ ऀऀ 䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
   INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm -- Apply permission filter਀           伀一 戀氀⸀搀漀挀开椀搀 㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE bl.user_id = @user_sid_id਀ऀ 伀刀䐀䔀刀 䈀夀 嬀䈀漀漀欀椀渀最 䐀愀琀攀崀 䐀䔀匀䌀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ     刀伀䰀䰀䈀䄀䌀䬀㬀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开搀挀开最爀瀀开氀渀欀猀开爀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document metadata for all documents which the controller connected user has rights to.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 愀渀 漀瀀琀椀漀渀愀氀 昀漀爀洀 椀搀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_contr_dc_grp_lnks_rstr] ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),    ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀                 㴀 ✀✀Ⰰ 
		@fileid bigint                     = NULL,਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
 -- Data validation	਀  
  --============================================਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 ਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
  ਀ 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM xref.controller_doc_group_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀⤀     
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_contr_doc_groups_restr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀  
-- Output is a table of document groups, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_contr_doc_groups_restr] ਀ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀              㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@tempuserauth_status nchar(10)       = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT dgn.controller_doc_group_name_id AS 'Controller Doc Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀洀渀攀洀Ⰰ ✀✀⤀ऀऀऀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	            dgn.attr_name					 AS 'Controller Doc Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ऀऀऀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
 	            CONVERT(NVARCHAR(30), sl.created, 120) AS 'Created',਀ऀऀऀऀ搀最渀⸀挀爀攀愀琀攀搀开戀礀                   䄀匀 ✀䌀爀攀愀琀攀搀 䈀礀✀ 
		   FROM xref.controller_doc_group_names  AS dgn਀ऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀搀最猀氀 
		     ON     dgn.controller_doc_group_name_id਀ऀऀऀऀ㴀 挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
     INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一  挀搀最猀氀⸀猀椀搀开椀搀 
		        =   sl.sid_id਀ऀ ऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀  
	         ORDER BY 'Controller Doc Group ID';਀ऀ   匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀猀开爀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all controller level file groups linked to the connected user, plus a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀猀开爀猀琀爀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@usersid varbinary(100)              = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Connected user authentication਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀最渀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 䄀匀 ✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(dgn.mnem, '')			  AS 'Mnemonic',਀ऀ            搀最渀⸀愀琀琀爀开渀愀洀攀ऀऀऀऀऀ  䄀匀 ✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(dgn.descr, '')			  AS 'Description',਀ ऀ            䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀ 
		   FROM xref.controller_file_group_names  AS dgn਀ऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀昀最猀氀 
		     ON     dgn.controller_file_group_name_id਀ऀऀऀऀ㴀 挀昀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
     INNER JOIN user_restr.sid_list AS sl਀ऀ         伀一  挀昀最猀氀⸀猀椀搀开椀搀 
		        =   sl.sid_id਀ऀ ऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀  
	         ORDER BY 'Controller File Group ID';਀ऀ   匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀渀琀爀开昀氀开最爀瀀开氀渀欀猀开爀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-03-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀栀椀挀栀 愀 挀漀渀琀爀漀氀氀攀爀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_contr_fl_grp_lnks_rstr] ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ    
      @message nvarchar(1000)           = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                   = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀   
਀   ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀  
 ਀ 
-- Data validation਀ 
   IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 ਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
		   )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_controllers_form_groups]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 昀漀爀洀 最爀漀甀瀀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀⸀ 
-- Output is a list of the form groups, a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_controllers_form_groups]਀ 
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
  -- Execute the query.  Selecting form groups which the connected user is an owner.਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT fgn.form_group_id AS 'Form Group ID',਀ऀऀऀऀ昀最渀⸀愀琀琀爀开渀愀洀攀     䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				fgn.mnem          AS 'Mnemonic',਀ऀऀऀऀ昀最渀⸀搀攀猀挀爀         䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				fgn.list_position AS 'List Position'਀ऀऀ   䘀刀伀䴀    昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
		 INNER JOIN user_restr.form_group_owners AS fo਀ऀऀ            伀一 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
					  = fo.form_group_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀   
		            ON fo.sid_id਀ऀऀऀऀऀ 㴀 猀氀⸀猀椀搀开椀搀 
			  WHERE   sl.sid = @connectedusersid			         ਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
਀  ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'ZeroRecords', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
			END਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_controllers_forms]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 昀漀爀洀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀⸀ 
-- Output is a list of the forms, a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_controllers_forms]਀ 
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀     䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass. ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀        䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@transaction_ready nchar(10)            = 'Ready',  -- Defaults to Ready until it is set to Fail਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀   ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 倀愀猀猀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 䘀愀椀氀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  
  SET @numrows = 0;਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀⸀  匀攀氀攀挀琀椀渀最 昀漀爀洀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 漀眀渀猀 漀爀 眀栀椀挀栀 愀爀攀 渀漀琀 漀眀渀攀搀 戀礀 愀渀礀漀渀攀⸀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 昀椀渀⸀昀漀爀洀开椀搀       䄀匀 ✀䘀漀爀洀 䤀䐀✀Ⰰ 
			    fin.mnem          AS 'Mnemonic',਀ऀऀऀऀ昀椀渀⸀昀漀爀洀开渀愀洀攀     䄀匀 ✀䘀漀爀洀 一愀洀攀✀Ⰰ 
			    fin.descr         AS 'Description',਀ऀऀ        昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				fgn.attr_name     AS 'Form Group Name',਀ऀऀऀ    昀椀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀 䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		   FROM forms.form_identifier_names AS fin਀ऀ  䰀䔀䘀吀 䨀伀䤀一 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀      䄀匀 昀最渀 
		     ON   fin.form_group_id਀ऀऀ        㴀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
	  LEFT JOIN user_restr.form_group_owners AS fo਀ऀऀ     伀一  昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
		 	    = fo.form_group_id਀      䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		     ON   fo.sid_id਀ऀऀऀऀ 㴀 猀氀⸀猀椀搀开椀搀 
		   WHERE sl.sid = @connectedusersid			     ਀ऀऀऀ     伀刀 昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 䤀匀 一唀䰀䰀 
		ORDER BY 'List Position';਀ऀ    匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_del_log_by_file_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file delete log for a given file ID.  ਀ⴀⴀ 一漀琀攀 栀漀眀攀瘀攀爀 琀栀愀琀 琀栀椀猀 眀椀氀氀 椀渀挀氀甀搀攀 琀栀攀 搀愀琀愀 昀漀爀 愀渀礀 搀攀氀攀琀攀搀 昀椀氀攀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀攀氀开氀漀最开戀礀开昀椀氀攀开椀搀崀  
਀      䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT਀ 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@transactionmessage nvarchar(300)  = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username ਀ऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	@temp_userauth_status nchar(10)         = 'Fail',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
 -- Validation of the file ID is limited to checking that one has been supplied.਀ ⴀⴀ 吀栀攀 氀漀最 洀愀礀 挀漀渀琀愀椀渀 爀攀挀漀爀搀猀 漀昀 昀椀氀攀 䤀䐀猀 琀栀愀琀 栀愀瘀攀 猀椀渀挀攀 戀攀攀渀 搀攀氀攀琀攀搀 
 	 -- Validate @fileid਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 椀猀 瘀愀氀椀搀 
		 IF @fileid = 0਀ऀऀ    匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		 IF @fileid IS NULL ਀ऀऀ    䈀䔀䜀䤀一 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID');	਀ऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
਀                     䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀搀氀⸀搀愀琀攀开琀椀洀攀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䐀攀氀攀琀攀搀✀Ⰰ 
					 ISNULL(fdl.filename, '') AS 'Filename',਀ऀऀऀऀऀ 昀搀氀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀  䄀匀 ✀䌀爀攀愀琀攀搀 戀礀 唀猀攀爀渀愀洀攀✀Ⰰ 
					 fdl.created_by_sid_id    AS 'Created by User ID',਀ऀऀऀऀऀ 䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀搀氀⸀挀爀攀愀琀攀搀开眀栀攀渀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䘀椀氀攀 刀攀挀漀爀搀 䌀爀攀愀琀攀搀✀Ⰰ 
					 fdl.deleted_by_username  AS 'Deleted by Username',਀ऀऀऀऀऀ 昀搀氀⸀搀攀氀攀琀攀搀开戀礀开猀椀搀开椀搀    䄀匀 ✀䐀攀氀攀琀攀搀 戀礀 唀猀攀爀 䤀䐀✀ 
਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开搀攀氀攀琀攀开氀漀最  䄀匀 昀搀氀 
			   WHERE  fdl.file_id = @fileid਀ऀऀऀऀऀ   
਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀攀氀开氀漀最开戀礀开昀椀氀攀渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 昀椀氀攀 搀攀氀攀琀攀 氀漀最 眀栀攀爀攀 琀栀攀 昀椀氀攀渀愀洀攀 椀渀挀氀甀搀攀猀 琀栀攀 最椀瘀攀渀 猀琀爀椀渀最⸀   
-- Note however that this will include the data for any deleted files.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_del_log_by_filename] ਀ 
	  @likestring nvarchar(max)        = '', ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ 
	@connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
					 fdl.file_id              AS 'File ID',਀                     䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀搀氀⸀搀愀琀攀开琀椀洀攀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䐀攀氀攀琀攀搀✀Ⰰ 
					 ISNULL(fdl.filename, '') AS 'Filename',਀ऀऀऀऀऀ 昀搀氀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀  䄀匀 ✀䌀爀攀愀琀攀搀 戀礀 唀猀攀爀渀愀洀攀✀Ⰰ 
					 fdl.created_by_sid_id    AS 'Created by User ID',਀ऀऀऀऀऀ 䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀搀氀⸀挀爀攀愀琀攀搀开眀栀攀渀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䘀椀氀攀 刀攀挀漀爀搀 䌀爀攀愀琀攀搀✀Ⰰ 
					 fdl.deleted_by_username  AS 'Deleted by Username',਀ऀऀऀऀऀ 昀搀氀⸀搀攀氀攀琀攀搀开戀礀开猀椀搀开椀搀    䄀匀 ✀䐀攀氀攀琀攀搀 戀礀 唀猀攀爀 䤀䐀✀ 
਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开搀攀氀攀琀攀开氀漀最  䄀匀 昀搀氀 
			   WHERE  (fdl.filename LIKE '%' + @likestring + '%' ESCAPE '\')਀ऀऀऀ   伀刀䐀䔀刀 䈀夀 䐀攀氀攀琀攀搀 䐀䔀匀䌀 
					  ਀ 
	--=======================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				  ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ 
਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
 ਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_del_log_by_sid_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file delete log for a given SID ID.  Only returns files for which ਀ⴀⴀ 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  一漀琀攀 栀漀眀攀瘀攀爀 琀栀愀琀 琀栀椀猀 眀椀氀氀 椀渀挀氀甀搀攀 琀栀攀 搀愀琀愀 昀漀爀 愀渀礀 搀攀氀攀琀攀搀 昀椀氀攀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀攀氀开氀漀最开戀礀开猀椀搀开椀搀崀  
਀      䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT਀ 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@transactionmessage nvarchar(300)  = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username ਀ऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	@temp_userauth_status nchar(10)         = 'Fail',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 匀䤀䐀 䤀䐀 椀猀 氀椀洀椀琀攀搀 琀漀 挀栀攀挀欀椀渀最 琀栀愀琀 漀渀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
 -- The log may contain records of SID IDs that have since been deleted from the SID list.  ਀ 
	   -- Check that the sid is valid਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 　 
		    SET @user_sid_id = NULL;਀ऀऀ 䤀䘀 䀀甀猀攀爀开猀椀搀开椀搀 䤀匀 一唀䰀䰀  
		    BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NoUserSidID', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀✀⤀㬀ऀ 
			END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀  
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- ====================================================਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
		BEGIN TRY਀ 
			  SELECT ਀ऀऀऀऀऀ 昀搀氀⸀昀椀氀攀开椀搀              䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
                     CONVERT(NVARCHAR(30), fdl.date_time, 120) AS 'Deleted',਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀搀氀⸀昀椀氀攀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
					 fdl.created_by_username  AS 'Created by Username',਀ऀऀऀऀऀ 昀搀氀⸀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀    䄀匀 ✀䌀爀攀愀琀攀搀 戀礀 唀猀攀爀 䤀䐀✀Ⰰ 
					 CONVERT(NVARCHAR(30), fdl.created_when, 120) AS 'File Record Created',਀ऀऀऀऀऀ 昀搀氀⸀搀攀氀攀琀攀搀开戀礀开甀猀攀爀渀愀洀攀  䄀匀 ✀䐀攀氀攀琀攀搀 戀礀 唀猀攀爀渀愀洀攀✀ 
਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开搀攀氀攀琀攀开氀漀最  䄀匀 昀搀氀 
			   WHERE  fdl.deleted_by_sid_id = @user_sid_id਀ऀऀऀ   伀刀䐀䔀刀 䈀夀 䐀攀氀攀琀攀搀 䐀䔀匀䌀 
					  ਀ 
	--=======================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				  ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ 
਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
 ਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_del_log_by_username]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file delete log where the username includes the given string.  ਀ⴀⴀ 一漀琀攀 栀漀眀攀瘀攀爀 琀栀愀琀 琀栀椀猀 眀椀氀氀 椀渀挀氀甀搀攀 琀栀攀 搀愀琀愀 昀漀爀 愀渀礀 搀攀氀攀琀攀搀 昀椀氀攀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀攀氀开氀漀最开戀礀开甀猀攀爀渀愀洀攀崀  
਀ऀ  䀀氀椀欀攀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT਀ 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@transactionmessage nvarchar(300)  = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username ਀ऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	@temp_userauth_status nchar(10)         = 'Fail',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
 		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀  
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- ====================================================਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
		BEGIN TRY਀ 
			  SELECT ਀ऀऀऀऀऀ 昀搀氀⸀昀椀氀攀开椀搀              䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
                     CONVERT(NVARCHAR(30), fdl.date_time, 120) AS 'Deleted',਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀搀氀⸀昀椀氀攀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
					 fdl.created_by_username  AS 'Created by Username',਀ऀऀऀऀऀ 昀搀氀⸀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀    䄀匀 ✀䌀爀攀愀琀攀搀 戀礀 唀猀攀爀 䤀䐀✀Ⰰ 
					 CONVERT(NVARCHAR(30), fdl.created_when, 120) AS 'File Record Created',਀ऀऀऀऀऀ 昀搀氀⸀搀攀氀攀琀攀搀开戀礀开甀猀攀爀渀愀洀攀  䄀匀 ✀䐀攀氀攀琀攀搀 戀礀 唀猀攀爀渀愀洀攀✀Ⰰ 
					 fdl.deleted_by_sid_id    AS 'Deleted by User ID'਀ 
				FROM base.file_delete_log  AS fdl਀ऀऀऀ   圀䠀䔀刀䔀  ⠀昀搀氀⸀搀攀氀攀琀攀搀开戀礀开甀猀攀爀渀愀洀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀ 䔀匀䌀䄀倀䔀 ✀尀✀⤀ 
			   ORDER BY Deleted DESC਀ऀऀऀऀऀ   
਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀攀氀开氀漀最开搀愀琀攀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 昀椀氀攀 搀攀氀攀琀攀 氀漀最 眀栀攀爀攀 琀栀攀 搀攀氀攀琀攀 搀愀琀攀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 搀愀琀攀猀⸀  伀渀氀礀 爀攀琀甀爀渀猀 昀椀氀攀猀 昀漀爀 眀栀椀挀栀  
-- the connected user has viewing rights to.  Note however that this will include the data for any deleted files.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_del_log_date_between] ਀ 
	  @earlier_date datetime           = NULL,਀ऀ  䀀氀愀琀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀             㴀 一唀䰀䰀Ⰰ  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT਀ 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@transactionmessage nvarchar(300)  = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username ਀ऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	@temp_userauth_status nchar(10)         = 'Fail',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
਀ऀ      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀愀琀攀 瘀愀氀甀攀 椀猀 瘀愀氀椀搀 
		  IF (@earlier_date IS NOT NULL AND @earlier_date <> '')਀ऀऀ     䈀䔀䜀䤀一 
			   IF ISDATE(@earlier_date) <> 1਀ऀऀऀ      䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateInvalid.');਀ऀऀऀऀ  䔀一䐀 
			 END਀ऀऀ  䔀䰀匀䔀 匀䔀吀 䀀攀愀爀氀椀攀爀开搀愀琀攀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ऀऀ  䤀䘀 ⠀䀀氀愀琀攀爀开搀愀琀攀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀氀愀琀攀爀开搀愀琀攀 㰀㸀 ✀✀⤀ 
		     BEGIN਀ऀऀऀ   䤀䘀 䤀匀䐀䄀吀䔀⠀䀀氀愀琀攀爀开搀愀琀攀⤀ 㰀㸀 ㄀ 
			      BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DateInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				  END਀ऀऀऀ 䔀一䐀 
		  ELSE SET @later_date = NULL;਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀  
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- ====================================================਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
		BEGIN TRY਀ 
			  SELECT ਀ऀऀऀऀऀ 昀搀氀⸀昀椀氀攀开椀搀              䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
                     CONVERT(NVARCHAR(30), fdl.date_time, 120) AS 'Deleted',਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀搀氀⸀昀椀氀攀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
					 fdl.created_by_username  AS 'Created by Username',਀ऀऀऀऀऀ 昀搀氀⸀挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀    䄀匀 ✀䌀爀攀愀琀攀搀 戀礀 唀猀攀爀 䤀䐀✀Ⰰ 
					 CONVERT(NVARCHAR(30), fdl.created_when, 120) AS 'File Record Created',਀ऀऀऀऀऀ 昀搀氀⸀搀攀氀攀琀攀搀开戀礀开甀猀攀爀渀愀洀攀  䄀匀 ✀䐀攀氀攀琀攀搀 戀礀 唀猀攀爀渀愀洀攀✀Ⰰ 
					 fdl.deleted_by_sid_id    AS 'Deleted by User ID'਀ 
				FROM base.file_delete_log  AS fdl਀ऀऀऀ   圀䠀䔀刀䔀  ⠀昀搀氀⸀搀愀琀攀开琀椀洀攀 㰀 䀀氀愀琀攀爀开搀愀琀攀 䄀一䐀 昀搀氀⸀搀愀琀攀开琀椀洀攀 㸀 䀀攀愀爀氀椀攀爀开搀愀琀攀⤀ 
			   ORDER BY Deleted DESC਀ऀऀऀऀऀ   
਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀最开攀搀开瀀攀爀洀开昀甀渀挀琀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 琀漀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 氀椀渀欀 爀攀挀漀爀搀猀 
-- Only document groups for which the user has view permission will be listed.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀ 
CREATE PROCEDURE [controlling].[usp_SEL_dg_ed_perm_funct_list] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
        @zerorecordsmessage nvarchar(200)    = '', -- Communicates that zero records were retrieved਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
					SELECT DISTINCT dgn.doc_group_id     AS 'Doc Group ID',਀ऀऀऀऀऀऀ            搀最渀⸀愀琀琀爀开渀愀洀攀        䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
									fln.function_list_id AS 'Function List ID',਀ऀऀऀऀऀऀऀऀऀ昀氀渀⸀渀愀洀攀             䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
									dgepfl.notes         AS 'Notes',਀ऀऀऀऀऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀最攀瀀昀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
									dgepfl.granted_by    AS 'Granted By'਀ऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
				INNER JOIN user_restr.doc_group_edit_perm_funct_lst AS dgepfl਀ऀऀऀऀऀऀ伀一       搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
							= dgepfl.doc_group_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						ON  dgepfl.function_list_id਀ऀऀऀऀऀऀऀ㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
				LEFT JOIN people.function_lists AS fl਀ऀऀऀऀऀऀ伀一   昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
							=  fl.function_list_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一  瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
						ON   fl.function_id਀ऀऀऀऀऀऀऀ㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
				LEFT JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀऀ伀一  搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
							=  df.function_id਀ऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
				        ON  dgvp.doc_group_id ਀ऀऀऀऀऀऀ   㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀ऀऀऀऀ 
				LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀ伀一  搀最瘀瀀⸀猀椀搀开椀搀  
							= sl.sid_id਀ऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
				 ORDER BY 'Doc Group Name';  ਀ 
਀ ऀऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
				BEGIN਀ऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					   @message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
				END਀ 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀  ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @transactionmessage = @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				 SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   		  END TRY਀ऀऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
			 SET @transaction_status = 'Bad';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'SelectError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
				CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀऀ 䔀䰀匀䔀  
				SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
    END਀ऀ  
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀最开攀搀开瀀攀爀洀开瀀攀漀瀀氀攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-12-2023਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀⼀⨀⨀ 
* Lists all document group to people list link records.਀⨀  
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
* - A list of document group people list link records.਀⨀ ⴀ 怀怀䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀怀怀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - ``@transaction_status nchar(50) OUTPUT``: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - Only document groups for which the user has view permission will be returned.਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀最开攀搀开瀀攀爀洀开瀀攀漀瀀氀攀开氀椀猀琀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)       = '',਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message,' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		BEGIN TRY਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀     䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
						            dgn.attr_name        AS 'Doc Group Name',਀ऀऀऀऀऀऀऀऀऀ瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀   䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
									pln.name             AS 'People List Name',਀ऀऀऀऀऀऀऀऀऀ搀最攀瀀瀀氀⸀渀漀琀攀猀         䄀匀 ✀一漀琀攀猀✀Ⰰ 
									CONVERT(NVARCHAR(30), dgeppl.created, 120) AS 'Created',਀ऀऀऀऀऀऀऀऀऀ搀最攀瀀瀀氀⸀最爀愀渀琀攀搀开戀礀    䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
					FROM xref.doc_group_names AS dgn਀ऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 䄀匀 搀最攀瀀瀀氀 
						ON       dgn.doc_group_id਀ऀऀऀऀऀऀऀ㴀 搀最攀瀀瀀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
				LEFT JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ伀一  搀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
							=  pln.people_list_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						ON    pln.people_list_id ਀ऀऀऀऀऀऀऀ㴀  瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				INNER JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀऀ        伀一  搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀  
						   = dgn.doc_group_id				਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						ON  dgvp.sid_id ਀ऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
					WHERE sl.sid = @connectedusersid਀ऀऀऀऀ 伀刀䐀䔀刀 䈀夀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀㬀   
	     ਀ 
 				  IF @@ROWCOUNT = 0਀ऀऀऀऀऀ䈀䔀䜀䤀一 
					  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀऀऀ䔀一䐀 
਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'Success', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
				 SET @transaction_status = 'Good';਀   ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
		END CATCH਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	 ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_doc_groups_by_f_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Lists all of the document groups਀ⴀⴀ 昀漀爀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 昀漀爀 愀 最椀瘀攀渀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 怀怀䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀怀怀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
* - A list of document groups.਀⨀ ⴀ 怀怀䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀怀怀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - ``@transaction_status nchar(50) OUTPUT``: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - Only document groups for which the user has view permission will be returned.਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing @docgroupid, @functionlistid, or non-existing record in database.਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开最爀漀甀瀀猀开戀礀开昀开氀椀猀琀崀  
਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ  ⴀⴀ 唀猀攀爀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
      -- Check the function list id has been supplied਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀   
	     BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the function list exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
				                  FROM people.function_list_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ ऀऀ    䔀一䐀 
		  -- Output the data validation status failed message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	  IF @transaction_ready = 'Ready' ਀ऀऀ䈀䔀䜀䤀一 
਀ऀऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
						                 dgn.doc_group_id AS 'Document Group ID',਀ऀऀऀऀऀऀऀऀऀऀ 搀最渀⸀愀琀琀爀开渀愀洀攀    䄀匀 ✀䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀 一愀洀攀✀ 
						FROM xref.doc_group_names AS dgn਀ऀऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 搀最攀瀀昀氀 
							ON      dgn.doc_group_id਀ऀऀऀऀऀऀऀऀ㴀 搀最攀瀀昀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
					LEFT JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀऀ伀一  搀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
								=  fln.function_list_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
							ON   fln.function_list_id ਀ऀऀऀऀऀऀऀऀ㴀  昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					INNER JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀऀऀऀऀ伀一  搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀  
							   = dgn.doc_group_id				਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
							ON  dgvp.sid_id ਀ऀऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
						WHERE   fln.function_list_id਀ऀऀऀऀऀऀऀऀ 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
								AND਀ऀऀऀऀऀऀऀऀ猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀   
					  ORDER BY  'Document Group Name';਀ऀऀऀऀऀ      
਀ ऀऀऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
					BEGIN਀ऀऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						   @message_id   = 'ZeroRecords', ਀ऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					   ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
					END਀ 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = @message + ' | ' + @tempmessage;਀ऀऀऀऀ 䔀䰀匀䔀  
					 SET @message = @message + ' | ' + 'A database level message error occurred on Success.';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   			  END TRY਀ऀऀऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
				 SET @transaction_status = 'Bad';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'SelectError', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
					CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = @message + ' | ' + 'A database level message error occurred on SelectError.';਀ऀऀऀ䔀一䐀 䌀䄀吀䌀䠀 
		END -- End IF @transaction_ready = 'Ready'਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	 ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_doc_groups_by_p_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 昀漀爀 愀 最椀瘀攀渀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 怀怀䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀怀怀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
* - A list of document groups.਀⨀ ⴀ 怀怀䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀怀怀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - ``@transaction_status nchar(50) OUTPUT``: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - Only document groups for which the user has view permission will be returned.਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing @peoplelistid or non-existing record in database.਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
--===============================================================================਀ 
CREATE PROCEDURE [controlling].[usp_SEL_doc_groups_by_p_list] ਀ 
	 @peoplelistid bigint             = NULL,  -- User duty function list id਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)       = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@tempmessage nvarchar(300)           = '',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
      -- Check the people list id has been supplied਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀   
	     BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the people list exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				                  FROM people.people_list_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'PeopleListIDInvalid', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀ 簀 ✀  ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀  
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ 
		END਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀ 
਀ऀ  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀  
		BEGIN਀ 
			BEGIN TRY਀ 
						(SELECT DISTINCT @peoplelistid    AS 'People List ID',਀ऀऀऀऀऀऀ                 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 䄀匀 ✀䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
										 dgn.attr_name    AS 'Document Group Name'਀ऀऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
					INNER JOIN user_restr.doc_group_edit_perm_people_lst AS dgeppl਀ऀऀऀऀऀऀऀ伀一       搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
								= dgeppl.doc_group_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
							ON  dgeppl.people_list_id਀ऀऀऀऀऀऀऀऀ㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					LEFT JOIN people.people_lists AS pl਀ऀऀऀऀऀऀऀ伀一    瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
								=  pl.people_list_id਀ऀऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
							ON  dgvp.doc_group_id ਀ऀऀऀऀऀऀऀ   㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀ऀऀऀऀ 
					LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀ伀一  搀最瘀瀀⸀猀椀搀开椀搀  
								= sl.sid_id਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
								 = @peoplelistid਀ऀऀऀऀऀऀऀऀ䄀一䐀 
								sl.sid = @connectedusersid)  ਀ऀऀऀऀऀ  伀刀䐀䔀刀 䈀夀  ✀䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀 一愀洀攀✀㬀 
					     ਀ 
 				  IF @@ROWCOUNT = 0਀ऀऀऀऀऀ䈀䔀䜀䤀一 
					  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = @message + ' | ' + @tempmessage;਀ऀऀऀऀऀ   䔀䰀匀䔀  
						   SET @message = @message + ' | ' + 'A database level message error occurred on ZeroRecords.';਀ऀऀऀऀऀ䔀一䐀 
਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'Success', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
				 SET @transaction_status = 'Good';਀   ऀऀऀ  䔀一䐀 吀刀夀 
			  BEGIN CATCH਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = @message + ' | ' + @tempmessage + ' | ' + ਀ऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
			END CATCH਀ऀऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    END -- End IF @userauthentication_status = 'Pass'਀ऀ  
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开挀漀渀琀爀开搀漀挀开最爀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document metadata for a controller level document group.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 昀漀爀洀 椀搀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_docs_by_contr_doc_grp] ਀      䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ    
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㐀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint                 = '',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀                     㴀 一唀䰀䰀Ⰰ 
		@tempuserauth_status nchar(10)     = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ 
-- Connected user authentication਀ 
  -- Authenticate the connected users for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	 -- This also returns fail if the id does not exist਀    䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开挀漀渀琀开搀漀挀开最爀瀀崀 
	     @contr_doc_grp_to_check = @contr_doc_ed_grp_name_id,਀ऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'InvalidConDocGrp', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䌀漀渀䐀漀挀䜀爀瀀✀⤀㬀 
		END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀  ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀  
 END -- End IF user authentication = Pass਀   
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开搀漀挀开攀搀开最爀瀀开渀愀洀攀开椀搀⤀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
     -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_f_list_by_doc_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 眀栀椀挀栀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 怀怀䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀怀怀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
* - A list of duty function lists.਀⨀ ⴀ 怀怀䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀怀怀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - ``@transaction_status nchar(50) OUTPUT``: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀 漀爀 渀漀渀ⴀ攀砀椀猀琀椀渀最 爀攀挀漀爀搀 椀渀 搀愀琀愀戀愀猀攀⸀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀搀漀挀最爀漀甀瀀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 瘀愀氀椀搀⸀ 
* - The user must have view permission for the document group id.਀⨀ 
* **Postconditions:**਀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ 
CREATE PROCEDURE [controlling].[usp_SEL_f_list_by_doc_group] ਀ 
     @docgroupid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)       = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@tempmessage nvarchar(300)           = '',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		IF @docgroupid = 0਀ऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		IF @docgroupid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupId');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
			ELSE਀ऀऀऀऀⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
				-- This also returns negative if the id does not exist਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
					@docgroupid_to_check_vp = @docgroupid,਀ऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @tempuserauth_status = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'NoDocGroupPermission', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
				END਀ 
		  -- Output the data validation status failed message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	  IF @transaction_ready = 'Ready' ਀ऀऀ䈀䔀䜀䤀一 
਀ऀऀऀ䈀䔀䜀䤀一 吀刀夀 
						SELECT DISTINCT @docgroupid                AS 'Doc Group ID',਀ऀऀऀऀऀऀ                搀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀    䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
						                fln.name                   AS 'Function List Name',਀ऀऀऀऀऀऀऀऀऀऀ䤀匀一唀䰀䰀⠀搀最攀瀀昀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀   䄀匀 ✀一漀琀攀猀✀ऀऀऀऀऀऀऀऀऀ 
						FROM xref.doc_group_names AS dgn਀ऀऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 搀最攀瀀昀氀 
							ON       dgn.doc_group_id਀ऀऀऀऀऀऀऀऀ㴀 搀最攀瀀昀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
					LEFT JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀऀ伀一  搀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
								=  fln.function_list_id਀ऀऀऀऀऀऀ圀䠀䔀刀䔀  搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀㬀 
						     ਀ 
 				  IF @@ROWCOUNT = 0਀ऀऀऀऀऀ䈀䔀䜀䤀一 
					  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀऀऀ䔀一䐀 
਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'Success', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
				 SET @transaction_status = 'Good';਀   ऀऀऀ  䔀一䐀 吀刀夀 
			  BEGIN CATCH਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
			END CATCH਀ऀऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	END -- End IF user authentication status = 'Pass' 	 ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_fgepfl_by_file_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀⸀  
-- Input is a file group ID ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 昀甀渀挀琀椀漀渀 氀椀猀琀 搀愀琀愀 瀀氀甀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 漀昀 琀栀攀 甀猀攀爀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 眀栀椀挀栀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 琀愀戀氀攀 漀昀 昀甀渀挀琀椀漀渀 氀椀猀琀 渀愀洀攀猀 挀漀洀瀀爀椀猀椀渀最 䤀䐀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid file group ID.਀⨀ 
* **Side Effects:**਀⨀ 
* - None.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_fgepfl_by_file_group] ਀ 
     @filegroupid bigint              = NULL,             -- File group ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL; -- Check if a file group ID has been supplied਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀䐀✀⤀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 最爀漀甀瀀 攀砀椀猀琀猀 
		   BEGIN਀ऀऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
			                  FROM xref.file_group_names AS fgn਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'FileGroupIdNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT @filegroupid                  AS 'File Group ID',਀ऀऀ        昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀          䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
                ISNULL(fln.mnem, '')          AS 'Mnemonic',਀ऀऀऀऀ昀氀渀⸀渀愀洀攀                      䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				ISNULL(fln.description, '')   AS 'Description',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最攀瀀昀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀      䄀匀 ✀刀攀挀漀爀搀 一漀琀攀猀✀Ⰰ 
				CONVERT(NVARCHAR(30), fgepfl.created, 120)  AS 'Created',਀ऀऀऀऀ昀最攀瀀昀氀⸀最爀愀渀琀攀搀开戀礀             䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		   FROM people.function_list_names AS fln਀ऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
	         ON      fln.function_list_id਀ऀऀऀ    㴀 昀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		  WHERE fgepfl.file_group_id = @filegroupid; ਀ 
 		  IF @@ROWCOUNT = 0਀ऀऀऀऀ䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_fgeppl_by_file_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀⸀  
-- Input is a file group ID ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 瀀攀漀瀀氀攀 氀椀猀琀 搀愀琀愀 瀀氀甀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 漀昀 琀栀攀 甀猀攀爀 瀀攀漀瀀氀攀 氀椀猀琀猀 眀栀椀挀栀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 琀愀戀氀攀 漀昀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀猀 挀漀洀瀀爀椀猀椀渀最 䤀䐀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid file group ID.਀⨀ 
* **Side Effects:**਀⨀ 
* - None.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_fgeppl_by_file_group] ਀ 
     @filegroupid bigint              = NULL,             -- File group ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL; -- Check if a file group ID has been supplied਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀䐀✀⤀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 最爀漀甀瀀 攀砀椀猀琀猀 
		   BEGIN਀ऀऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
			                  FROM xref.file_group_names AS fgn਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'FileGroupIdNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT @filegroupid                  AS 'File Group ID',਀ऀऀ        瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀            䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
                ISNULL(pln.mnem, '')          AS 'Mnemonic',਀ऀऀऀऀ瀀氀渀⸀渀愀洀攀                      䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				ISNULL(pln.description, '')   AS 'Description',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最攀瀀瀀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀      䄀匀 ✀刀攀挀漀爀搀 一漀琀攀猀✀Ⰰ 
				CONVERT(NVARCHAR(30), fgeppl.created, 120) AS 'Created',਀ऀऀऀऀ昀最攀瀀瀀氀⸀最爀愀渀琀攀搀开戀礀             䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		   FROM people.people_list_names AS pln਀ऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 
	         ON      pln.people_list_id਀ऀऀऀ    㴀 昀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		  WHERE fgeppl.file_group_id = @filegroupid; ਀ 
 		  IF @@ROWCOUNT = 0਀ऀऀऀऀ䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_file_groups_by_fgepfl]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 昀漀爀 愀 最椀瘀攀渀 甀猀攀爀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀  
-- Input is a user function list ID ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 昀椀氀攀 最爀漀甀瀀 搀愀琀愀 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 漀昀 琀栀攀 昀椀氀攀 最爀漀甀瀀猀 眀栀椀挀栀 愀 最椀瘀攀渀 昀甀渀挀琀椀漀渀 氀椀猀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 琀愀戀氀攀 漀昀 昀椀氀攀最爀漀甀瀀 渀愀洀攀猀 挀漀洀瀀爀椀猀椀渀最 䤀䐀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid function list ID.਀⨀ 
* **Side Effects:**਀⨀ 
* - None.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_file_groups_by_fgepfl] ਀ 
     @functionlistid bigint           = NULL,             -- Function list ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
		    SET @functionlistid = NULL; -- Check if a file group ID has been supplied਀ऀऀ 䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 攀砀椀猀琀猀 
		   BEGIN਀ऀऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                  FROM people.function_list_names AS fln਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'FunctionListIdNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀椀漀渀䰀椀猀琀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT @functionlistid          AS 'Function List ID',਀ऀऀ        昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀        䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
                ISNULL(fgn.mnem, '')     AS 'Mnemonic',਀ऀऀऀऀ昀最渀⸀愀琀琀爀开渀愀洀攀            䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(fgn.descr, '')    AS 'Description',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最攀瀀昀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀ 䄀匀 ✀刀攀挀漀爀搀 一漀琀攀猀✀Ⰰ 
				CONVERT(NVARCHAR(30), fgepfl.created, 120) AS 'Created',਀ऀऀऀऀ昀最攀瀀昀氀⸀最爀愀渀琀攀搀开戀礀        䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		   FROM xref.file_group_names AS fgn਀ऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
	         ON      fgn.file_group_id਀ऀऀऀ    㴀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
		  WHERE fgepfl.function_list_id = @functionlistid; ਀ 
 		  IF @@ROWCOUNT = 0਀ऀऀऀऀ䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_file_groups_by_fgeppl]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 昀漀爀 愀 最椀瘀攀渀 甀猀攀爀 瀀攀漀瀀氀攀 氀椀猀琀⸀  
-- Input is a user people list ID ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 昀椀氀攀 最爀漀甀瀀 搀愀琀愀 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 漀昀 琀栀攀 昀椀氀攀 最爀漀甀瀀猀 眀栀椀挀栀 愀 最椀瘀攀渀 瀀攀漀瀀氀攀 氀椀猀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 琀愀戀氀攀 漀昀 昀椀氀攀最爀漀甀瀀 渀愀洀攀猀 挀漀洀瀀爀椀猀椀渀最 䤀䐀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid people list ID.਀⨀ 
* **Side Effects:**਀⨀ 
* - None.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_file_groups_by_fgeppl] ਀ 
     @peoplelistid bigint             = NULL,             -- people list ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
		    SET @peoplelistid = NULL; -- Check if a file group ID has been supplied਀ऀऀ 䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 攀砀椀猀琀猀 
		   BEGIN਀ऀऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                  FROM people.people_list_names AS pln਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'PeopleListIDNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT @peoplelistid            AS 'People List ID',਀ऀऀ        昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀        䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
                ISNULL(fgn.mnem, '')     AS 'Mnemonic',਀ऀऀऀऀ昀最渀⸀愀琀琀爀开渀愀洀攀            䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(fgn.descr, '')    AS 'Description',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最攀瀀瀀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀ 䄀匀 ✀刀攀挀漀爀搀 一漀琀攀猀✀Ⰰ 
                CONVERT(NVARCHAR(30), fgeppl.created, 120) AS 'Created',਀ऀऀऀऀ昀最攀瀀瀀氀⸀最爀愀渀琀攀搀开戀礀        䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		   FROM xref.file_group_names AS fgn਀ऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 
	         ON      fgn.file_group_id਀ऀऀऀ    㴀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
		  WHERE fgeppl.people_list_id = @peoplelistid; ਀ 
 		  IF @@ROWCOUNT = 0਀ऀऀऀऀ䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀瀀开攀搀开瀀爀洀开昀开氀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all records from user_restr.file_group_edit_perm_funct_lst. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀猀 瀀氀甀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 匀攀氀攀挀琀猀 愀氀氀 漀昀 琀栀攀 爀攀挀漀爀搀猀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀Ⰰ 椀⸀攀 琀栀攀 爀攀挀漀爀搀猀 眀栀椀挀栀 氀椀渀欀  
* file groups with function lists.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - None required਀⨀ 
* **Return Values:**਀⨀ 
* - A table of function list names and file group names comprising ID, mnemonic, name and description for each਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ 
* **Side Effects:**਀⨀ 
* - None.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀瀀开攀搀开瀀爀洀开昀开氀猀琀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀   
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT DISTINCT fln.function_list_id          AS 'Function List ID',਀                         䤀匀一唀䰀䰀⠀昀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				         fln.name                      AS 'Function List Name',਀ऀऀऀऀ         䤀匀一唀䰀䰀⠀昀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀   䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
						 fgn.file_group_id             AS 'File Group ID',਀ऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀最渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䴀渀攀洀漀渀椀挀✀Ⰰ 
						 fgn.attr_name                 AS 'File Group Name',਀ऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				         ISNULL(fgepfl.notes, '')      AS 'Record Notes',਀ऀऀऀऀ         䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀最攀瀀昀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀  䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
						 fgepfl.granted_by             AS 'Granted By'਀ऀऀऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
			  INNER JOIN user_restr.file_group_edit_perm_funct_lst AS fgepfl਀ऀऀऀऀऀ  伀一      昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 = fgepfl.function_list_id਀ऀऀऀ  䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
					  ON  fgepfl.file_group_id਀ऀऀऀऀऀऀ 㴀   昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
				ORDER BY 'Function List Name'; ਀ 
 		  IF @@ROWCOUNT = 0਀ऀऀऀऀ䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_file_grp_ed_prm_p_lsts]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀⸀  
-- Output is a list of records plus status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Selects all of the records from user_restr.file_group_edit_perm_ppl_lst, i.e the records which link ਀⨀ 昀椀氀攀 最爀漀甀瀀猀 眀椀琀栀 瀀攀漀瀀氀攀 氀椀猀琀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 爀攀焀甀椀爀攀搀 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 琀愀戀氀攀 漀昀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀猀 愀渀搀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀猀 挀漀洀瀀爀椀猀椀渀最 䤀䐀Ⰰ 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀 昀漀爀 攀愀挀栀 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_file_grp_ed_prm_p_lsts] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀            䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
                         ISNULL(pln.mnem, '')          AS 'People List Mnemonic',਀ऀऀऀऀ         瀀氀渀⸀渀愀洀攀                      䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				         ISNULL(pln.description, '')   AS 'People List Description',਀ऀऀऀऀऀऀ 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀             䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
						 ISNULL(fgn.mnem, '')          AS 'File Group Mnemonic',਀ऀऀऀऀऀऀ 昀最渀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
						 ISNULL(fgn.descr, '')         AS 'File Group Description',਀ऀऀऀऀ         䤀匀一唀䰀䰀⠀昀最攀瀀瀀氀⸀渀漀琀攀猀Ⰰ ✀✀⤀      䄀匀 ✀刀攀挀漀爀搀 一漀琀攀猀✀Ⰰ 
				         CONVERT(NVARCHAR(30), fgeppl.created, 120) AS 'Created',਀ऀऀऀऀऀऀ 昀最攀瀀瀀氀⸀最爀愀渀琀攀搀开戀礀             䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
				    FROM people.people_list_names AS pln਀ऀऀऀ  䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 
					  ON      pln.people_list_id਀ऀऀऀऀऀऀ 㴀 昀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			  INNER JOIN xref.file_group_names AS fgn਀ऀऀऀऀऀ  伀一  昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
						 =   fgn.file_group_id਀ऀऀऀऀ伀刀䐀䔀刀 䈀夀 ✀倀攀漀瀀氀攀 氀椀猀琀 一愀洀攀✀㬀  
਀ ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
				BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
				END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_files_by_contr_file_grp]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given controller level file group਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开挀漀渀琀爀开昀椀氀攀开最爀瀀崀  
	  @contr_file_ed_grp_name_id bigint = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ    
      @message nvarchar(1000)           = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                   = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint              = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀            㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀   
਀   ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀  
 	 -- This also returns fail if the id does not exist਀    䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开挀漀渀琀开昀椀氀攀开最爀瀀崀 
	     @contr_file_grp_to_check = @contr_file_ed_grp_name_id,਀ऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀瘀愀氀椀搀䌀漀渀䘀椀氀攀䜀爀瀀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidConFileGrp');਀ऀऀ䔀一䐀 
਀ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀   䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀  
 END -- End IF user authentication = Pass਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given controller level file group.  ਀ऀⴀⴀ 愀渀搀 栀攀渀挀攀 栀愀猀 愀挀挀攀猀猀 琀漀 琀栀攀 昀椀氀攀猀 眀椀琀栀椀渀 琀栀愀琀 昀椀氀攀 最爀漀甀瀀⸀  
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
	    WHERE searchtable.controller_file_group_name_id = @contr_file_ed_grp_name_id  -- ### The search criteria਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
     -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀开氀椀猀琀开戀礀开搀漀挀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-12-2023਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀⼀⨀⨀ 
* Selects all people lists which have edit permission for a given document group.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - ``@docgroupid bigint``: Must be a non-null and non-empty valid identifier.਀⨀ 
* **Return Values:**਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 瀀攀漀瀀氀攀 氀椀猀琀猀⸀ 
* - ``@message nvarchar(1000) OUTPUT``: Descriptive status message of the procedure's execution.਀⨀ ⴀ 怀怀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀怀怀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing @docgroupid or non-existing record in database.਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @docgroupid must be provided and valid.਀⨀ ⴀ 吀栀攀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- ===============================================================================਀ 
CREATE PROCEDURE [controlling].[usp_SEL_p_list_by_doc_group] ਀ 
     @docgroupid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)       = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@tempmessage nvarchar(300)           = '',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	    -- Data validation਀ऀऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
			SET @docgroupid = NULL;਀ऀऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoDocGroupId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ऀऀ䔀䰀匀䔀 
			-- Authenticate the user for the given document group਀ऀऀऀⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 渀攀最愀琀椀瘀攀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN  -- The user does not have permission for this action਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀    㴀 ✀䘀愀椀氀✀㬀 
					SET @userauthentication_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', 'Document group ID: ', ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL'), ' ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupPermission.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀ 
਀ऀ  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀  
		BEGIN਀ऀ 
			BEGIN TRY਀ऀऀऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 䀀搀漀挀最爀漀甀瀀椀搀                䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
						                pln.name                   AS 'People List Name',਀ऀऀऀऀऀऀऀऀऀऀ搀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀      䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
										ISNULL(dgeppl.notes, '')   AS 'Notes'									਀ऀऀऀऀऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
					INNER JOIN user_restr.doc_group_edit_perm_people_lst AS dgeppl਀ऀऀऀऀऀऀऀ伀一       搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
								= dgeppl.doc_group_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
							ON  dgeppl.people_list_id਀ऀऀऀऀऀऀऀऀ㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						WHERE  dgn.doc_group_id = @docgroupid਀ऀऀऀऀऀऀ伀刀䐀䔀刀 䈀夀 瀀氀渀⸀渀愀洀攀㬀 
						     ਀ 
 				  IF @@ROWCOUNT = 0਀ऀऀऀऀऀ䈀䔀䜀䤀一 
					  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
						   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀऀऀ䔀一䐀 
਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'Success', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
				 SET @transaction_status = 'Good';਀   ऀऀऀ  䔀一䐀 吀刀夀 
			  BEGIN CATCH਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ',  ਀ऀऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
			END CATCH਀ऀऀ䔀一䐀 
	END -- End IF user authentication status = 'Pass' ਀ऀ  
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_read_log_by_file_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file read log for a given file ID.  Only returns files for which ਀ⴀⴀ 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  一漀琀攀 栀漀眀攀瘀攀爀 琀栀愀琀 琀栀椀猀 眀椀氀氀 椀渀挀氀甀搀攀 琀栀攀 搀愀琀愀 昀漀爀 愀渀礀 搀攀氀攀琀攀搀 昀椀氀攀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀攀愀搀开氀漀最开戀礀开昀椀氀攀开椀搀崀  
਀      䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT਀ 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@transactionmessage nvarchar(300)  = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username ਀ऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
	                                          -- or alternatively if the file does not exist.  The result does not distinguish either. 	਀ 
	@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 昀椀氀攀 䤀䐀 椀猀 氀椀洀椀琀攀搀 琀漀 挀栀攀挀欀椀渀最 琀栀愀琀 漀渀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
 -- The log may contain records of file IDs that have since been deleted਀ ऀ ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀昀椀氀攀椀搀 
	   -- Check that the file id is valid਀ऀऀ 䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		    SET @fileid = NULL;਀ऀऀ 䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀  
		    BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NoFileID', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀✀⤀㬀ऀ 
			END਀         䔀䰀匀䔀 
          BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀ       䔀一䐀 
		 END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀  
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
-- ====================================================਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
		BEGIN TRY਀ 
			  SELECT ਀ऀऀऀ   
                     CONVERT(NVARCHAR(30), frl.date_time, 120) AS 'Read',਀ऀऀऀऀऀ 䤀匀一唀䰀䰀⠀昀爀氀⸀昀椀氀攀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
					 frl.read_by_username     AS 'System Username',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开猀椀搀开椀搀       䄀匀 ✀唀猀攀爀 䤀䐀✀ऀऀऀऀऀ  
਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开爀攀愀搀开氀漀最  䄀匀 昀爀氀 
			   WHERE frl.file_id = @fileid਀ऀऀऀ   伀刀䐀䔀刀 䈀夀 ✀刀攀愀搀✀ 䐀䔀匀䌀㬀 
	਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀攀愀搀开氀漀最开戀礀开昀椀氀攀渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 昀椀氀攀 爀攀愀搀 氀漀最 眀栀攀爀攀 琀栀攀 昀椀氀攀渀愀洀攀 椀渀挀氀甀搀攀猀 琀栀攀 最椀瘀攀渀 猀琀爀椀渀最⸀  伀渀氀礀 爀攀琀甀爀渀猀 昀椀氀攀猀 昀漀爀 眀栀椀挀栀  
-- the connected user has viewing rights to.  Note however that this will include the data for any deleted files.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_read_log_by_filename] ਀ 
	  @likestring nvarchar(max)        = '', ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ 
	@connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
			         frl.file_id              AS 'File ID',਀                     䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀爀氀⸀搀愀琀攀开琀椀洀攀Ⰰ ㄀㈀　⤀ 䄀匀 ✀刀攀愀搀✀Ⰰ 
					 ISNULL(frl.filename, '') AS 'Filename',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀     䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
					 frl.read_by_sid_id       AS 'User ID'					 ਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开爀攀愀搀开氀漀最  䄀匀 昀爀氀 
          INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀                  伀一 昀爀氀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
			   WHERE (frl.filename LIKE '%' + @likestring + '%' ESCAPE '\')਀ऀऀऀ   伀刀䐀䔀刀 䈀夀 ✀刀攀愀搀✀ 䐀䔀匀䌀㬀 
					  ਀ऀ 
	--=======================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				  ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ 
਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
 ਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_SEL_read_log_by_sid_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects records from the file read log for a given SID ID.  Only returns files for which ਀ⴀⴀ 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  一漀琀攀 栀漀眀攀瘀攀爀 琀栀愀琀 琀栀椀猀 眀椀氀氀 椀渀挀氀甀搀攀 琀栀攀 搀愀琀愀 昀漀爀 愀渀礀 搀攀氀攀琀攀搀 昀椀氀攀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀攀愀搀开氀漀最开戀礀开猀椀搀开椀搀崀  
਀      䀀甀猀攀爀开猀椀搀开椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT਀ 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@transactionmessage nvarchar(300)  = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username ਀ऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	@temp_userauth_status nchar(10)         = 'Fail',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
 -- Validation of the SID ID is limited to checking that one has been supplied.਀ ⴀⴀ 吀栀攀 氀漀最 洀愀礀 挀漀渀琀愀椀渀 爀攀挀漀爀搀猀 漀昀 匀䤀䐀 䤀䐀猀 琀栀愀琀 栀愀瘀攀 猀椀渀挀攀 戀攀攀渀 搀攀氀攀琀攀搀 昀爀漀洀 琀栀攀 匀䤀䐀 氀椀猀琀⸀   
 	 -- Validate @sidrecordid਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀椀搀 椀猀 瘀愀氀椀搀 
		 IF @user_sid_id = 0਀ऀऀ    匀䔀吀 䀀甀猀攀爀开猀椀搀开椀搀 㴀 一唀䰀䰀㬀 
		 IF @user_sid_id IS NULL ਀ऀऀ    䈀䔀䜀䤀一 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID');	਀ऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
					 frl.file_id         AS 'File ID',਀                     䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀爀氀⸀搀愀琀攀开琀椀洀攀Ⰰ ㄀㈀　⤀ 䄀匀 ✀刀攀愀搀✀Ⰰ 
					 ISNULL(frl.filename, '') AS 'Filename',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀 䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀ऀऀऀऀऀ  
਀ऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开爀攀愀搀开氀漀最  䄀匀 昀爀氀 
          INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀                  伀一 昀爀氀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  
			   WHERE frl.read_by_sid_id = @user_sid_id਀ऀऀऀ   伀刀䐀䔀刀 䈀夀 ✀刀攀愀搀✀ 䐀䔀匀䌀㬀 
	਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀攀愀搀开氀漀最开戀礀开甀猀攀爀渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 昀椀氀攀 爀攀愀搀 氀漀最 眀栀攀爀攀 琀栀攀 甀猀攀爀渀愀洀攀 椀渀挀氀甀搀攀猀 琀栀攀 最椀瘀攀渀 猀琀爀椀渀最⸀  伀渀氀礀 爀攀琀甀爀渀猀 昀椀氀攀猀 昀漀爀 眀栀椀挀栀  
-- the connected user has viewing rights to.  Note however that this will include the data for any deleted files.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_read_log_by_username] ਀ 
	  @likestring nvarchar(max)        = '', ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ 
	@connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
			         frl.file_id              AS 'File ID',਀                     䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀爀氀⸀搀愀琀攀开琀椀洀攀Ⰰ ㄀㈀　⤀ 䄀匀 ✀刀攀愀搀✀Ⰰ 
					 ISNULL(frl.filename, '') AS 'Filename',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀     䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
					 frl.read_by_sid_id       AS 'User ID'					 ਀ 
				FROM base.file_read_log  AS frl਀          䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
                  ON frl.file_id = perm.file_id ਀ऀऀऀ   圀䠀䔀刀䔀 昀爀氀⸀爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀ 䔀匀䌀䄀倀䔀 ✀尀✀ 
			   ORDER BY 'Read' DESC;਀ 
਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀攀愀搀开氀漀最开搀愀琀攀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 爀攀挀漀爀搀猀 昀爀漀洀 琀栀攀 昀椀氀攀 爀攀愀搀 氀漀最 眀栀攀爀攀 琀栀攀 眀栀攀爀攀 琀栀攀 搀愀琀攀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 搀愀琀攀猀⸀  伀渀氀礀 爀攀琀甀爀渀猀 昀椀氀攀猀 昀漀爀 眀栀椀挀栀  
-- the connected user has viewing rights to.  Note however that this will include the data for any deleted files.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开爀攀愀搀开氀漀最开搀愀琀攀开戀攀琀眀攀攀渀崀  
਀ऀ  䀀攀愀爀氀椀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀           㴀 一唀䰀䰀Ⰰ 
	  @later_date datetime             = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ 
	@connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ 
	      -- Check if the date value is valid਀ऀऀ  䤀䘀 ⠀䀀攀愀爀氀椀攀爀开搀愀琀攀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀攀愀爀氀椀攀爀开搀愀琀攀 㰀㸀 ✀✀⤀ 
		     BEGIN਀ऀऀऀ   䤀䘀 䤀匀䐀䄀吀䔀⠀䀀攀愀爀氀椀攀爀开搀愀琀攀⤀ 㰀㸀 ㄀ 
			      BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DateInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				  END਀ऀऀऀ 䔀一䐀 
		  ELSE SET @earlier_date = NULL;਀ 
		  		  IF (@later_date IS NOT NULL AND @later_date <> '')਀ऀऀ     䈀䔀䜀䤀一 
			   IF ISDATE(@later_date) <> 1਀ऀऀऀ      䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateInvalid.');਀ऀऀऀऀ  䔀一䐀 
			 END਀ऀऀ  䔀䰀匀䔀 匀䔀吀 䀀氀愀琀攀爀开搀愀琀攀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ  匀䔀䰀䔀䌀吀  
			         frl.file_id              AS 'File ID',਀                     䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀爀氀⸀搀愀琀攀开琀椀洀攀Ⰰ ㄀㈀　⤀ 䄀匀 ✀刀攀愀搀✀Ⰰ 
					 ISNULL(frl.filename, '') AS 'Filename',਀ऀऀऀऀऀ 昀爀氀⸀爀攀愀搀开戀礀开甀猀攀爀渀愀洀攀     䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
					 frl.read_by_sid_id       AS 'User ID'					 ਀ 
				FROM base.file_read_log  AS frl਀          䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
                  ON frl.file_id = perm.file_id ਀ऀऀऀ   圀䠀䔀刀䔀 昀爀氀⸀搀愀琀攀开琀椀洀攀 㰀 䀀氀愀琀攀爀开搀愀琀攀 䄀一䐀 昀爀氀⸀搀愀琀攀开琀椀洀攀 㸀 䀀攀愀爀氀椀攀爀开搀愀琀攀 
			   ORDER BY 'Read' DESC;਀ऀऀऀऀऀ  
	਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开猀椀搀开戀礀开甀猀攀爀渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects users from user_restr.sid_list where the name contains the given string.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus all records from the sid list.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_SEL_sid_by_username] ਀ 
	 @likestring nvarchar(128)         = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)     = '',     -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)      = 'Fail', ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transactionmessage2 nvarchar(300)   = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser or configurator or controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = @username + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀ 
   	  -- String validation  ਀ऀ  䤀䘀 䀀氀椀欀攀猀琀爀椀渀最 㴀 ✀✀  
		 SET @likestring = NULL;਀ऀ  䤀䘀 䀀氀椀欀攀猀琀爀椀渀最 䤀匀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoSearchString', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀攀愀爀挀栀匀琀爀椀渀最⸀✀⤀㬀 
		 END  ਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
	     SELECT   sid_id                          AS 'User ID',਀ऀऀ          䤀匀一唀䰀䰀⠀渀愀洀攀Ⰰ ✀✀⤀                䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
			      ISNULL(descr, '')               AS 'Description',਀ऀऀ          䤀匀一唀䰀䰀⠀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀            䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				  ISNULL(email_address, '')       AS 'Email Address',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ 
			FROM user_restr.sid_list AS sl਀ऀऀ   圀䠀䔀刀䔀 ⠀猀氀⸀甀猀攀爀渀愀洀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀⤀ ⴀⴀ 䘀椀氀琀攀爀 戀礀 䀀氀椀欀攀猀琀爀椀渀最 
                  OR (sl.name LIKE '%' + @likestring + '%')  ਀ऀऀऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀      
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀洀洀漀渀开漀戀樀开氀椀猀琀开椀琀攀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Input is common object list id, common object id, filter group  and position਀ⴀⴀ 䈀漀琀栀 搀愀琀愀 瘀愀氀甀攀猀 洀甀猀琀 戀攀 猀甀瀀瀀氀椀攀搀 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 挀栀愀渀最攀搀 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_common_obj_list_item] ਀ 
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @listposition int   	          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, CONVERT(nvarchar(10), @commonobjlistid), + @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
        IF @commonobjectid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, CONVERT(nvarchar(10), @commonobjectid), @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
				        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 
					      WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ            䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE com_obj.common_object_lists ਀ऀऀ    匀䔀吀 氀椀猀琀开瀀漀猀椀琀椀漀渀 㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
	    WHERE  common_object_list_id = @commonobjlistid਀ऀऀऀ    䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_common_object]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀攀挀漀爀搀 
-- Input is a record id, mnemonic, name, description and a common object attribute id.  ਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_common_object] ਀ 
     @recordid bigint	              = NULL,਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @objectname nvarchar(50)         = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @commonobjattrid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@xrefinvalidmessage nvarchar(200)       = '', -- Communicates that the foreign key is invalid਀        䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that no record id was supplied਀ऀऀ䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@notuniquemessage nvarchar(200)         = '', -- Communicates that the object name is not unique਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 刀攀挀漀爀搀 椀搀 挀栀攀挀欀 
	    IF @recordid = 0਀ऀऀ   匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		IF @recordid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @norecordidmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @recordid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @norecordidmessage = CONVERT(nvarchar(10), @recordid) + ' | ' + @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @norecordidmessage = 'A database level message error occurred on NotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀      ⴀⴀ 䔀渀搀 爀攀挀漀爀搀 䤀䐀 挀栀攀挀欀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
	  -- Includes checking if the name is null਀ऀ   
	   IF @objectname = ''਀ऀऀ  匀䔀吀 䀀漀戀樀攀挀琀渀愀洀攀 㴀 一唀䰀䰀㬀 
਀ऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
		 @mnem             = @mnemonic,਀ऀऀ 䀀愀琀琀爀开渀愀洀攀        㴀 䀀漀戀樀攀挀琀渀愀洀攀Ⰰ 
		 @descr            = @description,਀ऀऀ 䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
		 @messg            = @validationmessage OUTPUT;਀ऀ   䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
	      BEGIN਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			  SET @data_validation_status = 'Fail';਀ऀऀ  䔀一䐀 
਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
		 AND EXISTS (SELECT common_object_id਀ऀऀऀऀऀ   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 
					  WHERE object_name = @objectname਀ऀऀऀऀऀऀऀ䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀漀戀樀攀挀琀渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
਀ 
		 -- Check the common object attribute reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀 㴀 　 
		   SET @commonobjattrid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		   BEGIN਀ऀऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			                  FROM com_obj.common_object_attributes਀ऀऀऀऀऀऀ      圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'ComObjAttrNotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀⤀ ⬀ ✀ 簀 ✀ ⬀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀砀爀攀昀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䄀琀琀爀一漀琀䔀砀椀猀琀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ 
		   END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
		    SET mnem        = ISNULL(@mnemonic, ''),਀ऀऀऀ    漀戀樀攀挀琀开渀愀洀攀 㴀 䀀漀戀樀攀挀琀渀愀洀攀Ⰰ 
				description = ISNULL(@description, ''),   ਀ऀऀऀऀ挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀愀琀琀爀椀搀 
          WHERE com_obj.common_objects.common_object_id = @recordid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
	IF (@xrefinvalidmessage <> '')         SET @message = @message + ' | ' + @xrefinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_contr_doc_group_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 琀漀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Input is a document id, a controller level document group ID and notes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @recordid bigint                 = NULL,਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		  -- Data validation਀ 
		 IF @documentid = ''਀ऀऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
				   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
						@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have permission to access it or edit it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'NoDocIDAccess', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀  
						 END਀ऀऀऀऀ䔀一䐀 
਀ 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	 -- This also returns fail if the id does not exist਀    䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开挀漀渀琀开搀漀挀开最爀瀀崀 
	     @contr_doc_grp_to_check = @recordid,਀ऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀瘀愀氀椀搀䌀漀渀䐀漀挀䜀爀瀀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidConDocGrp');਀ऀऀ䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
  IF @data_validation_status = 'Pass'਀  ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT controller_doc_group_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀  
							 WHERE controller_doc_group_name_id = @recordid਀ऀऀऀऀऀऀऀ       䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
  ਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀  
		    SET notes = @inputnotes਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
			    AND controller_doc_group_name_id = @recordid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开挀漀渀琀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a file to controller level file group link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 昀椀氀攀 最爀漀甀瀀 䤀䐀 愀渀搀 渀漀琀攀猀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_contr_file_group_link]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @inputnotes nvarchar(max)        = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ 
  -- Authenticate the connected users for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀ 
  IF @tempuserauth_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ 䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 漀爀 攀搀椀琀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message , ' | ', 'File ID: ', CONVERT(nvarchar(10), @fileid), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileIDAccess.'); ਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
		 SET @recordid = NULL;਀ 
	 -- Authenticate the user for the given controller level file group਀ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
    EXEC [internal].[usp_AUTHENTICATE_cont_file_grp]਀ऀ     䀀挀漀渀琀爀开昀椀氀攀开最爀瀀开琀漀开挀栀攀挀欀 㴀 䀀爀攀挀漀爀搀椀搀Ⰰ 
		 @user_authentication_result_cep = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'InvalidConFileGrp', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䌀漀渀䘀椀氀攀䜀爀瀀✀⤀㬀 
		END਀ 
  -- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
  		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
							  FROM xref.controller_file_group_links ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀 
							       AND file_id = @fileid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀   
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE xref.controller_file_group_links ਀ऀऀ    匀䔀吀 渀漀琀攀猀 㴀 䀀椀渀瀀甀琀渀漀琀攀猀 
		  WHERE file_id = @fileid਀ऀऀऀ    䄀一䐀 挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10), ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_dc_gp_ed_prm_fct_notes]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Updates notes for a specific document group and function list ID in the database.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - ``@docgroupid bigint``: Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 怀怀䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀怀怀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - ``@inputnotes nvarchar(max)``: Can be a string including empty or null.਀⨀ 
* **Return Values:**਀⨀ 
* - ``@message nvarchar(1000) OUTPUT``: Descriptive status message of the procedure's execution.਀⨀ ⴀ 怀怀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀怀怀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing @docgroupid, @functionlistid, or non-existing record in database.਀⨀ ⴀ 唀瀀搀愀琀攀 伀瀀攀爀愀琀椀漀渀 䘀愀椀氀㨀 䤀渀 挀愀猀攀 漀昀 愀渀 攀砀挀攀瀀琀椀漀渀 搀甀爀椀渀最 琀栀攀 甀瀀搀愀琀攀Ⰰ 爀攀琀甀爀渀猀 愀渀 攀爀爀漀爀 洀攀猀猀愀最攀 眀椀琀栀 搀攀琀愀椀氀猀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䴀漀搀椀昀椀攀猀 琀栀攀 ✀渀漀琀攀猀✀ 挀漀氀甀洀渀 椀渀 ✀甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - Both @docgroupid and @functionlistid must be provided and valid.਀⨀ ⴀ 吀栀攀爀攀 洀甀猀琀 戀攀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 洀愀琀挀栀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀 愀渀搀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 䤀昀 猀甀挀挀攀猀猀昀甀氀Ⰰ 琀栀攀 ✀渀漀琀攀猀✀ 挀漀氀甀洀渀 椀猀 甀瀀搀愀琀攀搀 昀漀爀 琀栀攀 猀瀀攀挀椀昀椀攀搀 爀攀挀漀爀搀⸀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀挀开最瀀开攀搀开瀀爀洀开昀挀琀开渀漀琀攀猀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @functionlistid bigint           = NULL,  -- User duty function list id਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 攀渀琀爀礀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)       = '',਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@recordnotexistmessage nvarchar(200) = '',     -- Communicates that the document group id has already been linked to that document਀ऀऀ䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@nofunctionlistidmsg nvarchar(200)   = '',     -- Communicates that no function list ID was supplied਀ऀऀ䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 爀椀最栀琀猀 琀漀 椀琀 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ     䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　  
		    SET @docgroupid = NULL;਀ऀऀ 䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoDocGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀ     䔀䰀匀䔀 
			 -- Authenticate the user for the given document group਀ऀऀऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 渀攀最愀琀椀瘀攀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			  EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀऀऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 
					@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN  -- The user does not have permission for this action਀ऀऀऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'NoDocGroupPermission', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最 㴀 ✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀㨀 ✀ ⬀ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
				END		   ਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @functionlistid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @functionlistid IS NULL  ਀ऀ     䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @nofunctionlistidmsg  = @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				SET @nofunctionlistidmsg  = 'A database level message error occurred on NoDocGroupId';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
				   	          FROM user_restr.doc_group_edit_perm_funct_lst ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						           AND function_list_id = @functionlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @recordnotexistmessage = @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
					SET @recordnotexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the update query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE user_restr.doc_group_edit_perm_funct_lst਀ऀऀ    匀䔀吀 渀漀琀攀猀 㴀 䀀椀渀瀀甀琀渀漀琀攀猀 
		  WHERE         doc_group_id = @docgroupid਀ऀऀऀ    䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀㬀 
	IF (@recordnotexistmessage <> '')      SET @message = @message + ' | ' + @recordnotexistmessage;਀ऀ䤀䘀 ⠀䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最㬀 
    IF (@transactionmessage2 <> '')        SET @message = @message + ' | ' + @transactionmessage2;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nofunctionlistidmsg <> '')        SET @message = @message + ' | ' + @nofunctionlistidmsg;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_dc_gp_ed_prm_ppl_notes]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Updates notes for a specific document group and people list ID in the database.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - ``@docgroupid bigint``: Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 怀怀䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀怀怀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - ``@inputnotes nvarchar(max)``: Can be a string including empty or null.਀⨀ 
* **Return Values:**਀⨀ 
* - ``@message nvarchar(1000) OUTPUT``: Descriptive status message of the procedure's execution.਀⨀ ⴀ 怀怀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀怀怀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing @docgroupid, @peoplelistid, or non-existing record in database.਀⨀ ⴀ 唀瀀搀愀琀攀 伀瀀攀爀愀琀椀漀渀 䘀愀椀氀㨀 䤀渀 挀愀猀攀 漀昀 愀渀 攀砀挀攀瀀琀椀漀渀 搀甀爀椀渀最 琀栀攀 甀瀀搀愀琀攀Ⰰ 爀攀琀甀爀渀猀 愀渀 攀爀爀漀爀 洀攀猀猀愀最攀 眀椀琀栀 搀攀琀愀椀氀猀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䴀漀搀椀昀椀攀猀 琀栀攀 ✀渀漀琀攀猀✀ 挀漀氀甀洀渀 椀渀 ✀甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - Both @docgroupid and @peoplelistid must be provided and valid.਀⨀ ⴀ 吀栀攀爀攀 洀甀猀琀 戀攀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 洀愀琀挀栀椀渀最 䀀搀漀挀最爀漀甀瀀椀搀 愀渀搀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 䤀昀 猀甀挀挀攀猀猀昀甀氀Ⰰ 琀栀攀 ✀渀漀琀攀猀✀ 挀漀氀甀洀渀 椀猀 甀瀀搀愀琀攀搀 昀漀爀 琀栀攀 猀瀀攀挀椀昀椀攀搀 爀攀挀漀爀搀⸀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀挀开最瀀开攀搀开瀀爀洀开瀀瀀氀开渀漀琀攀猀崀  
਀     䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䐀漀挀甀洀攀渀琀 最爀漀甀瀀  
	 @peoplelistid bigint             = NULL,  -- User duty function list id਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 攀渀琀爀礀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		 IF @docgroupid = 0਀ऀऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		 IF @docgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupId');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ऀऀ   䈀䔀䜀䤀一 
			 -- Authenticate the user for the given document group਀ऀऀऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 渀攀最愀琀椀瘀攀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			  EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀऀऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 
					@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN  -- The user does not have permission for this action਀ऀऀऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'NoDocGroupPermission', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
				END਀ऀ        䔀一䐀 
਀ 
      -- Check the people list id has been supplied਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀   
	     BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ऀऀ 䔀䰀匀䔀 
	        BEGIN -- Check the people list exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				                  FROM people.people_list_names਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'PeopleListIDInvalid', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ    䔀一䐀 
਀ 
      -- Check if a matching record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
				   	          FROM user_restr.doc_group_edit_perm_people_lst ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀         搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀 
						           AND people_list_id = @peoplelistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the update query਀  䤀䘀 䀀椀渀瀀甀琀渀漀琀攀猀 䤀匀 一唀䰀䰀 匀䔀吀 䀀椀渀瀀甀琀渀漀琀攀猀 㴀 ✀✀㬀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE user_restr.doc_group_edit_perm_people_lst਀ऀऀ    匀䔀吀 渀漀琀攀猀 㴀 䀀椀渀瀀甀琀渀漀琀攀猀 
		  WHERE         doc_group_id = @docgroupid਀ऀऀऀ    䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		        CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END -- End IF @transaction_ready = 'Ready'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开最爀漀甀瀀开渀愀洀攀开爀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 洀渀攀洀漀渀椀挀Ⰰ 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀  
-- for the xref.doc_group_names table.  Only applies for records਀ⴀⴀ 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 攀瘀攀渀 椀昀 漀渀氀礀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Output is a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开最爀漀甀瀀开渀愀洀攀开爀猀琀爀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ  
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀ ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@nodocgroup_permissionmsg nvarchar(200)	= '', -- Communicates that the user does not have permission to modify the document group		਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
	 -- Authenticate the user for the given document group਀ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 渀攀最愀琀椀瘀攀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	  EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀爀攀挀漀爀搀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoDocGroupPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀洀猀最 㴀  䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀爀攀挀漀爀搀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀ 簀 ✀  ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @recordid = 0਀ऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id has been supplied਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
਀ 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开最爀漀甀瀀开椀搀 
					   FROM xref.doc_group_names਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND doc_group_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @notuniquemessage = LEFT(@attribute_name, 10) + '... | ' + @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				  SET @notuniquemessage = 'A database level message error occurred on NameNotUnique';਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @attribute_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀  
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀  
		    SET      mnem = @mnemonic,਀ऀऀऀ    愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ  
				    descr = @description਀ऀऀ  圀䠀䔀刀䔀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀ऀ䤀䘀 ⠀䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nodocgroup_permissionmsg <> '')   SET @message = @message + ' | ' + @nodocgroup_permissionmsg;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_duty_function]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
-- Input is mnemonic, name and description ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @mnemonic nvarchar(10): Can be null.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 眀栀椀挀栀  
* - is not a duplicate of a different record.਀⨀ ⴀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Updates a record in people.duty_functions ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀开渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_duty_function] ਀ 
     @recordid bigint                 = NULL,਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ              
	 @function_name nvarchar(50)      = '',਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 ✀✀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @recordid = 0਀ऀऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions AS df਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
	  -- Attribute name must be unique. Only perform this check if the id is valid.  Otherwise a NameNoteUnique error may be misleading.਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	     AND EXISTS (SELECT df.name਀ऀऀऀ   ऀ       䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
				      WHERE df.name = @function_name਀ऀऀऀऀ            䄀一䐀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀昀甀渀挀琀椀漀渀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀⸀✀⤀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀昀甀渀挀琀椀漀渀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀⤀㬀  
				  SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
		    SET mnem        = @mnemonic,਀ऀऀऀ    渀愀洀攀        㴀 䀀昀甀渀挀琀椀漀渀开渀愀洀攀Ⰰ 
				description = @description਀ऀऀ  圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_duty_function_sid_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 挀漀氀甀洀渀 漀昀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 
-- Input is a function id, sid list id and notes ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 挀漀氀甀洀渀 漀昀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀椀搀㨀  䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 搀甀琀礀开昀甀渀挀琀椀漀渀猀 琀愀戀氀攀⸀ 一漀琀 瀀攀爀洀椀琀琀攀搀 琀漀 戀攀 攀洀瀀琀礀 漀爀 一唀䰀䰀 
* - @sidrecordid: Must be a valid id from the sid_list table. Not permitted to be empty or NULL਀⨀ ⴀ 䀀渀漀琀攀猀㨀 伀瀀琀椀漀渀愀氀 
* - The pair @functionid and @sidrecordid must be exist in the table਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 挀漀氀甀洀渀 漀昀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_duty_function_sid_link] ਀ 
     @functionid bigint               = NULL,਀ऀ 䀀猀椀搀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ             ⴀⴀ 䄀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 猀椀搀开氀椀猀琀 琀愀戀氀攀Ⰰ 渀漀琀 愀渀 愀挀琀甀愀氀 匀䤀䐀 
	 @inputnotes nvarchar(max)        = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 
		  IF @functionid = 0਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ 
਀ऀ ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀猀椀搀爀攀挀漀爀搀椀搀 
	   -- Check that the sid has been supplied਀ऀऀ 䤀䘀 䀀猀椀搀爀攀挀漀爀搀椀搀 㴀 　 
		    SET @sidrecordid = NULL;਀ऀऀ 䤀䘀 䀀猀椀搀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀  
		    BEGIN਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NoUserSidID', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀唀猀攀爀匀椀搀䤀䐀✀⤀㬀ऀ 
			END਀ 
਀     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	 IF @data_validation_status = 'Pass'਀ऀ    䄀一䐀 一伀吀 䔀堀䤀匀吀匀  
				(SELECT dfsl.function_id਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
				  WHERE dfsl.function_id = @functionid਀ऀऀऀऀऀऀ䄀一䐀 搀昀猀氀⸀猀椀搀开椀搀  㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀ 
			BEGIN -- Record already exists਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						@message_id = 'NotExist',਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE people.duty_function_sid_links਀            匀䔀吀 渀漀琀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀椀渀瀀甀琀渀漀琀攀猀Ⰰ ✀✀⤀ 
		  WHERE function_id = @functionid ਀ऀऀ        䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀        匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date:   07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀   唀瀀搀愀琀攀猀 愀渀 攀砀椀猀琀椀渀最 昀椀氀攀 最爀漀甀瀀 渀愀洀攀 
-- by updating a record in file_group_names.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 瀀愀爀愀洀攀琀攀爀猀 昀漀爀 愀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀㨀 
-- record ID, mnemonic, name, description.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀⼀⨀⨀ 
* Updates an existing file group name record.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @recordid bigint: ID of the record to update.਀⨀ ⴀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
* - @attribute_name nvarchar(50): Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀㨀 䌀愀渀 戀攀 渀甀氀氀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 漀爀 椀渀瘀愀氀椀搀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 漀爀 椀昀 琀栀攀 䀀爀攀挀漀爀搀椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
* - Uniqueness Validation Fail: Returns message if @attribute_name is not unique.਀⨀ 
* **Side Effects:**਀⨀ 
* - Updates a record in 'xref.file_group_names' table if all conditions are met.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 甀渀椀焀甀攀⸀ 
* - @recordid must correspond to an existing record.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀崀  
     @recordid bigint                 = NULL,਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
     @attribute_name nvarchar(50)     = '',਀     䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
     @message nvarchar(1000)          = '' OUTPUT,਀     䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
    SET NOCOUNT ON;਀ 
    DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀        䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 
        @tempmessage nvarchar(300)           = '',਀        䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀        䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀    ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
    EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
        @user_authentication_result = @userauthentication_status OUTPUT;਀    䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀䘀愀椀氀✀㬀 
        EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
            @message_text = @tempmessage OUTPUT;਀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
    END਀ 
    -- Data validation਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
	BEGIN਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
			 SET @recordid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @recordid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT fgn.file_group_id਀ऀऀऀ                 䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
							WHERE fgn.file_group_id = @recordid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ 
      ਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀Ⰰ 甀渀氀攀猀猀 椀琀 洀愀琀挀栀攀猀 琀栀攀 攀砀椀猀琀椀渀最 漀渀攀 昀漀爀 琀栀愀琀 爀攀挀漀爀搀 椀搀 
	  IF @data_validation_status = 'Pass' ਀ऀऀ 䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
					   FROM xref.file_group_names AS fgn਀ऀऀऀऀऀ  圀䠀䔀刀䔀 愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀 
							AND file_group_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(' | ', @message, ' | ', LEFT(@attribute_name, 10), '... | ',  @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique.');਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @attribute_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
				  SET @message = CONCAT_WS(' |', @message, @validationmessage); ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ऀऀऀⴀⴀ 唀瀀搀愀琀攀 琀栀攀 爀攀挀漀爀搀 
			IF @transaction_ready = 'Ready'਀ऀऀऀ䈀䔀䜀䤀一 
				BEGIN TRY਀ऀऀऀऀऀ唀倀䐀䄀吀䔀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 
					SET mnem      = ISNULL(@mnemonic, mnem),਀ऀऀऀऀऀऀ愀琀琀爀开渀愀洀攀 㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
						descr     = ISNULL(@description, descr)਀ऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀 
਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀऀऀ䔀一䐀 吀刀夀 
				BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 
					CONVERT(nvarchar(10), ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀऀऀ䔀一䐀 䌀䄀吀䌀䠀 
			END਀ऀ䔀一䐀  ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀氀开最瀀开攀搀开瀀爀洀开昀挀琀开渀漀琀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the notes column of a record from user_restr.file_group_edit_perm_funct_lst. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀Ⰰ 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 䤀䐀 愀渀搀 渀漀琀攀猀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Updates the notes of a record for a funcion list to edit metadata for files within a file group਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @inputnotes nvarchar(max)  May be empty or null਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid file group ID or function list ID.਀⨀ 
* **Side Effects:**਀⨀ 
* - Updates the notes of a record in 'user_restr.file_group_edit_perm_funct_lst' table if all conditions are met.਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 愀渀搀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 愀渀搀 洀甀猀琀 洀愀琀挀栀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fl_gp_ed_prm_fct_notes] ਀ 
     @filegroupid bigint              = NULL,             -- File group ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ          ⴀⴀ 唀猀攀爀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	 @inputnotes nvarchar(max)        = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL; -- Check if a file group ID has been supplied਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀䐀✀⤀㬀 
		   END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	     IF @functionlistid = 0਀ऀऀ    匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @functionlistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID');਀ऀऀ   䔀一䐀 
਀ 
      -- Check if a matching record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				   	          FROM user_restr.file_group_edit_perm_funct_lst ਀ऀऀऀऀऀऀ     圀䠀䔀刀䔀        昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀 
						           AND function_list_id = @functionlistid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF userauthentication_status = Pass.਀ 
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE user_restr.file_group_edit_perm_funct_lst਀ऀऀ    匀䔀吀 渀漀琀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀椀渀瀀甀琀渀漀琀攀猀Ⰰ ✀✀⤀ 
		  WHERE     file_group_id    = @filegroupid਀ऀऀ        䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fl_gp_ed_prm_ppl_notes]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 挀漀氀甀洀渀 漀昀 愀 爀攀挀漀爀搀 昀爀漀洀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀⸀  
-- Input is a file group ID, a people list ID and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 漀昀 愀 爀攀挀漀爀搀 昀漀爀 愀 昀甀渀挀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 洀攀琀愀搀愀琀愀 昀漀爀 昀椀氀攀猀 眀椀琀栀椀渀 愀 昀椀氀攀 最爀漀甀瀀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @peoplelistid bigint Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀  䴀愀礀 戀攀 攀洀瀀琀礀 漀爀 渀甀氀氀 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 漀爀 椀渀瘀愀氀椀搀 昀椀氀攀 最爀漀甀瀀 䤀䐀 漀爀 瀀攀漀瀀氀攀 氀椀猀琀 䤀䐀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 漀昀 愀 爀攀挀漀爀搀 椀渀 ✀甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀✀ 琀愀戀氀攀 椀昀 愀氀氀 挀漀渀搀椀琀椀漀渀猀 愀爀攀 洀攀琀⸀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
* - @filegroupid and @peoplelistid must be provided and be valid and must match an existing record਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀氀开最瀀开攀搀开瀀爀洀开瀀瀀氀开渀漀琀攀猀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ           ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @peoplelistid bigint             = NULL,          -- User people list id਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	     IF @filegroupid = 0਀ऀऀ    匀䔀吀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 IF @filegroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀椀氀攀䜀爀漀甀瀀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileGroupID');਀ऀऀ   䔀一䐀 
਀ 
      -- Check the people list id has been supplied਀ऀ     䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
		    SET @peoplelistid = NULL; -- Check if a file group ID has been supplied਀ऀऀ 䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
		   END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT file_group_id਀ऀऀऀऀ   ऀ          䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀  
						     WHERE      file_group_id = @filegroupid਀ऀऀऀऀऀऀ           䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
			   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		 	SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 
		    SET notes = ISNULL(@inputnotes, '')਀ऀऀ  圀䠀䔀刀䔀     昀椀氀攀开最爀漀甀瀀开椀搀  㴀 䀀昀椀氀攀最爀漀甀瀀椀搀 
		        AND people_list_id = @peoplelistid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ ऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀挀开挀开漀戀开洀猀开搀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 挀漀洀洀漀渀 漀戀樀攀挀琀⸀  
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_dc_c_ob_ms_def]਀ 
     @formid bigint                   = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		           ELSE ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ 
    -- Check if a record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                   FROM forms.form_doc_com_obj_ms_defaults਀ऀऀऀऀऀ      圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					            AND common_object_id = @commonobjectid਀ऀऀऀऀऀऀऀऀ䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check new parameter਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @newcommonobjectid = 0਀ऀऀ   匀䔀吀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @newcommonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀愀椀爀 攀砀椀猀琀猀 
		  IF @newcommonobjectid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀  
								 WHERE    common_object_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
								   AND    common_object_list_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
							  BEGIN਀ऀऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
									SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							  END਀ 
			 END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT common_object_list_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀 
					      WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
							AND form_id = @formid਀ऀऀऀऀऀऀऀ䄀一䐀       䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
							    <> @newcommonobjectid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀  
		    SET       common_object_id ਀ऀऀऀऀ㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
		  WHERE form_id = @formid਀ऀऀ    䄀一䐀    挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			    = @commonobjlistid਀ऀऀ    䄀一䐀    挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
			    = @commonobjectid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_dc_c_ob_ms_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a document common object list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀挀开挀开漀戀开洀猀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @commonobjlistid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
	    SET @commonobjlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @commonobjlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE common_object_list_id = @commonobjlistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀ       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀 
						      WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ    䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀  
		   SET mandatory = @ismandatory,਀ऀऀ          氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
				position = ISNULL(@formposition, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			  attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
	     WHERE form_id = @formid AND common_object_list_id = @commonobjlistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀挀开挀开漀戀开爀戀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a common object list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_dc_c_ob_rb_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @defcommonobjid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
	    SET @commonobjlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @commonobjlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE common_object_list_id = @commonobjlistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
	-- Check the default common object id reference਀ऀ    䤀䘀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 㴀 　 
		   SET @defcommonobjid = NULL;਀ऀऀ   䤀䘀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 䤀匀 一伀吀 一唀䰀䰀  
			AND NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @defcommonobjid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, CONVERT(nvarchar(10), @defcommonobjid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefaultInvalid.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀ       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 
						      WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ    䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀  
		   SET mandatory = @ismandatory,਀ऀऀ          氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
				position = ISNULL(@formposition, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			  attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀Ⰰ 
default_common_object_id = @defcommonobjid਀ऀ     圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_doc_bk_id_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and base.document_id_list.booking_id. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开戀欀开椀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀   ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_booking_id_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开椀搀开氀椀渀欀猀 
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开戀欀开猀琀愀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最⸀戀漀漀欀椀渀最开猀琀愀琀甀猀⸀  
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_doc_bk_stat_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
   		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀 
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_doc_booking_status_links਀ऀऀऀ    匀䔀吀    氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_doc_bk_usrid_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and base.document_id_list.user_id. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开戀欀开甀猀爀椀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀   ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_booking_user_id_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀开椀搀开氀椀渀欀猀 
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开戀欀开甀猀爀渀洀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀猀礀猀琀攀洀开甀猀攀爀渀愀洀攀⸀  
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_doc_bk_usrnm_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
   		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀 
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_doc_booking_usernm_links਀ऀऀऀ    匀䔀吀    氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_doc_bkg_cmts_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and base.document_id_list.comments. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开戀欀最开挀洀琀猀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀   ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_booking_comnts_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开挀漀洀渀琀猀开氀椀渀欀猀 
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开戀欀最开搀愀琀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀戀漀漀欀椀渀最开搀愀琀攀⸀  
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_doc_bkg_date_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
   		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀 
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_doc_booking_date_links਀ऀऀऀ    匀䔀吀    氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_doc_bkg_rel_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and base.document_id_list.release_number. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开戀欀最开爀攀氀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀   ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_booking_release_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀 
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开挀爀琀搀开戀礀开椀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀ⴀ挀爀攀愀琀攀搀ⴀ戀礀ⴀ椀搀 昀椀攀氀搀⸀ 
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_doc_crtd_by_id_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
   		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_doc_created_by_id_links਀ऀऀऀ    匀䔀吀    氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_doc_crtd_by_nm_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Updates a link between a form and a document-created-by-name field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开挀爀琀搀开戀礀开渀洀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀   ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_created_by_nm_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀 
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开昀甀渀挀琀开氀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 氀椀渀欀攀搀 琀漀 搀漀挀甀洀攀渀琀 昀甀渀挀琀椀漀渀 氀椀猀琀猀⸀ 
-- Input is a form id and general field name id plus other attribute fields to be updated.਀ⴀⴀ 吀栀椀猀 甀猀瀀 椀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀猀 ⠀愀猀 漀瀀瀀漀猀攀搀 琀漀 挀漀渀昀椀最甀爀愀琀漀爀猀⤀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开搀漀挀开昀甀渀挀琀开氀猀琀开氀椀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint          = NULL, ਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
						        WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_fl_c_ob_ms_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file common object list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开昀氀开挀开漀戀开洀猀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @commonobjlistid bigint          = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @commonobjlistid = 0 ਀ऀ    匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if list id has been supplied਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
							  FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
						       FROM forms.form_file_com_obj_ms_lst_links਀ऀऀऀऀऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								    AND common_object_list_id = @commonobjlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    UPDATE forms.form_file_com_obj_ms_lst_links ਀ऀऀ   匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
		          length = @fieldlength,਀ऀऀऀऀ瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
			  attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			  attribute3 = ISNULL(@attribute3, '')਀ऀ     圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开昀氀开挀开漀戀开爀戀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a common object list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_fl_c_ob_rb_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @defcommonobjid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　  
	    SET @commonobjlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @commonobjlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE common_object_list_id = @commonobjlistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
	-- Check the default common object id reference਀ऀ    䤀䘀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 㴀 　 
		   SET @defcommonobjid = NULL;਀ऀऀ   䤀䘀 䀀搀攀昀挀漀洀洀漀渀漀戀樀椀搀 䤀匀 一伀吀 一唀䰀䰀  
			AND NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @defcommonobjid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, CONVERT(nvarchar(10), @defcommonobjid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefaultInvalid.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀऀऀऀऀ       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 
						      WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ    䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				BEGIN -- Record already exists਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀  
		   SET mandatory = @ismandatory,਀ऀऀ          氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
				position = ISNULL(@formposition, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			  attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀Ⰰ 
default_common_object_id = @defcommonobjid਀ऀ     圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开昀氀开挀漀洀开漀戀樀开洀猀开搀攀昀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 21-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 搀攀昀愀甀氀琀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 挀漀洀洀漀渀 漀戀樀攀挀琀⸀  
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_fl_com_obj_ms_def]਀ 
     @formid bigint                   = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		           ELSE ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀 
					      WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ            䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
								AND form_id = @formid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
--=============================================਀ⴀⴀ 䌀栀攀挀欀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
਀ 
	-- Check the common object id reference਀ऀऀ䤀䘀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀ 
          -- Check that the multi-select attribute and multi-select list id pair exists਀ऀऀ  䤀䘀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
								  FROM com_obj.common_object_lists ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
								       = @newcommonobjectid਀ऀऀऀऀऀऀऀऀ   䄀一䐀    挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
								       = @commonobjlistid) ਀ऀऀऀऀऀऀऀ  䈀䔀䜀䤀一 
									EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ  
										@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
										SET @message = CONCAT(@message, ' | ', ' List ID: ', CONVERT(nvarchar(10), @commonobjlistid), '  Object ID: ', CONVERT(nvarchar(10), @newcommonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidListItem.');਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
									SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀ  䔀一䐀 
਀ऀऀऀ 䔀一䐀 
਀ 
    -- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                   FROM forms.form_file_com_obj_ms_defaults਀ऀऀऀऀऀ      圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					        AND common_object_id = @newcommonobjectid਀ऀऀऀऀऀऀऀ䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
						    AND    @commonobjectid  ਀ऀऀऀऀऀऀऀ    㰀㸀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
--==============================================਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE forms.form_file_com_obj_ms_defaults ਀ऀऀ    匀䔀吀    挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			    = @commonobjlistid,਀ऀऀऀ          挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
				= @newcommonobjectid਀ऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
		    AND    common_object_list_id ਀ऀऀऀ    㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
		    AND    common_object_id ਀ऀऀऀ    㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开昀氀开挀爀琀搀开戀礀开椀搀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀ⴀ挀爀攀愀琀攀搀ⴀ戀礀ⴀ椀搀 昀椀攀氀搀⸀ 
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_fm_fl_crtd_by_id_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
   		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀  
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_created_by_id_links ਀ऀऀऀ    匀䔀吀    氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_fm_fl_crtd_by_nm_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Updates a link between a form and a file-created-by-name field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开昀氀开挀爀琀搀开戀礀开渀洀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀   ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_file_created_by_nm_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀  
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开昀氀开昀甀渀挀琀开氀猀琀开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 昀椀攀氀搀⸀ 
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 吀栀椀猀 甀猀瀀 椀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀猀 ⠀愀猀 漀瀀瀀漀猀攀搀 琀漀 挀漀渀昀椀最甀爀愀琀漀爀猀⤀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀洀开昀氀开昀甀渀挀琀开氀猀琀开氀椀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @genfield_nameid bigint          = NULL,  ਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
						        WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid਀ऀ            䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_created_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Updates a link between a form and a doc created field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀   ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_created_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀  
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开搀愀琀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 17-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 昀椀攀氀搀⸀  
-- Input is a form id and a document date field id plus other attribute fields to be updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_doc_date_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(300)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 搀愀琀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied doc date field id does not exist਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@dateformat nchar(3)                    = 'dmy',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  匀䔀吀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
  SET @username = SUSER_SNAME(@connectedusersid);਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 　  
	    SET @docdatenameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 搀愀琀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docdatenameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A doc date field id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE doc_date_name_id = @docdatenameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
							     FROM forms.form_doc_date_field_links਀ऀऀऀऀऀऀऀ    圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								      AND doc_date_name_id = @docdatenameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀猀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @norecordmessage = @tempmessage;਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
								SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @transactionmessage = @tempmessage;਀ऀऀऀ䔀䰀匀䔀  
				SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_doc_date_field_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
				   attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀऀ   愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
				   attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_free_text_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㄀㜀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Update a link between a form and a document free text field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docfreetextnameid bigint        = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ()਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@noformidmessage nvarchar(200)          = '', -- Communicates that a form id has not been supplied਀ऀऀ䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattrnameidmessage nvarchar(200)      = '', -- Communicates that a doc free text field id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordnotexistmessage nvarchar(200)    = '', -- Communicates that a matching record does not exist਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @docfreetextnameid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc free text field id has been supplied਀ऀ 䤀䘀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the attribute id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
							  FROM doc_attr.doc_free_text_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
						       FROM forms.form_doc_free_text_field_links਀ऀऀऀऀऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								    AND doc_free_text_name_id = @docfreetextnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordnotexistmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordnotexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    UPDATE forms.form_doc_free_text_field_links ਀ऀऀ   匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
		          length = @fieldlength,਀ऀऀऀऀ瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
			  attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			  attribute3 = ISNULL(@attribute3, '')਀ऀ     圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀昀爀攀攀琀攀砀琀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开椀渀琀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 23-11-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 昀椀攀氀搀⸀  
-- Input is a form id and a document integer field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_doc_int_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(300)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 椀渀琀攀最攀爀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied doc integer field id does not exist਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @docintnameid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc integer field id has been supplied਀ऀ 䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀渀琀攀最攀爀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the attribute id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 
							  FROM doc_attr.doc_integer_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 
						       FROM forms.form_doc_integer_field_links਀ऀऀऀऀऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								    AND doc_int_name_id = @docintnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordnotexistmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordnotexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    UPDATE forms.form_doc_integer_field_links ਀ऀऀ   匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
		          length = @fieldlength,਀ऀऀऀऀ瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
			  attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			  attribute3 = ISNULL(@attribute3, '')਀ऀ     圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开氀漀挀欀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 氀漀挀欀 猀琀愀琀甀猀 昀椀攀氀搀⸀ 
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 吀栀椀猀 甀猀瀀 椀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀猀 ⠀愀猀 漀瀀瀀漀猀攀搀 琀漀 挀漀渀昀椀最甀爀愀琀漀爀猀⤀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开氀漀挀欀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_lock_status_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开氀漀挀欀开猀琀愀琀甀猀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ   
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_ms_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ㄀㄀ⴀ㈀　㈀㌀ 
-- Description:	Updates a link between a form and a document multi-select list. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开洀猀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @docmslistid bigint              = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied doc multi-select list id does not exist਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  匀䔀吀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
  SET @username = SUSER_SNAME(@connectedusersid);਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　  
	    SET @docmslistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docmslistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrListID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A doc multi-select list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_ms_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_ms_list_id = @docmslistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrListNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT doc_ms_list_id਀ऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 
						  WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ䄀一䐀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀  
		   SET mandatory = @ismandatory,਀ऀऀ          氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
				position = ISNULL(@formposition, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			  attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
	     WHERE form_id = @formid AND doc_ms_list_id = @docmslistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ऀ䤀䘀 ⠀䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀瀀攀爀洀椀猀猀椀漀渀洀猀最㬀 
    IF (@ismandinvalidmessage <> '')       SET @message = @message + ' | ' + @ismandinvalidmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_doc_multi_sel_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Deletes a default document multi-select object. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀崀 
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @docmslistid bigint              = NULL,਀ऀ 䀀搀漀挀洀猀愀琀琀爀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @newdocmsattrid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ           䔀䰀匀䔀  
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
    -- Check if a record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀 
		                   FROM forms.form_doc_multi_sel_defaults਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
					        AND doc_ms_attr_id = @docmsattrid਀ऀऀऀऀऀऀऀ䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check the new parameter਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 㴀 　 
		   SET @newdocmsattrid = NULL;਀ऀऀ䤀䘀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			END਀ 
          -- Check that the multi-select attribute and multi-select list id pair exists਀ऀऀ  䤀䘀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
								  FROM doc_attr.doc_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    搀漀挀开洀猀开氀椀猀琀开椀搀  
								       = @docmslistid਀ऀऀऀऀऀऀऀऀ   䄀一䐀    搀漀挀开洀猀开愀琀琀爀开椀搀  
								       = @newdocmsattrid) ਀ऀऀऀऀऀऀऀ  䈀䔀䜀䤀一 
									EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ  
										@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
										SET @message = CONCAT(@message, ' | ', ' List ID: ', CONVERT(nvarchar(10), @docmslistid), '  Object ID: ', CONVERT(nvarchar(10), @newdocmsattrid), ' | ', @tempmessage);਀ऀऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidListItem.');਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
									SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀ  䔀一䐀 
਀ऀऀऀ 䔀一䐀 
਀ 
    -- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
		                   FROM forms.form_doc_multi_sel_defaults ਀ऀऀऀऀऀ      圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
						    AND doc_ms_list_id = @docmslistid਀ऀऀऀऀऀ        䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 
						    AND       @docmsattrid  ਀ऀऀऀऀऀऀऀ    㰀㸀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
਀ 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀  
		    SET doc_ms_attr_id = @newdocmsattrid਀ऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
	        AND doc_ms_list_id = @docmslistid਀ऀऀऀ䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开爀愀搀椀漀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-11-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  
-- Input is a form id and a document radio button list id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_doc_radiob_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @defaultdocrb_attrid bigint      = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀⸀ 
        @tempmessage nvarchar(300)              = '',਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@noformpermissionmsg nvarchar(200)	    = '', -- Communicates that the user does not have permission to modify the form਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicates that the supplied form id does not exist਀ऀऀ䀀搀漀挀爀戀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@noattrnameidmessage nvarchar(200)      = '', -- Communicates that a doc radio button list id has not been supplied਀        䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀琀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@recordnotexistmessage nvarchar(200)    = '', -- Communicates that a matching record does not exist਀ऀऀ䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 椀猀洀愀渀搀愀琀漀爀礀 昀氀愀最 椀猀 椀渀瘀愀氀椀搀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noformidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noformidmessage = 'A database level message error occurred on NoFormID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @formidnotexistmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @formidnotexistmessage = 'A database level message error occurred on FormNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　  
	    SET @docradioblistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @docradioblistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @noattrnameidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @noattrnameidmessage = 'A database level message error occurred on NoAttrListID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A doc radio button list id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE doc_radiob_list_id = @docradioblistid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @attrnameidnotexistmsg = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @attrnameidnotexistmsg = 'A database level message error occurred on AttrListNameNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
     -- Check if the default radio button ID is valid਀ऀ  䤀䘀 䀀搀攀昀愀甀氀琀搀漀挀爀戀开愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 
	     BEGIN਀ऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀爀戀愀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
		                  FROM doc_attr.doc_radio_button_attributes AS drba਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀     搀爀戀愀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀攀昀愀甀氀琀搀漀挀爀戀开愀琀琀爀椀搀 
						       AND drba.doc_radiob_list_id = @docradioblistid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀愀搀椀漀䈀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @docrbnotexistmessage = @tempmessage;਀ऀऀऀऀऀ   䔀䰀匀䔀  
							SET @docrbnotexistmessage = 'A database level message error occurred on RadioBNotExist.';਀ऀऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀ       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
						      WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ    䄀一䐀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
		   SET mandatory = @ismandatory,਀ऀऀ          氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
				position = ISNULL(@formposition, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			  attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀Ⰰ 
			  default_doc_rb_attr_id = @defaultdocrb_attrid਀ऀ     圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
    IF (@docrbnotexistmessage <> '')       SET @message = @message + ' | ' + @docrbnotexistmessage;	਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@noformpermissionmsg <> '')        SET @message = @message + ' | ' + @noformpermissionmsg;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开爀攀愀氀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-11-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀⸀  
-- Input is a form id and a document integer field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_doc_real_lnk] ਀ 
     @formid bigint                   = NULL, ਀     䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
  		@nopermissionmessage nvarchar(300)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 昀漀爀洀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		@formidnotexistmessage nvarchar(200)    = '', -- Communicats that the supplied form id does not exist਀ऀऀ䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 搀漀挀 椀渀琀攀最攀爀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
        @attrnameidnotexistmsg nvarchar(200)    = '', -- Communicatest that the supplied doc integer field id does not exist਀ऀऀ䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@ismandinvalidmessage nvarchar(200)     = '', -- Communicates that the ismandatory flag is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀漀爀洀椀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @docrealnameid = 0 ਀ऀ    匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if doc real number field id has been supplied਀ऀ 䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the attribute id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
							  FROM doc_attr.doc_real_number_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀愀琀琀爀渀愀洀攀椀搀渀漀琀攀砀椀猀琀洀猀最 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀⸀✀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @ismandinvalidmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @ismandinvalidmessage = 'A database level message error occurred on FrmMandInvalid.';਀ऀऀऀ䔀一䐀 
਀ 
      -- Check if a record exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ऀऀऀ  䤀䘀  一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
						        FROM forms.form_doc_real_number_links਀ऀऀऀऀऀऀ       圀䠀䔀刀䔀              昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								     AND doc_real_name_id = @docrealnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
						 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							  SET @recordnotexistmessage = @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @recordnotexistmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀ   䔀一䐀 
		   END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    UPDATE forms.form_doc_real_number_links ਀ऀऀ   匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
		          length = @fieldlength,਀ऀऀऀऀ瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
			  attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			  attribute3 = ISNULL(@attribute3, '')਀ऀ     圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀漀爀洀椀搀洀攀猀猀愀最攀㬀 
    IF (@formidnotexistmessage <> '')      SET @message = @message + ' | ' + @formidnotexistmessage;਀    䤀䘀 ⠀䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀愀琀琀爀渀愀洀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@attrnameidnotexistmsg <> '')      SET @message = @message + ' | ' + @attrnameidnotexistmsg;	਀    䤀䘀 ⠀䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀㬀ऀ 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀    䤀䘀 ⠀䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀猀洀愀渀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开琀爀开最爀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 搀漀挀甀洀攀渀琀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 昀椀攀氀搀⸀ 
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 吀栀椀猀 甀猀瀀 椀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀猀 ⠀愀猀 漀瀀瀀漀猀攀搀 琀漀 挀漀渀昀椀最甀爀愀琀漀爀猀⤀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开搀漀挀开琀爀开最爀瀀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_transaction_grp_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_created_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Updates a link between a form and a file created field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀   ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_file_created_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀  
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开搀愀琀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 搀愀琀攀 昀椀攀氀搀⸀  
-- Input is a form id and a date field id plus other attribute fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_file_date_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
	 IF @filedatenameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if the field id has been supplied਀ऀ 䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrListID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the list id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
							  FROM file_attr.file_date_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			  IF NOT EXISTS (SELECT file_date_name_id਀ऀऀऀऀऀऀ       䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀 
						      WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ    䄀一䐀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
						 @message_id = 'NotExist',਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			   END਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀  
		   SET mandatory = @ismandatory,਀ऀऀ          氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
				position = ISNULL(@formposition, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			  attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ  愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
	     WHERE form_id = @formid AND file_date_name_id = @filedatenameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_free_txt_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file free text field. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开昀爀攀攀开琀砀琀开氀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @filefreetextnameid bigint       = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀 㴀 　  
	    SET @filefreetextnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filefreetextnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A file free text field id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_free_text_name_id = @filefreetextnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
							     FROM forms.form_file_free_text_links਀ऀऀऀऀऀऀऀ    圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								      AND file_free_text_name_id = @filefreetextnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_free_text_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀昀爀攀攀琀攀砀琀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_hash_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file content hash field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- This usp is for controllers (as opposed to configurators)਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_file_hash_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_file_content_hash_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀猀  
			    SET    length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开椀渀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 椀渀琀攀最攀爀 昀椀攀氀搀⸀ 
-- Input is a form id and a file free text field id plus other attribute fields to be updated.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_file_int_link] ਀ 
     @formid bigint                   = NULL, ਀     䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ 䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　  
	    SET @fileintnameid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @fileintnameid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A file integer name id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_int_name_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀  
							 WHERE file_int_name_id = @fileintnameid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
						         FROM forms.form_file_integer_field_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								  AND file_int_name_id = @fileintnameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_integer_field_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_ms_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file multi-select field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开洀猀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @filemultiselectlistid bigint    = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ 䤀䘀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀 㴀 　  
	    SET @filemultiselectlistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @filemultiselectlistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀ 䔀一䐀 
	  ELSE -- An attribute id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_ms_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							 WHERE file_ms_list_id = @filemultiselectlistid)  ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
						         FROM forms.form_file_multi_sel_list_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								  AND file_ms_list_id = @filemultiselectlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_multi_sel_list_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀甀氀琀椀猀攀氀攀挀琀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 28-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 昀椀氀攀 昀椀氀攀渀愀洀攀 昀椀攀氀搀⸀ 
-- Input is a form id plus other attribute fields to be updated.਀ⴀⴀ 吀栀椀猀 甀猀瀀 椀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀猀 ⠀愀猀 漀瀀瀀漀猀攀搀 琀漀 挀漀渀昀椀最甀爀愀琀漀爀猀⤀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀 
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_name_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_plist_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file people list field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- This usp is for controllers (as opposed to configurators)਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_file_plist_links] ਀ 
     @formid bigint                   = NULL, ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ  
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_file_people_list_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								  AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_people_list_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
	            AND general_field_name_id = @genfield_nameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ   
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_radiob_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file radio button field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 椀搀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @file_radioblistid bigint        = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀搀攀昀愀甀氀琀昀椀氀攀开爀戀开愀琀琀爀椀搀 戀椀最椀渀琀    㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ 䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　  
	    SET @file_radioblistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF @file_radioblistid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀ 䔀一䐀 
	  ELSE -- An attribute id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
							 WHERE file_radiob_list_id = @file_radioblistid)  ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNameNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀      ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	  IF @defaultfile_rb_attrid IS NOT NULL਀ऀ  䈀䔀䜀䤀一 
		  IF NOT EXISTS (਀ऀऀऀ匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
			  FROM file_attr.file_radio_button_attributes਀ऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 
			   AND file_radiob_attr_id = @defaultfile_rb_attrid)਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀攀昀愀甀氀琀 椀猀 椀渀瘀愀氀椀搀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀愀甀氀琀䤀渀瘀愀氀椀搀✀Ⰰ 
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefaultInvalid.');਀ऀऀऀ 䔀一䐀  
	  END਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
						        WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀Ⰰ 
      default_file_rb_attr_id = @defaultfile_rb_attrid਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_real_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file real value field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 愀 昀椀氀攀 爀攀愀氀 昀椀攀氀搀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开昀椀氀攀开爀攀愀氀开氀椀渀欀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
     @filerealnameid bigint           = NULL,਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	 IF @filerealnameid = 0 ਀ऀ    匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if attribute id has been supplied਀ऀ 䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the attribute id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
							  FROM file_attr.file_real_number_field_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀     
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrNameNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT file_real_name_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 
						        WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid AND file_real_name_id = @filerealnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_retentn_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㌀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Updates a link between a form and a file retention date field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- This usp is for controllers (as opposed to configurators)਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_file_retentn_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
   		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀 
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_retention_date_links ਀ऀऀऀ    匀䔀吀    氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_size_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file size field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- This usp is for controllers (as opposed to configurators)਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_file_size_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
   		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀 
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_size_links ਀ऀऀऀ    匀䔀吀    氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_file_tr_grp_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file transaction group field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- This usp is for controllers (as opposed to configurators)਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_file_tr_grp_link] ਀ 
     @formid bigint                   = NULL, ਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀 
						        WHERE form_id = @formid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_file_transactn_grp_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_form_id_posn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Updates the list position of a form id਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 爀攀挀漀爀搀 椀搀 愀渀搀 渀攀眀 氀椀猀琀 瀀漀猀椀琀椀漀渀 
-- Output is message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开椀搀开瀀漀猀渀崀  
਀ऀ 䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @listposition int                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
		    SET    list_position ਀ऀऀऀ    㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE    form_id ਀ऀऀ        㴀 䀀昀漀爀洀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on UpdateError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
    IF (@norecordmessage <> '')            SET @message = @message + ' | ' + @norecordmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀漀爀洀开椀搀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Input is the recordid, mnemonic, name and description.਀ⴀⴀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 爀攀ⴀ猀攀渀搀 愀氀氀 琀栀爀攀攀 瘀愀氀甀攀猀Ⰰ 漀渀氀礀 椀昀 漀渀攀 椀猀 戀攀椀渀最 甀瀀搀愀琀攀搀⸀ 
-- Updating the list position is carried out via usp_UPD_form_id_posn਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_form_id_text] ਀ 
	 @formid bigint                   = NULL,  ਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @attribute_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @notuniquemessage nvarchar(200)         = '', -- Communicates that the attribute name is not unique਀ऀऀ䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 爀攀挀漀爀搀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@norecordmessage nvarchar(200)          = '', -- Communicates that the record id does not exist਀ऀऀ䀀渀漀愀琀琀爀椀戀甀琀攀渀愀洀攀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 眀愀猀 猀甀瀀瀀氀椀攀搀ऀऀ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @norecordidmessage = @tempmessage;਀ऀऀ   䔀䰀匀䔀  
			   SET @norecordidmessage = 'A database level message error occurred on NoRecordID.';਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @norecordmessage = @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @norecordmessage = 'A database level message error occurred on NotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	  -- Attribute name must be unique, unless it matches the existing one for that record id਀ऀऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
			AND	EXISTS (SELECT form_id਀ऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 
						 WHERE form_name = @attribute_name਀ऀऀऀऀऀऀऀ   䄀一䐀 昀漀爀洀开椀搀 㰀㸀 䀀昀漀爀洀椀搀⤀ 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 䰀䔀䘀吀⠀䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ ㄀　⤀ ⬀ ✀⸀⸀⸀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀愀琀琀爀椀戀甀琀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE forms.form_identifier_names ਀ऀऀ         匀䔀吀 洀渀攀洀 㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			    form_name = @attribute_name, ਀ऀऀऀऀ    搀攀猀挀爀 㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀 
		    WHERE form_id = @formid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @message + ' | ' + @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@norecordidmessage <> '')          SET @message = @message + ' | ' + @norecordidmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀洀攀猀猀愀最攀㬀 
	IF (@noattributenamemessage <> '')     SET @message = @message + ' | ' + @noattributenamemessage;਀ऀ䤀䘀 ⠀䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀           匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀琀甀渀椀焀甀攀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_frm_doc_funct_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a general field name linked to document function lists.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 愀渀搀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- This usp is for controllers (as opposed to configurators)਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_frm_doc_funct_links] ਀ 
     @formid bigint                   = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
						        WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_frm_doc_ppl_lst_lnks]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a general field name for document people list field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀Ⰰ 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- This usp is for controllers (as opposed to configurators)਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_frm_doc_ppl_lst_lnks] ਀ 
     @formid bigint                   = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ  
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　 
		 SET @formid = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	  IF @formid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀漀爀洀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀   
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A form id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀऀⴀⴀ 嘀愀氀椀搀愀琀攀 䀀椀猀洀愀渀搀愀琀漀爀礀 
		IF @ismandatory = ''਀ऀऀऀ匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 一唀䰀䰀㬀 
	    IF UPPER(@ismandatory) = 'YES' SET @ismandatory = 'Yes';਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀一伀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀㬀 
		IF NOT (@ismandatory = 'Yes' OR @ismandatory = 'No' OR @ismandatory IS NULL)਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀   
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FrmMandInvalid.');਀ऀऀऀ䔀一䐀 
਀ 
		-- Check if a record exists਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
						         FROM forms.form_doc_people_list_links਀ऀऀऀऀऀऀ        圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
								  AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀   
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ    䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	         UPDATE forms.form_doc_people_list_links ਀ऀऀऀ    匀䔀吀 洀愀渀搀愀琀漀爀礀 㴀 䀀椀猀洀愀渀搀愀琀漀爀礀Ⰰ 
				       length = @fieldlength,਀ऀऀऀऀऀ 瀀漀猀椀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀昀漀爀洀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
	               attribute1 = ISNULL(@attribute1, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㈀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀Ⰰ 
			       attribute3 = ISNULL(@attribute3, '')਀ऀऀऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
			    AND general_field_name_id = @genfield_nameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀爀洀开搀漀挀开甀猀攀爀开氀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 氀椀渀欀攀搀 琀漀 甀猀攀爀 䤀䐀⸀ 
-- Input is a form id and general field name id plus other attribute fields to be updated.਀ⴀⴀ 吀栀椀猀 甀猀瀀 椀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀猀 ⠀愀猀 漀瀀瀀漀猀攀搀 琀漀 挀漀渀昀椀最甀爀愀琀漀爀猀⤀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀爀洀开搀漀挀开甀猀攀爀开氀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint          = NULL, ਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀 
						        WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_frm_file_funct_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Updates a link between a form and a file function field.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀漀爀洀 椀搀 瀀氀甀猀 漀琀栀攀爀 愀琀琀爀椀戀甀琀攀 昀椀攀氀搀猀 琀漀 戀攀 甀瀀搀愀琀攀搀⸀ 
-- This usp is for controllers (as opposed to configurators)਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_frm_file_funct_links] ਀ 
     @formid bigint                   = NULL, ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	 @ismandatory nchar(3)            = NULL,਀ऀ 䀀昀椀攀氀搀氀攀渀最琀栀 猀洀愀氀氀椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @formposition nvarchar(50)       = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute2 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
 		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
						        WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
	਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_frm_file_multi_sel_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Creates a default file multi-select object. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀崀 
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @filemslistid bigint             = NULL,਀ऀ 䀀昀椀氀攀洀猀愀琀琀爀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @newfilemsattrid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@username nvarchar(150)                 = ORIGINAL_LOGIN(),਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		   SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀漀爀洀 
	  EXEC [internal].[usp_AUTHENTICATE_user_form] ਀ऀऀऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀昀漀爀洀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀऀ匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready         = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoFormPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
		END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 
		                   FROM forms.form_file_multi_sel_defaults਀ऀऀऀऀऀ      圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
					            AND file_ms_attr_id = @filemsattrid਀ऀऀऀऀऀऀऀ    䄀一䐀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
--=============================================਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀 
-- Check new multi-select attribute਀     䤀䘀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 　 
	    SET @newfilemsattrid = NULL;਀ऀ 䤀䘀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoAttrID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
        END਀ 
          -- Check that the multi-select attribute and multi-select list id pair exists਀ऀऀ  䤀䘀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 
								  FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    昀椀氀攀开洀猀开氀椀猀琀开椀搀  
								       = @filemslistid਀ऀऀऀऀऀऀऀऀ   䄀一䐀    昀椀氀攀开洀猀开愀琀琀爀开椀搀  
								       = @newfilemsattrid) ਀ऀऀऀऀऀऀऀ  䈀䔀䜀䤀一 
									EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ  
										@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
										SET @message = CONCAT(@message, ' | ', ' List ID: ', CONVERT(nvarchar(10), @filemslistid), '  Object ID: ', CONVERT(nvarchar(10), @newfilemsattrid), ' | ', @tempmessage);਀ऀऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidListItem.');਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
									SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀ  䔀一䐀 
਀ऀऀऀ 䔀一䐀 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT file_ms_attr_id਀ऀऀ                   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀  
					      WHERE form_id = @formid਀ऀऀऀऀऀऀ    䄀一䐀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
					        AND file_ms_attr_id = @newfilemsattrid਀ऀऀऀऀऀऀ    䄀一䐀       䀀昀椀氀攀洀猀愀琀琀爀椀搀   
							    <> @newfilemsattrid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
਀ 
--=============================================਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE forms.form_file_multi_sel_defaults ਀ऀऀ    匀䔀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 
		       WHERE form_id = @formid਀ऀऀऀ     䄀一䐀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
				 AND file_ms_attr_id = @filemsattrid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀爀洀开昀椀氀攀开甀猀攀爀开氀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Initial creation: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀漀爀洀 愀渀搀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 氀椀渀欀攀搀 琀漀 甀猀攀爀 䤀䐀 昀漀爀 愀 昀椀氀攀⸀ 
-- Input is a form id and general field name id plus other attribute fields to be updated.਀ⴀⴀ 吀栀椀猀 甀猀瀀 椀猀 昀漀爀 挀漀渀琀爀漀氀氀攀爀猀 ⠀愀猀 漀瀀瀀漀猀攀搀 琀漀 挀漀渀昀椀最甀爀愀琀漀爀猀⤀ 
-- Output is message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀爀洀开昀椀氀攀开甀猀攀爀开氀渀欀猀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint          = NULL, ਀ऀ 䀀椀猀洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀            㴀 一唀䰀䰀Ⰰ 
	 @fieldlength smallint            = NULL,਀ऀ 䀀昀漀爀洀瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @attribute1 nvarchar(50)         = NULL,਀ऀ 䀀愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @attribute3 nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
	 -- Authenticate the user for the given form਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
			@form_id_to_check = @formid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
			SET @userauthentication_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀漀爀洀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			    SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
		        SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormPermission');਀ऀऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  -- Check form id has been supplied਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFormID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE  ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀漀爀洀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀漀爀洀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the form id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀 
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
		-- Validate @ismandatory਀ऀऀ䤀䘀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀✀ 
			SET @ismandatory = NULL;਀ऀ    䤀䘀 唀倀倀䔀刀⠀䀀椀猀洀愀渀搀愀琀漀爀礀⤀ 㴀 ✀夀䔀匀✀ 匀䔀吀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀㬀 
		IF UPPER(@ismandatory) = 'NO' SET @ismandatory = 'No';਀ऀऀ䤀䘀 一伀吀 ⠀䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀夀攀猀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 㴀 ✀一漀✀ 伀刀 䀀椀猀洀愀渀搀愀琀漀爀礀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'FrmMandInvalid', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀爀洀䴀愀渀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀऀ䈀䔀䜀䤀一 
				IF NOT EXISTS (SELECT form_id਀ऀऀऀऀऀऀ         䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀 
						        WHERE form_id = @formid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				BEGIN -- Record does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
							@message_id = 'NotExist',਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE  ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the failed data validation message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		    ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ         唀倀䐀䄀吀䔀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀  
			    SET mandatory = @ismandatory,਀ऀऀऀऀ       氀攀渀最琀栀 㴀 䀀昀椀攀氀搀氀攀渀最琀栀Ⰰ 
					 position = ISNULL(@formposition, ''),਀ऀ               愀琀琀爀椀戀甀琀攀㄀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㄀Ⰰ ✀✀⤀Ⰰ 
			       attribute2 = ISNULL(@attribute2, ''),਀ऀऀऀ       愀琀琀爀椀戀甀琀攀㌀ 㴀 䤀匀一唀䰀䰀⠀䀀愀琀琀爀椀戀甀琀攀㌀Ⰰ ✀✀⤀ 
			  WHERE form_id = @formid਀ऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_function_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀ 
CREATE PROCEDURE [controlling].[usp_UPD_function_list] ਀ 
         ਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @functionid bigint               = NULL, ਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 　Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	  IF @functionlistid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
      IF @functionlistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID.');਀ऀऀऀ 䔀一䐀 
਀ 
	 -- Check the function id਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 　 
			 SET @functionid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @functionid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionID.');਀ऀऀऀ 䔀一䐀 
਀ 
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  伀渀氀礀 瀀攀爀昀漀爀洀 琀栀椀猀 挀栀攀挀欀 椀昀 戀漀琀栀 瀀愀爀愀洀攀琀攀爀猀 栀愀瘀攀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
	 IF @data_validation_status = 'Pass'਀ऀ    䄀一䐀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT fl.function_list_id਀ऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
			  WHERE fl.function_list_id = @functionlistid਀ऀऀऀऀऀ䄀一䐀 昀氀⸀昀甀渀挀琀椀漀渀开椀搀  㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 
            SET   list_position = @listposition਀ऀऀ  圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
		        AND  function_id = @functionid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀⸀  ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_function_list_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀琀漀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 琀漀 甀瀀搀愀琀攀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 渀愀洀攀 
-- Input is a record id, mnemonic, name and description ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀漀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 琀漀 甀瀀搀愀琀攀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 渀愀洀攀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀㨀 䴀愀渀搀愀琀漀爀礀 
* - @mnemonic nvarchar(10): Can be null.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 眀栀椀挀栀 椀猀 甀渀椀焀甀攀⸀ 
* - @description nvarchar(max): Can be null.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for invalid input data.਀⨀ 
* **Side Effects:**਀⨀ 
* - Updates a record in people.function_list_names ਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 漀爀 洀愀琀挀栀 琀栀攀 攀砀椀猀琀椀渀最 昀漀爀 琀栀攀 最椀瘀攀渀 爀攀挀漀爀搀 椀搀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_function_list_name] ਀ 
     @recordid bigint                 = NULL,਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ              
	 @functionlist_name nvarchar(50)  = '',਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 ✀✀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	      -- Check the record id਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
			 SET @recordid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @recordid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @recordid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀⸀ 伀渀氀礀 瀀攀爀昀漀爀洀 琀栀椀猀 挀栀攀挀欀 椀昀 琀栀攀 椀搀 椀猀 瘀愀氀椀搀⸀  伀琀栀攀爀眀椀猀攀 愀 一愀洀攀一漀琀攀唀渀椀焀甀攀 攀爀爀漀爀 洀愀礀 戀攀 洀椀猀氀攀愀搀椀渀最⸀ 
	  IF @data_validation_status = 'Pass' ਀ऀ     䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀渀愀洀攀 
		 		       FROM people.function_list_names AS fln਀ऀऀऀऀ      圀䠀䔀刀䔀 昀氀渀⸀渀愀洀攀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀 
					        AND fln.function_list_id <> @recordid)਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@functionlist_name, 10), '...  ',  @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique.');਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @functionlist_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
				  SET @message = CONCAT_WS(' |', @message, @validationmessage); ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE people.function_list_names਀            匀䔀吀 洀渀攀洀        㴀 䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
		        name        = @functionlist_name,਀ऀऀऀऀ搀攀猀挀爀椀瀀琀椀漀渀 㴀 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 
		  WHERE function_list_id = @recordid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀⸀  ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开氀漀挀欀开搀漀挀甀洀攀渀琀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀漀挀欀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- by setting the Lock Status to Locked.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀⸀ 
-- Output is message and status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开氀漀挀欀开搀漀挀甀洀攀渀琀开椀搀崀  
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀  ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)        = '', -- Communicates that the doc id was invalid਀        䀀渀漀搀愀琀愀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀            㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀愀琀愀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@nodocidmessage nvarchar(200)           = '', -- Communicates that no document id was supplied਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if a doc id has not been supplied.  Fail if it has not been supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoDocID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		   ELSE ਀ऀऀऀ   匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN   -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @docinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀ   䔀䰀匀䔀  
						SET @docinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀ 䔀一䐀 
		 END   -- End checking if doc id exists਀ 
 ਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 昀愀椀氀攀搀 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End of validation checks਀    䔀一䐀  ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE base.document_id_list ਀ऀऀ           匀䔀吀 搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀氀漀挀欀开猀琀愀琀甀猀 㴀 ✀䰀漀挀欀攀搀✀ 
			     WHERE doc_id = @documentid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀㬀 
	  END CATCH਀    䔀一䐀  ⴀⴀ 䔀渀搀 椀昀 琀爀愀渀猀愀挀琀椀漀渀 爀攀愀搀礀 㴀 刀攀愀搀礀 
਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀              匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀愀琀愀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开瀀攀漀瀀氀攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record in people.people_list ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开瀀攀漀瀀氀攀开氀椀猀琀崀  
਀          
	 @peoplelistid bigint             = NULL,਀ऀ 䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ  
	 @listposition int                = 0,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
      IF @peoplelistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID.');਀ऀऀऀ 䔀一䐀 
਀ 
	 -- Check the person id਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 㴀 　 
			 SET @sidid = NULL; ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @sidid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀匀椀搀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSidId.');਀ऀऀऀ 䔀一䐀 
਀ 
	 -- Check if a matching record exists਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
	    (SELECT pl.people_list_id਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
		  WHERE pl.people_list_id = @peoplelistid਀ऀऀ        䄀一䐀 瀀氀⸀猀椀搀开椀搀  㴀 䀀猀椀搀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 
		    SET list_position   = @listposition਀ऀऀ  圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
		        AND sid_id = @sidid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_people_list_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 琀漀 甀瀀搀愀琀攀 愀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀 
-- Input is record id, mnemonic, name and description ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 琀漀 甀瀀搀愀琀攀 愀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀㨀 䴀愀渀搀愀琀漀爀礀⸀  䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 攀砀椀猀琀椀渀最 椀搀⸀  
* - @mnemonic nvarchar(10): Can be null.਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀㨀 䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀 眀栀椀挀栀 椀猀 甀渀椀焀甀攀⸀ 
* - @description nvarchar(max): Can be null.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - User Role Validation Fail: Returns 'No Permission' message.਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 椀渀瘀愀氀椀搀 椀渀瀀甀琀 搀愀琀愀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 椀渀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀  
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 攀砀攀挀甀琀椀渀最 琀栀攀 瀀爀漀挀攀搀甀爀攀 洀甀猀琀 栀愀瘀攀 琀栀攀 ✀䌀漀渀琀爀漀氀氀攀爀✀ 爀漀氀攀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_people_list_name] ਀ 
     @recordid bigint                 = NULL,਀     䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ              
	 @peoplelist_name nvarchar(50)    = '',਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 ✀✀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
		  IF @recordid = 0਀ऀऀऀ 匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS pln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
	  -- Attribute name must be unique. Only perform this check if the id is valid.  Otherwise a NameNoteUnique error may be misleading.਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	     AND EXISTS (SELECT pln.name਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
				  WHERE pln.name = @peoplelist_name਀ऀऀऀऀ        䄀一䐀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㰀㸀 䀀爀攀挀漀爀搀椀搀⤀ 
		   BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NameNotUnique', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀⸀⸀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀⸀✀⤀㬀 
		   END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
				@mnem             = @mnemonic,਀ऀऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀Ⰰ 
				@descr            = @description,਀ऀऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
				@messg            = @validationmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀⤀㬀  
				  SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
		    SET mnem = ISNULL(@mnemonic, ''),਀ऀऀऀ    渀愀洀攀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀Ⰰ 
				description = ISNULL(@description, '')਀ऀऀ  圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_sid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀㄀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 琀攀砀琀 昀椀攀氀搀猀 漀昀 愀 爀攀挀漀爀搀 椀渀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
-- Input is the SID ID,਀ⴀⴀ 瀀氀甀猀 愀渀 漀瀀琀椀漀渀愀氀 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀⸀ 
-- Output is a status message and a transaction status. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_sid] ਀ 
     @sidrecordid bigint               = NULL,  -- SID ID record number (not the SID)਀ऀ 䀀猀椀搀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀           㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 渀愀洀攀 漀昀 匀䤀䐀 昀漀爀 甀猀攀 眀椀琀栀椀渀 琀栀椀猀 搀愀琀愀戀愀猀攀 
	 @sid_description nvarchar(max)    = NULL,  -- Optional description or notes਀ऀ 䀀攀洀愀椀氀开愀搀搀爀攀猀猀 渀瘀愀爀挀栀愀爀⠀㈀㔀㔀⤀      㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 攀洀愀椀氀 愀搀搀爀攀猀猀 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)             = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀      㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)       = '',     -- Communicates that the transaction failed due to data validation਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@recordnotexistsmessage nvarchar(200)  = '',     -- Communicates that a matching record does not exist਀ऀऀ䀀椀渀瘀愀氀椀搀猀椀搀洀攀猀猀愀最攀  渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 猀甀瀀瀀氀椀攀搀 匀䤀䐀 椀猀 椀渀瘀愀氀椀搀 
	    @connectedusersid varbinary(100)       = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)        = 'Fail',਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transactionmessage2 nvarchar(200)     = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀           㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)      = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as an authoriser਀ 
  EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䀀甀猀攀爀渀愀洀攀 ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 刀攀瀀氀愀挀攀 一唀䰀䰀 渀愀洀攀 愀渀搀 搀攀猀挀爀椀瀀琀椀漀渀 昀椀攀氀搀猀 眀椀琀栀 攀洀瀀琀礀⸀ 
	  IF @sid_name IS NULL SET @sid_name = '';਀ऀ  䤀䘀 䀀猀椀搀开搀攀猀挀爀椀瀀琀椀漀渀 䤀匀 一唀䰀䰀 匀䔀吀 䀀猀椀搀开搀攀猀挀爀椀瀀琀椀漀渀 㴀 ✀✀㬀 
਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	   -- Check that the sid is valid਀ऀऀ 䤀䘀 䀀猀椀搀爀攀挀漀爀搀椀搀 㴀 　 
		    SET @sidrecordid = NULL;਀ऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀  
				  	      FROM user_restr.sid_list ਀ऀऀऀऀऀ     圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀爀攀挀漀爀搀椀搀⤀  
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'UserIdNotExist', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀Ⰰ 䀀猀椀搀爀攀挀漀爀搀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			 ELSE ਀ऀऀऀऀ  匀䔀吀 䀀爀攀挀漀爀搀渀漀琀攀砀椀猀琀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ 
       -- End checking that the sid  is valid਀ 
		-- Sanitise the email address਀ऀऀऀऀ匀䔀吀 䀀攀洀愀椀氀开愀搀搀爀攀猀猀 㴀 䰀伀圀䔀刀⠀䀀攀洀愀椀氀开愀搀搀爀攀猀猀⤀㬀 
਀ऀऀऀऀⴀⴀ 刀攀洀漀瘀攀 挀漀渀琀爀漀氀 挀栀愀爀愀挀琀攀爀猀 ⠀挀栀愀爀 挀漀搀攀猀 　ⴀ㌀㄀⤀ 
				WHILE PATINDEX('%[' + CHAR(0) + '-' + CHAR(31) + ']%', @email_address) > 0਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @email_address = STUFF(@email_address, PATINDEX('%[' + CHAR(0) + '-' + CHAR(31) + ']%', @email_address), 1, '');਀ऀऀऀऀ䔀一䐀㬀 
਀ऀऀऀऀⴀⴀ 刀攀洀漀瘀攀 愀渀礀 猀瀀愀挀攀猀 眀椀琀栀椀渀 琀栀攀 猀琀爀椀渀最 
				SET @email_address = REPLACE(@email_address, ' ', '');਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
	     UPDATE user_restr.sid_list ਀ऀऀ        匀䔀吀  渀愀洀攀 㴀 䤀匀一唀䰀䰀⠀䀀猀椀搀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
				    descr = ISNULL(@sid_description, ''),਀ऀऀ    攀洀愀椀氀开愀搀搀爀攀猀猀 㴀 䤀匀一唀䰀䰀⠀䀀攀洀愀椀氀开愀搀搀爀攀猀猀Ⰰ ✀✀⤀ 
		      WHERE sid_id = @sidrecordid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀ऀ䤀䘀 ⠀䀀椀渀瘀愀氀椀搀猀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀椀渀瘀愀氀椀搀猀椀搀洀攀猀猀愀最攀㬀 
	IF (@recordnotexistsmessage <> '')     SET @message = @message + ' | ' + @recordnotexistsmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_tag_br_tr_perm_flist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 渀攀眀 琀愀最 氀椀渀欀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 愀甀琀栀漀爀椀猀攀 洀攀洀戀攀爀猀 漀昀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 琀漀 攀搀椀琀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_tag_br_tr_perm_flist] ਀ 
਀     䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @functionlistid bigint           = NULL,਀     䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @newfunctionlistid bigint        = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䈀爀吀爀攀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagBrTreeID.');਀ऀऀऀ 䔀一䐀 
           ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagBrTreeIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	  IF @functionlistid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @functionlistid  IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
      ELSE਀ऀऀऀ ⴀⴀ 昀甀渀挀琀椀漀渀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                 FROM people.function_list_names AS fln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE    tag_browsing_tree_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀 
					  AND    function_list_id਀ऀऀऀऀऀ      㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
	  END਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--Check the new parameters਀ऀ  ऀ  䤀䘀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 㴀 ✀✀  
			 SET @newtag_br_treeid = NULL;਀  
		  -- Check if a tag browsing tree id was supplied. ਀ऀऀ  䤀䘀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag browsing tree id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagBrTreeID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䈀爀吀爀攀攀䤀䐀⸀✀⤀㬀 
			 END਀           䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_browsing_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
								       = @newtag_br_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 琀爀攀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @newtag_br_treeid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagBrTreeIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 ✀✀  
	     SET @newfunctionlistid = NULL;਀ऀऀ䤀䘀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀      䔀䰀匀䔀 
			 -- function list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @newfunctionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @newfunctionlistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF EXISTS (SELECT tag_browsing_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE       tag_browsing_tree_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 
					  AND       function_list_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
				  AND NOT (       @tag_br_treeid਀ऀऀऀऀऀ         㴀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 
					       AND    @functionlistid਀ऀऀऀऀऀ         㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE user_restr.tag_br_tree_permissions_flist ਀ऀऀ    匀䔀吀       琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
			    = @newtag_br_treeid,਀ऀऀऀऀ      昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			    = @newfunctionlistid਀ऀऀ  圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		        = @tag_br_treeid਀ऀऀऀ䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			    = @functionlistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_tag_br_tr_perm_plist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 渀攀眀 琀愀最 氀椀渀欀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 愀甀琀栀漀爀椀猀攀 洀攀洀戀攀爀猀 漀昀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 攀搀椀琀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_tag_br_tr_perm_plist] ਀ 
਀     䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @peoplelistid bigint             = NULL,਀     䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @newpeoplelistid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䈀爀吀爀攀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagBrTreeID.');਀ऀऀऀ 䔀一䐀 
           ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagBrTreeIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @peoplelistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS i਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE    tag_browsing_tree_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀 
					  AND    people_list_id਀ऀऀऀऀऀ      㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
	  END਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--Check the new parameters਀ऀ  ऀ  䤀䘀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 㴀 　  
			 SET @newtag_br_treeid = NULL;਀  
		  -- Check if a tag browsing tree id was supplied. ਀ऀऀ  䤀䘀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag browsing tree id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagBrTreeID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䈀爀吀爀攀攀䤀䐀⸀✀⤀㬀 
			 END਀           䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_browsing_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
								       = @newtag_br_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 琀爀攀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @newtag_br_treeid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagBrTreeIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the people list id਀ऀ  䤀䘀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @newpeoplelistid = NULL;਀ऀऀ䤀䘀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
 -- People list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT i.people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 椀 
							WHERE i.people_list_id = @newpeoplelistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @newpeoplelistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_br_tree_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀       琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
					      = @newtag_br_treeid਀ऀऀऀऀऀ  䄀一䐀       瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = @newpeoplelistid਀ऀऀऀऀ  䄀一䐀 一伀吀 ⠀       䀀琀愀最开戀爀开琀爀攀攀椀搀 
					         = @newtag_br_treeid਀ऀऀऀऀऀ       䄀一䐀    䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
					         = @newpeoplelistid))਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀  
		    SET       tag_browsing_tree_id਀ऀऀऀ    㴀 䀀渀攀眀琀愀最开戀爀开琀爀攀攀椀搀Ⰰ 
				      people_list_id਀ऀऀऀ    㴀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 
		  WHERE    tag_browsing_tree_id਀ऀऀ        㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀 
			AND    people_list_id਀ऀऀऀ    㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 22-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a tag browsing tree name.਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀崀  
਀     䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 ✀✀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 戀爀漀眀猀椀渀最 琀爀攀攀 䤀䐀 
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䈀爀吀爀攀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagBrTreeID.');਀ऀऀऀ 䔀一䐀 
		  IF @tag_br_treeid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀  䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN -- browsing tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagBrTreeIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䈀爀吀爀攀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 㴀 ✀✀ 
		   SET @browsing_tree_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
					WHERE name = @browsing_tree_name਀ऀऀऀऀऀ  䄀一䐀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
					      <> @tag_br_treeid) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', ISNULL(LEFT(@browsing_tree_name, 10), ''), '... | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @browsing_tree_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @validationmessage);਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE tagging.tag_browsing_tree_names ਀ऀऀ    匀䔀吀           洀渀攀洀 
			    = ISNULL(@mnemonic, ''), ਀ऀऀऀऀ                 渀愀洀攀 
				= @browsing_tree_name,  ਀ऀऀऀऀ      搀攀猀挀爀 
				= ISNULL(@description, ''),਀ऀऀऀऀ 氀椀猀琀开瀀漀猀椀琀椀漀渀 
				=    @listposition਀ऀऀ  圀䠀䔀刀䔀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
		        =  @tag_br_treeid਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_tag_group_id_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 渀攀眀 琀愀最 最爀漀甀瀀 椀搀攀渀琀椀昀椀攀爀 渀愀洀攀 爀攀挀漀爀搀⸀ 
-- All parameters must be sent, otherwise they will be set to null. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开最爀漀甀瀀开椀搀开渀愀洀攀崀  
਀ऀ 䀀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀琀愀最开最爀漀甀瀀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀     㴀 一唀䰀䰀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  --  Check the tag group ID.  Note that updating a tag group is only available to controllers.  ਀ऀ                              ⴀⴀ 䄀 挀漀渀琀爀漀氀氀攀爀 挀愀渀 攀搀椀琀 愀渀礀 琀愀最 最爀漀甀瀀⸀  
	  ਀ऀ  ऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 SET @tag_groupid = NULL;਀  
		  -- Check if a tag group id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag group id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagGroupID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @tag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @tag_group_name = ''਀ऀऀ   匀䔀吀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		  IF @tag_group_name IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀瀀一愀洀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGrpName.');਀ऀऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT tag_group_name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
					WHERE tag_group_name ਀ऀऀऀऀऀ      㴀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀 
					  AND tag_group_id ਀ऀऀऀऀऀ      㰀㸀 䀀琀愀最开最爀漀甀瀀椀搀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀琀愀最开最爀漀甀瀀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
		    SET    mnem਀ऀऀऀ    㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				   tag_group_name਀ऀऀऀऀ㴀 䀀琀愀最开最爀漀甀瀀开渀愀洀攀Ⰰ 
				   descr਀ऀऀऀऀ㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				   list_position਀ऀऀऀऀ㴀 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE    tag_group_id਀ऀऀ        㴀 䀀琀愀最开最爀漀甀瀀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_tag_group_perm_flist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 渀攀眀 琀愀最 氀椀渀欀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 愀甀琀栀漀爀椀猀攀 洀攀洀戀攀爀猀 漀昀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 琀漀 氀椀渀欀 琀愀最猀 琀漀 愀 琀愀最 最爀漀甀瀀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_tag_group_perm_flist] ਀ 
਀     䀀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @functionlistid bigint           = NULL,਀     䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @newfunctionlistid bigint        = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_groupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGroupID.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_group_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
								 WHERE    tag_group_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开最爀漀甀瀀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagGroupNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	  IF @functionlistid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @functionlistid  IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
      ELSE਀ऀऀऀ ⴀⴀ 昀甀渀挀琀椀漀渀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                 FROM people.function_list_names AS fln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF NOT EXISTS (SELECT tag_group_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE    tag_group_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开最爀漀甀瀀椀搀 
					  AND    function_list_id਀ऀऀऀऀऀ      㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
	  END਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--Check the new parameters਀ऀ  ऀ  䤀䘀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 SET @newtag_groupid = NULL;਀  
		  -- Check if a tag group id was supplied. ਀ऀऀ  䤀䘀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag groupo id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagGroupID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀       琀愀最开最爀漀甀瀀开椀搀  
								       = @newtag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @newtag_groupid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @newfunctionlistid = NULL;਀ऀऀ䤀䘀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀      䔀䰀匀䔀 
			 -- function list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @newfunctionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @newfunctionlistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF EXISTS (SELECT tag_group_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 
					WHERE       tag_group_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 
					  AND       function_list_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
				  AND NOT (    @tag_groupid਀ऀऀऀऀऀ      㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 
					      AND     @functionlistid਀ऀऀऀऀऀ         㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE user_restr.tag_group_permissions_flist ਀ऀऀ    匀䔀吀       琀愀最开最爀漀甀瀀开椀搀 
			    = @newtag_groupid,਀ऀऀऀऀ      昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			    = @newfunctionlistid਀ऀऀ  圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
		        = @tag_groupid਀ऀऀऀ䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			    = @functionlistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_tag_group_perm_plist]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 渀攀眀 琀愀最 氀椀渀欀 瀀攀爀洀椀猀猀椀漀渀猀 爀攀挀漀爀搀 琀漀 愀甀琀栀漀爀椀猀攀 洀攀洀戀攀爀猀 漀昀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 氀椀渀欀 琀愀最猀 琀漀 愀 琀愀最 最爀漀甀瀀 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_tag_group_perm_plist] ਀ 
਀     䀀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @peoplelistid bigint             = NULL,਀     䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @newpeoplelistid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  	  IF @tag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_groupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGroupID.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_group_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
								 WHERE    tag_group_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开最爀漀甀瀀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagGroupNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @peoplelistid = 0਀ऀ     匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @peoplelistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS i਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF NOT EXISTS (SELECT tag_group_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE    tag_group_id਀ऀऀऀऀऀ      㴀 䀀琀愀最开最爀漀甀瀀椀搀 
					  AND    people_list_id਀ऀऀऀऀऀ      㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
	  END਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--Check the new parameters਀ऀ  ऀ  䤀䘀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 SET @newtag_groupid = NULL;਀  
		  -- Check if a tag group id was supplied. ਀ऀऀ  䤀䘀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag group id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagGroupID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀       琀愀最开最爀漀甀瀀开椀搀  
								       = @newtag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @newtag_groupid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the people list id਀ऀ  䤀䘀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @newpeoplelistid = NULL;਀ऀऀ䤀䘀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
 -- People list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT i.people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 椀 
							WHERE i.people_list_id = @newpeoplelistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @newpeoplelistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ  䈀䔀䜀䤀一 
	    IF EXISTS (SELECT tag_group_id਀ऀऀ             䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 
					WHERE       tag_group_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 
					  AND       people_list_id਀ऀऀऀऀऀ      㴀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 
				  AND NOT  (   @tag_groupid਀ऀऀऀऀऀ      㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 
					      AND  @peoplelistid਀ऀऀऀऀऀ      㴀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
	  END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE user_restr.tag_group_permissions_plist ਀ऀऀ    匀䔀吀       琀愀最开最爀漀甀瀀开椀搀 
			    = @newtag_groupid,਀ऀऀऀऀ     瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			    = @newpeoplelistid਀ऀऀ  圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀 
		        = @tag_groupid਀ऀऀऀ䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			    = @peoplelistid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_tag_tree_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 琀愀最 琀爀攀攀 渀愀洀攀⸀ 
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_tag_tree_name] ਀ 
     @tag_treeid bigint               = NULL,਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @tag_tree_name nvarchar(50)      = '',਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  	  IF @tag_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTree.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀琀愀最开琀爀攀攀开渀愀洀攀 㴀 ✀✀ 
		   SET @tag_tree_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
		IF EXISTS (SELECT name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
					WHERE name = @tag_tree_name਀ऀऀऀऀऀ  䄀一䐀     琀愀最开琀爀攀攀开椀搀 
					      <> @tag_treeid) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', ISNULL(LEFT(@tag_tree_name, 10), ''), '... | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @tag_tree_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @validationmessage);਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE tagging.tag_tree_names ਀ऀऀ    匀䔀吀           洀渀攀洀  
			    = ISNULL(@mnemonic, ''), ਀ऀऀऀऀ            渀愀洀攀 
			    = @tag_tree_name,  ਀ऀऀऀऀ       搀攀猀挀爀 
			    = ISNULL(@description, ''),਀ऀऀऀऀ    氀椀猀琀开瀀漀猀椀琀椀漀渀 
				= @listposition਀ऀऀ  圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
				= @tag_treeid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开琀爀攀攀开瀀攀爀洀开昀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a new tag link permissions record to authorise members of a function list to edit a tag tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开琀爀攀攀开瀀攀爀洀开昀氀椀猀琀崀  
਀ 
     @tag_treeid bigint               = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
     @newtag_treeid bigint            = NULL,਀ऀ 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagTree', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀⸀✀⤀㬀 
			 END਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
								       = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 琀爀攀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @tag_treeid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀ऀऀ䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFunctionListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀      䔀䰀匀䔀 
			 -- function list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT fln.function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							WHERE fln.function_list_id = @functionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @functionlistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_tree_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
					      = @tag_treeid਀ऀऀऀऀऀ  䄀一䐀    昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @functionlistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
--================================਀ⴀⴀ䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
	  	  IF @newtag_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀渀攀眀琀愀最开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @newtag_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTree.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE       tag_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀渀攀眀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀琀愀最开琀爀攀攀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
	  IF @newfunctionlistid = 0਀ऀ     匀䔀吀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @newfunctionlistid  IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
      ELSE਀ऀऀऀ ⴀⴀ 昀甀渀挀琀椀漀渀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                 FROM people.function_list_names AS fln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
-- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_tree_permissions_flist਀ऀऀऀऀऀ圀䠀䔀刀䔀       琀愀最开琀爀攀攀开椀搀 
					      = @newtag_treeid਀ऀऀऀऀऀ  䄀一䐀       昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					      = @newfunctionlistid਀ऀऀऀऀ  䄀一䐀 一伀吀 ⠀       䀀琀愀最开琀爀攀攀椀搀 
					         = @newtag_treeid਀ऀऀऀऀऀ       䄀一䐀    䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
					         = @newfunctionlistid))਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀  
		    SET       tag_tree_id਀ऀऀऀ    㴀 䀀渀攀眀琀愀最开琀爀攀攀椀搀Ⰰ 
				      function_list_id਀ऀऀऀ    㴀 䀀渀攀眀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
		  WHERE    tag_tree_id਀ऀऀ        㴀 䀀琀愀最开琀爀攀攀椀搀 
			AND    function_list_id਀ऀऀऀ    㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开琀爀攀攀开瀀攀爀洀开瀀氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a new tag link permissions record to authorise members of a people list to edit a tag tree਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开琀爀攀攀开瀀攀爀洀开瀀氀椀猀琀崀  
਀ 
     @tag_treeid bigint               = NULL,਀ऀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
     @newtag_treeid bigint            = NULL,਀ऀ 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '', ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagTree', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀⸀✀⤀㬀 
			 END਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
								       = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 琀爀攀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @tag_treeid), 'NULL'),  @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
	  -- Check the people list id਀ऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
	     SET @peoplelistid = NULL;਀ऀऀ䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoPeopleListID', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
 -- People list has been supplied.  Check if it is valid਀ऀ     䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT i.people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 椀 
							WHERE i.people_list_id = @peoplelistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, ISNULL(CONVERT(nvarchar(10), @peoplelistid), 'NULL'),  @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ 
-- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_tree_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
					      = @tag_treeid਀ऀऀऀऀऀ  䄀一䐀    瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = @peoplelistid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
--================================਀ⴀⴀ䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
	  	  IF @newtag_treeid = 0਀ऀऀऀ 匀䔀吀 䀀渀攀眀琀愀最开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @newtag_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTree.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE       tag_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀渀攀眀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀琀愀最开琀爀攀攀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
	  IF @newpeoplelistid = 0਀ऀ     匀䔀吀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @newpeoplelistid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names AS i਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 椀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ 
-- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ    䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
		             FROM user_restr.tag_tree_permissions_plist਀ऀऀऀऀऀ圀䠀䔀刀䔀       琀愀最开琀爀攀攀开椀搀 
					      = @newtag_treeid਀ऀऀऀऀऀ  䄀一䐀       瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					      = @newpeoplelistid਀ऀऀऀऀ  䄀一䐀 一伀吀 ⠀       䀀琀愀最开琀爀攀攀椀搀 
					         = @newtag_treeid਀ऀऀऀऀऀ       䄀一䐀    䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
					         = @newpeoplelistid))਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀ  䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀  
		    SET       tag_tree_id਀ऀऀऀ    㴀 䀀渀攀眀琀愀最开琀爀攀攀椀搀Ⰰ 
				      people_list_id਀ऀऀऀ    㴀 䀀渀攀眀瀀攀漀瀀氀攀氀椀猀琀椀搀 
		  WHERE    tag_tree_id਀ऀऀ        㴀 䀀琀愀最开琀爀攀攀椀搀 
			AND    people_list_id਀ऀऀऀ    㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a transaction group note.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 愀渀搀 愀 渀攀眀 渀漀琀攀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_transaction_group]਀ 
	 @transactiongroup bigint                       = NULL,਀ऀ 䀀渀攀眀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀      㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)                        = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀               㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	  IF @transactiongroup = 0਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 一唀䰀䰀㬀 
	  -- Check that the transaction group exists.  Fail if it doesn't. ਀ऀ  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 一唀䰀䰀㬀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀䜀爀漀甀瀀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀䜀爀漀甀瀀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 
		 BEGIN਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
							  FROM base.transaction_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀  
				 BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'TGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 END਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀  
		           SET transaction_groups.transaction_group_note = @new_transaction_group_note਀ऀऀऀ     圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- End if transaction ready = Ready਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_wf_inst_def_pres_step]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 瀀爀攀猀攀渀琀 猀琀攀瀀 昀漀爀 愀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀⸀   
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀昀开椀渀猀琀开搀攀昀开瀀爀攀猀开猀琀攀瀀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @present_step_id bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
	  IF @recordid = 0਀ऀ     匀䔀吀 䀀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
      IF @recordid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀऀ 䔀一䐀 
      ELSE -- A record id has been supplied਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT workflow_instance_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
			  WHERE workflow_instance_id = @recordid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀ䔀一䐀 
		ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC [internal].[usp_AUTHENTICATE_wf_instance]਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀 㴀 䀀爀攀挀漀爀搀椀搀Ⰰ 
			  @wf_instance_auth_result = @object_auth_result OUTPUT;਀ऀऀ   䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			 BEGIN਀ऀऀ ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WFInstanceNotAuth', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀⸀✀⤀㬀 
			 END਀ऀऀ 䔀一䐀 
਀ 
-- Validate @present_step_id਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀 攀砀椀猀琀猀   
	  IF @present_step_id = 0 ਀ऀऀ 匀䔀吀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 ⴀⴀ 一唀䰀䰀 瀀爀攀猀攀渀琀 猀琀攀瀀 䤀䐀 椀猀 瀀攀爀洀椀琀琀攀搀 
		IF @present_step_id IS NOT NULL਀     ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
							  FROM workflow_models.workflow_step_definitions ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀⤀  
				 BEGIN  -- The step ID does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WorkflowStepInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
		 -- Check if a matching record exists in workflow_step_definitions਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
		    SET present_step_id = @present_step_id਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀  
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_wf_step_duty_funct]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀⸀   
-- All old and new parameters must be sent.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_wf_step_duty_funct] ਀ 
     @instance_step_id bigint         = NULL,    ਀ऀ 䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  
	 @outputid bigint                 = NULL,਀ऀ 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀     㴀 一唀䰀䰀Ⰰ     
	 @new_functionid bigint           = NULL, ਀ऀ 䀀渀攀眀开漀甀琀瀀甀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@instance_step_id IS NULL OR @instance_step_id = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䤀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the instance step ID exists਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
									 FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 
							BEGIN -- Instance step ID does not exist ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
							END਀ऀऀऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
						BEGIN਀ऀऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
							@instance_step_to_check = @instance_step_id,਀ऀऀऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
						 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
		 						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀऀऀ䔀一䐀 
						END਀ऀऀऀऀ䔀一䐀 
		 -- End checking the instance step id਀ 
		 -- Check the new instance id਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@new_instance_step_id IS NULL OR @new_instance_step_id = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䤀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the instance step ID exists਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
									 FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 
							BEGIN -- Instance step ID does not exist ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
							END਀ऀऀऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
						BEGIN਀ऀऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
							@instance_step_to_check = @new_instance_step_id,਀ऀऀऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
						 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
		 						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀऀऀ䔀一䐀 
						END਀ऀऀऀऀ䔀一䐀 
਀ 
-- The function id will be checked later where the existance of a matching record is checked. ਀ 
-- Check the new function id਀ऀ  䤀䘀 䀀渀攀眀开昀甀渀挀琀椀漀渀椀搀 㴀 　 
	     SET @new_functionid = NULL;਀      䤀䘀 䀀渀攀眀开昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT function_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
							WHERE function_id = @new_functionid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctionIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
-- End checking new function ID. ਀ 
਀ऀ  䤀䘀 䀀渀攀眀开漀甀琀瀀甀琀椀搀 㴀 　 
		 SET @new_outputid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 漀甀琀瀀甀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @new_outputid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀伀甀琀瀀甀琀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfOutputID.');਀ऀऀ 䔀一䐀 
	  ELSE -- An output id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 漀甀琀瀀甀琀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT output_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE output_id = @new_outputid ) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀伀甀琀瀀甀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfOutputIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ऀ  
  IF @data_validation_status = 'Pass' -- Further checks after initial checks. ਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
   BEGIN਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 
		  WHERE workflow_instance_step_id ਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND    function_id ਀ऀऀऀऀ㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- Record does not exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ 
 ਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	 IF EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_step_duty_functions਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =   @new_instance_step_id਀ऀऀ    䄀一䐀        昀甀渀挀琀椀漀渀开椀搀  
				= @new_functionid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀ䔀一䐀 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀爀攀 椀猀 愀 挀漀爀爀攀猀瀀漀渀搀椀渀最 昀漀爀攀椀最渀 欀攀礀 昀漀爀 琀栀攀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 ⼀ 昀甀渀挀琀椀漀渀开椀搀 椀渀 眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀⸀ 
  IF EXISTS ਀    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	   FROM workflow_instances.workflow_function_output_files਀ऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	    AND function_id = @functionid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀 昀漀爀攀椀最渀 欀攀礀 攀砀椀猀琀猀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䘀甀渀挀琀伀甀琀䘀刀攀昀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfFunctOutFRef.');਀ऀऀ䔀一䐀 
਀ 
਀   䔀一䐀  ⴀⴀ䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 愀昀琀攀爀 椀渀椀琀椀愀氀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE workflow_instances.workflow_step_duty_functions਀ऀऀ    匀䔀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
				function_id               = @new_functionid,਀ऀऀऀऀ漀甀琀瀀甀琀开椀搀                 㴀 䀀渀攀眀开漀甀琀瀀甀琀椀搀 
		  WHERE workflow_instance_step_id਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀ऀऀ   
		    AND    function_id ਀ऀऀ        㴀 䀀昀甀渀挀琀椀漀渀椀搀 
		    AND    output_id ਀ऀऀऀऀ㴀 䀀漀甀琀瀀甀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- END IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_workflow_instance_def]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀漀爀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 琀漀 甀瀀搀愀琀攀 愀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀⸀   
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @documentid nvarchar(50)         = '', ਀ऀ 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ  
	 @present_step_id bigint          = NULL,਀ऀ 䀀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀ 
		@docauthenticationstatus nchar(10)   = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check the record id਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
	     SET @recordid = NULL;਀      䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
			 END਀      䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
			   FROM workflow_instances.workflow_instance_definitions਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀愀渀挀攀崀 
			  @wf_instance_to_check = @recordid,਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开愀甀琀栀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
		   IF @object_auth_result = 'Fail'਀ऀऀऀ 䈀䔀䜀䤀一 
		 		   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFInstanceNotAuth.');਀ऀऀऀ 䔀一䐀 
		 END਀ 
਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Doc id was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀 Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 搀漀挀 椀搀 攀砀椀猀琀猀 
਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 　 
		 SET @workflow_model_id = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @workflow_model_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀漀爀欀昀氀䴀漀搀攀氀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWorkflModelID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
							 WHERE    workflow_model_id ਀ऀऀऀऀऀऀऀ       㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WorkflModelInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀漀爀欀昀氀䴀漀搀攀氀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 
  	  -- Check if the workflow step exists  ਀ऀ  䤀䘀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 㴀 　  
		 SET @present_step_id = NULL; -- NULL present step ID is permitted਀ऀऀ䤀䘀 䀀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
     -- Workflow step ID has been supplied.  Check if it exists. ਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT workflow_model_step_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀  
							 WHERE workflow_model_step_id = @present_step_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 猀琀攀瀀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WorkflowStepInvalid.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀ 
਀ 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
		    SET doc_id = @documentid,਀ऀऀऀ    眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀Ⰰ 
				present_step_id = @present_step_id,਀ऀऀऀऀ渀漀琀攀猀 㴀 䀀渀漀琀攀猀 
		  WHERE workflow_instance_id = @recordid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record for workflow_instances.workflow_instance_steps to update workflow instance step.  ਀ⴀⴀ 䄀氀氀 瀀愀爀愀洀攀琀攀爀猀 洀甀猀琀 戀攀 猀攀渀琀 
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀挀漀渀琀爀漀氀氀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀崀  
਀     䀀爀攀挀漀爀搀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ    ⴀⴀ 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	 @instanceid bigint               = NULL,਀ऀ 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  
	 @step_status_id bigint           = NULL,਀ऀ 䀀搀愀琀攀㄀ 搀愀琀攀琀椀洀攀㈀⠀㜀⤀              㴀 一唀䰀䰀Ⰰ 
	 @date2 datetime2(7)              = NULL,਀ऀ 䀀搀愀琀攀㌀ 搀愀琀攀琀椀洀攀㈀⠀㜀⤀              㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	  -- Check the record id਀ऀ  䤀䘀 䀀爀攀挀漀爀搀椀搀 㴀 　 
	     SET @recordid = NULL;਀      䤀䘀 䀀爀攀挀漀爀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRecordID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
			 END਀      䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			   FROM workflow_instances.workflow_instance_steps਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
			BEGIN਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
				@instance_step_to_check = @recordid,਀ऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
			 IF @object_auth_result = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
		 			SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀ䔀一䐀 
			END਀ 
਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀椀搀 㴀 　 
		 SET @instanceid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @instanceid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀䘀䤀渀猀琀愀渀挀攀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWFInstanceID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_instance_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 
							 WHERE workflow_instance_id = @instanceid) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀䤀渀猀琀愀渀挀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFInstanceIDInvalid.');਀ऀऀऀऀ 䔀一䐀 
		ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC [internal].[usp_AUTHENTICATE_wf_instance]਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀椀搀Ⰰ 
			  @wf_instance_auth_result = @object_auth_result OUTPUT;਀ऀऀ   䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			 BEGIN਀ऀऀ ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WFInstanceNotAuth', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀⸀✀⤀㬀 
			 END਀ऀऀ 䔀一䐀 
		 END਀ 
	  IF @model_step_id = 0਀ऀऀ 匀䔀吀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if a model step id was supplied.਀ऀ  䤀䘀 䀀洀漀搀攀氀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWorkflowStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀漀爀欀昀氀漀眀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 洀漀搀攀氀 猀琀攀瀀 椀搀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that a model step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
							  FROM workflow_models.workflow_step_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
							       =       @model_step_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WorkflowStepInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
਀ⴀⴀ 嘀愀氀椀搀愀琀攀 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
  	  -- Check if the step status exists  ਀ऀ  䤀䘀 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀 㴀 　  
		 SET @step_status_id = NULL; ਀ऀऀ䤀䘀 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀 䤀匀 一伀吀 一唀䰀䰀  ⴀⴀ 一唀䰀䰀 猀琀攀瀀 猀琀愀琀甀猀 䤀䐀 椀猀 瀀攀爀洀椀琀琀攀搀 
     -- Workflow step status ID has been supplied.  Check if it exists. ਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT step_status_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀  
							 WHERE    step_status_id ਀ऀऀऀऀऀऀऀ       㴀 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀⤀  
				 BEGIN  -- The step status does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'StepStatusIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀琀攀瀀匀琀愀琀甀猀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
		 ਀ 
	 -- Check if a duplicate record already exists, except if the record is the same as existing.਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT wis.workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
		  WHERE wis.workflow_instance_id ਀ऀऀ        㴀           䀀椀渀猀琀愀渀挀攀椀搀 
		    AND wis.workflow_model_step_id ਀ऀऀऀऀ㴀           䀀洀漀搀攀氀开猀琀攀瀀开椀搀 
		    AND wis.step_status_id਀ऀऀऀ    㴀  䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
			AND wis.workflow_instance_step_id਀ऀऀऀ    ℀㴀 䀀爀攀挀漀爀搀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE workflow_instances.workflow_instance_steps਀ऀऀ    匀䔀吀   
			     workflow_instance_id ਀ऀऀऀ    㴀        䀀椀渀猀琀愀渀挀攀椀搀Ⰰ  
			    workflow_model_step_id ਀ऀऀऀऀ㴀       䀀洀漀搀攀氀开猀琀攀瀀开椀搀Ⰰ 
				   step_status_id ਀ऀऀऀऀ㴀 䀀猀琀攀瀀开猀琀愀琀甀猀开椀搀Ⰰ 
				date_1 = @date1,਀ऀऀऀऀ搀愀琀攀开㈀ 㴀 䀀搀愀琀攀㈀Ⰰ 
				date_3 = @date3਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀爀攀挀漀爀搀椀搀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
	END਀  
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [controlling].[usp_UPD_workflow_participant]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀⸀   
-- All old and new parameters must be sent.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [controlling].[usp_UPD_workflow_participant] ਀ 
     @instance_step_id bigint         = NULL,    ਀ऀ 䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ  
	 @outputid bigint                 = NULL,਀ऀ 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀     㴀 一唀䰀䰀Ⰰ     
	 @new_sidid bigint                = NULL, ਀ऀ 䀀渀攀眀开漀甀琀瀀甀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@docauthenticationstatus nchar(10)   = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@instance_step_id IS NULL OR @instance_step_id = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䤀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the instance step ID exists਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
									 FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 
							BEGIN -- Instance step ID does not exist ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
							END਀ऀऀऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
						BEGIN਀ऀऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
							@instance_step_to_check = @instance_step_id,਀ऀऀऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
						 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
		 						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀऀऀ䔀一䐀 
						END਀ऀऀऀऀ䔀一䐀 
		 -- End checking the instance step id਀ 
	-- Check the new instance step id਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@new_instance_step_id IS NULL OR @new_instance_step_id = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䤀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the instance step ID exists਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
									 FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 
							BEGIN -- Instance step ID does not exist ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
							END਀ऀऀऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
						BEGIN਀ऀऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
							@instance_step_to_check = @new_instance_step_id,਀ऀऀऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
						 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
		 						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
									SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀऀऀ䔀一䐀 
						END਀ऀऀऀऀ䔀一䐀 
਀ 
	-- End checking the new instance step id਀ 
	  -- Check the person id਀ऀ  䤀䘀 䀀渀攀眀开猀椀搀椀搀 㴀 　 
	     SET @new_sidid = NULL;਀      䤀䘀 䀀渀攀眀开猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 瀀攀爀猀漀渀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT sid_id਀ऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
							WHERE sid_id = @new_sidid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀匀椀搀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SidIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ 
	  IF @new_outputid = 0਀ऀऀ 匀䔀吀 䀀渀攀眀开漀甀琀瀀甀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an output id was supplied.਀ऀ  䤀䘀 䀀渀攀眀开漀甀琀瀀甀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWfOutputID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀伀甀琀瀀甀琀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 漀甀琀瀀甀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the output id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 漀甀琀瀀甀琀开椀搀 
							  FROM workflow_instances.workflow_output_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 漀甀琀瀀甀琀开椀搀 㴀 䀀渀攀眀开漀甀琀瀀甀琀椀搀 ⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfOutputIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀伀甀琀瀀甀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
	 ਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䘀甀爀琀栀攀爀 挀栀攀挀欀猀 愀昀琀攀爀 椀渀椀琀椀愀氀 挀栀攀挀欀猀⸀  
  -- Check if the record exists਀   䈀䔀䜀䤀一 
	 IF NOT EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_step_participants਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =       @instance_step_id਀ऀऀ    䄀一䐀    猀椀搀开椀搀  
				= @sidid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀ䔀一䐀 
਀  
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 
		  WHERE workflow_instance_step_id ਀ऀऀ        㴀   䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND        sid_id ਀ऀऀऀऀ㴀 䀀渀攀眀开猀椀搀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
-- Check if there is a corresponding foreign key for the workflow_instance_step_id / sid_id in workflow_person_output_files.਀  䤀䘀 䔀堀䤀匀吀匀  
    (SELECT workflow_instance_step_id਀ऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
	  WHERE workflow_instance_step_id = @instance_step_id਀ऀ    䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
		BEGIN -- A foreign key exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'WfPersOutFRef',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀倀攀爀猀伀甀琀䘀刀攀昀⸀✀⤀㬀 
		END਀ 
਀ 
   END  --END IF @data_validation_status = 'Pass' after initial validation checks.਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the delete query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 
		    SET workflow_instance_step_id = @new_instance_step_id,਀ऀऀऀऀ猀椀搀开椀搀                    㴀 䀀渀攀眀开猀椀搀椀搀Ⰰ 
				output_id                 = @new_outputid਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		        =       @instance_step_id		  ਀ऀऀ    䄀一䐀    猀椀搀开椀搀  
		        = @sidid਀ऀऀ    䄀一䐀    漀甀琀瀀甀琀开椀搀  
				= @outputid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开戀漀漀欀开椀渀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 戀漀漀欀椀渀最 爀攀挀漀爀搀⸀ 
-- Delete a booked_in booking record completely (including file links), ਀ⴀⴀ 瀀爀漀瘀椀搀椀渀最 椀琀 椀猀 琀栀攀 洀漀猀琀 爀攀挀攀渀琀 戀漀漀欀椀渀最 椀搀 昀漀爀 琀栀愀琀 甀猀攀爀 昀漀爀 琀栀愀琀 搀漀挀甀洀攀渀琀 
-- and it is a booked in record.਀ⴀⴀ 䤀昀 琀栀攀 戀漀漀欀椀渀最开椀搀 椀猀 猀琀椀氀氀 琀栀愀琀 眀栀椀挀栀 椀猀 愀最愀椀渀猀琀 琀栀攀 搀漀挀开椀搀 琀栀攀渀 琀栀攀 猀琀愀琀甀猀  
-- is reverted to the previous booked-out id.  Otherwise, if the booking_id against the document_id ਀ⴀⴀ 搀漀攀猀 渀漀琀 洀愀琀挀栀 琀栀攀 漀渀攀 戀攀椀渀最 搀攀氀攀琀攀搀 琀栀攀渀 琀栀攀 搀漀挀开椀搀 戀漀漀欀椀渀最 爀攀挀漀爀搀 昀椀攀氀搀猀 爀攀洀愀椀渀 甀渀挀栀愀渀最攀搀⸀     
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_book_in_id]਀ 
	 @booking_id bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userid bigint                          = NULL,਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀                㴀 ✀✀Ⰰ ⴀⴀ 吀栀攀 搀漀挀甀洀攀渀琀 椀搀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 琀栀攀 爀攀挀漀爀搀 琀漀 戀攀 搀攀氀攀琀攀搀⸀  
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@booking_in_time_box bigint             = NULL,਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀    
		BEGIN਀ऀऀ   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
		   SET @iscontroller = 'Yes';਀ऀऀ䔀一䐀   
  ਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		-- Retrieve user ID਀ऀऀ匀䔀吀 䀀甀猀攀爀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
		                 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 戀漀漀欀椀渀最 椀搀 攀砀椀猀琀猀⸀ 
਀ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 戀漀漀欀椀渀最 椀搀 椀猀 琀栀攀 洀漀猀琀 爀攀挀攀渀琀 戀漀漀欀椀渀最 爀攀挀漀爀搀 椀搀 昀漀爀 琀栀愀琀 甀猀攀爀 
-- for that document and is a booked-in record਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		  BEGIN਀ 
਀ऀ  匀䔀䰀䔀䌀吀 䀀戀漀漀欀椀渀最开椀渀开琀椀洀攀开戀漀砀 㴀 戀漀漀欀椀渀最开椀渀开琀椀洀攀开戀漀砀 
	    FROM base.global_settings_groups AS gsg਀ऀ   圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀㬀 
਀ऀऀ    匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
			                     FROM base.booking_log਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀⤀ 
			IF NOT EXISTS ਀ऀऀऀऀ⠀ 
				SELECT bl.booking_id਀ऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
				 WHERE bl.user_id = @userid਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀 
				   AND bl.booking_status = 'In'਀ऀऀऀऀ   䄀一䐀 䐀䄀吀䔀䄀䐀䐀⠀䴀䤀一唀吀䔀Ⰰ 䀀戀漀漀欀椀渀最开椀渀开琀椀洀攀开戀漀砀Ⰰ 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀⤀ 㸀㴀 䜀䔀吀䐀䄀吀䔀⠀⤀ 
				   AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				 )਀ 
਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䰀愀猀琀䈀欀䤀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotLastBkIn.');਀ऀऀऀऀ䔀一䐀 
		  END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);;਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	BEGIN TRANSACTION਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ 
		   UPDATE base.document_id_list -- Revert the document record to the previous booked out ID.  ਀ऀऀ      匀䔀吀 戀漀漀欀椀渀最开椀搀 㴀  
				(਀ऀऀऀऀ匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开椀搀 
				  FROM base.booking_log AS bl਀ऀऀऀऀ 圀䠀䔀刀䔀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 㴀  
				   (SELECT MAX(booking_date)਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
					 WHERE doc_id = @documentid਀ऀऀऀऀ       䄀一䐀 戀漀漀欀椀渀最开猀琀愀琀甀猀 㴀 ✀伀甀琀✀⤀ 
				 )਀ऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀ऀऀऀ  
		਀ 
਀ऀऀ 䐀䔀䰀䔀吀䔀 䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀攀搀开椀渀开昀椀氀攀猀 
		       WHERE booking_id = @booking_id਀ऀऀ 䐀䔀䰀䔀吀䔀 䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
		       WHERE booking_id = @booking_id਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		COMMIT;਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     ROLLBACK;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_date_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Deletes a date field to document link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开搀愀琀攀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docdatenameid bigint            = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@datestyle int                          = '', -- Date style from base.datetime_styles਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docdatenameid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docdatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_date_name_id = @docdatenameid) -- Check if the doc date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ 
 		  -- Check if the record does not exist਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
							 FROM doc_attr.doc_date_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 
							            AND doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM doc_attr.doc_date_values ਀ऀऀ       圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		             AND doc_date_name_id = @docdatenameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开昀甀渀挀琀开氀椀猀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀甀洀攀渀琀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
-- Input is the document id and duty function list id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_funct_list_link] ਀ 
     @documentid nvarchar(50)          = NULL,਀     䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)         = 'Fail', -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		     SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT doc_id਀ऀऀ                   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
					      WHERE doc_id = @documentid਀ऀऀऀऀऀ        䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM people.doc_to_function_list_links ਀ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
				  AND function_list_id = @functionlistid਀ऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最爀漀甀瀀开氀椀渀欀开爀攀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 12-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 搀漀挀甀洀攀渀琀 琀漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 氀椀渀欀⸀ 
-- Only permits a document group and document which the user has rights to.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开最爀漀甀瀀开氀椀渀欀开爀攀猀琀爀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docgroupid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)          = '', ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		IF @docgroupid = 0਀ऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoDocGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	 -- This also returns fail if the id does not exist਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
			@docgroupid_to_check_vp = @docgroupid,਀ऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		    SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', 'Document group ID: ', ISNULL(CONVERT(nvarchar(20), @docgroupid), 'NULL'), '  ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupPermission.');਀ऀऀ䔀一䐀 
਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀  
			-- Check if the record exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND NOT EXISTS (SELECT doc_id਀ऀऀऀऀऀऀ   ऀ     䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 
			 				    WHERE doc_group_id = @docgroupid਀ऀऀऀऀऀऀऀऀ      䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀  
                WHERE       doc_id = @documentid਀ऀऀऀऀ  䄀一䐀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开椀渀琀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 搀漀挀甀洀攀渀琀 琀漀 椀渀琀攀最攀爀 瘀愀氀甀攀 氀椀渀欀⸀ 
-- Input is a document id and a document integer name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开椀渀琀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docintnameid bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check the doc int name field id਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document int name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 椀渀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 椀渀琀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
 		  -- Check that the record exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 
							 FROM doc_attr.doc_integer_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 
							            AND doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM doc_attr.doc_integer_values ਀ऀऀ  圀䠀䔀刀䔀              搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		        AND doc_int_name_id = @docintnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_multi_select_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from doc_multi_select_links਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 ⴀ 愀琀琀爀椀戀甀琀攀 椀搀 ⴀ 搀漀挀 椀搀 琀爀椀瀀氀攀琀 琀漀 搀攀氀攀琀攀⸀   
-- Output is a message and status.਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀  
     @documentid nvarchar(50)         = NULL,਀     䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @docmsattrid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
		@docidinvalidmessage nvarchar(200)      = '', -- Communicates that the document id was invalid਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as a controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		SET @documentid = NULL;਀ऀ 䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　 
		SET @docmslistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF (@documentid IS NULL OR @docmslistid IS NULL)਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一   
		-- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 					@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
	 ਀ऀऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		   IF NOT EXISTS (SELECT doc_ms_list_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
						   WHERE doc_ms_list_id     = @docmslistid਀ऀऀऀऀऀऀऀऀ 䄀一䐀 搀漀挀开椀搀         㴀 䀀搀漀挀甀洀攀渀琀椀搀 
								 AND doc_ms_attr_id = @docmsattrid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 END਀ 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM doc_attr.doc_multi_select_links ਀ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀     㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
					  AND doc_id         = @documentid਀ऀऀऀऀऀ  䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_people_list_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Delete a record from document_to_people_list_links਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀崀  
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀          㴀 一唀䰀䰀Ⰰ 
     @peoplelistid bigint              = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)         = 'Fail', -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		     SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀ              匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT doc_id਀ऀऀ                   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
					      WHERE doc_id = @documentid਀ऀऀऀऀऀ        䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM people.doc_to_people_list_links ਀ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
				  AND people_list_id = @peoplelistid਀ऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开爀愀搀椀漀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
-- Input is the radio button list id - doc id pair to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开爀愀搀椀漀戀开氀椀渀欀崀  
     @documentid nvarchar(50)         = NULL,਀     䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user ਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Pass'   ਀ऀऀ䈀䔀䜀䤀一 
		   SET @userauthentication_status = 'Pass';਀ऀऀ   匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
		END਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		SET @documentid = NULL;਀ऀ 䤀䘀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　 
		SET @docradioblistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF (@documentid IS NULL OR @docradioblistid IS NULL)਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied ਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 愀渀搀 攀搀椀琀 洀攀琀愀搀愀琀愀 
			   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
					@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					 BEGIN -- Doc id does not exist or the user does not have permission to access it or edit it਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoDocIDAccess', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀  
					 END	 ਀ 
			 -- Check if the radiob list id does not exist਀ऀऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
								FROM doc_attr.doc_radio_button_links ਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 
									 AND doc_id = @documentid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
				END -- END Check if the document ID exists and the user has permission to access the document and edit metadata਀ 
			-- Check if the list id is restricted and if the user does not have controller permission.਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT restricted਀ऀऀऀ                 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
							WHERE doc_radiob_list_id = @docradioblistid਀ऀऀऀऀऀऀऀ      䄀一䐀 爀攀猀琀爀椀挀琀攀搀 㴀 ✀吀爀甀攀✀⤀ 
			   AND @iscontroller = 'No'਀ऀऀऀ    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䰀椀渀欀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoLinkPermission.');਀ऀऀऀ    䔀一䐀 
਀ऀऀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM doc_attr.doc_radio_button_links ਀               圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 
			         AND doc_id = @documentid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		  SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䔀一䐀 
਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_real_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Deletes a document to real number field link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀愀洀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_real_value]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docrealnameid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check the doc real name field id਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document real name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT doc_real_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 
			 				WHERE doc_real_name_id = @docrealnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀  
		  WHERE               doc_id = @documentid਀ऀऀ        䄀一䐀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀愀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a document tag.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_tag] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set will be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Check if a tag was supplied਀ऀ  䤀䘀 䀀琀愀最开椀搀 㴀 　  
	    SET @tag_id = NULL;਀ऀ  䤀䘀 䀀琀愀最开椀搀 䤀匀 一唀䰀䰀 
	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoTagID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䤀䐀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @tag_id)਀ऀऀ 䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @tag_id), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ऀ 䔀䰀匀䔀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 攀搀椀琀 琀栀攀 琀愀最 
		  BEGIN਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开攀搀椀琀崀 
				 @tag_id_ep = @tag_id,਀ऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			  IF @temp_userauth_status = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'NoTagPermission', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀ ऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀⤀㬀ऀऀ    
				 END਀ऀऀ  䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM tagging.doc_tags ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开椀搀 
		        = @tag_id਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀攀砀琀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 琀攀砀琀 瘀愀氀甀攀 琀漀 搀漀挀甀洀攀渀琀 氀椀渀欀⸀ 
-- Input is a document id and a document text name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_text_value]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 㴀 　 
			 SET @doctextnameid = NULL;਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @doctextnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀攀砀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTextNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc text name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_free_text_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_free_text_name_id = @doctextnameid) -- Check if the doc text name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TextIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT doc_free_text_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 
			 				WHERE doc_free_text_name_id = @doctextnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀  
  		       WHERE                     doc_id = @documentid਀ऀऀ              䄀一䐀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Deletes a record in table doc_to_com_obj_ms_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 搀漀挀甀洀攀渀琀 瘀椀愀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
-- Input is a document id, a common object list id and a common object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
-- Both controler and editor are authenticated.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀  渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 一唀䰀䰀Ⰰ 
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
					     WHERE  doc_id = @documentid਀ऀऀऀऀऀ           䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					           AND common_object_id      = @commonobjectid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', @documentid, ' ', CONVERT(nvarchar(10), @commonobjlistid), ' ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM com_obj.doc_to_com_obj_ms_list_links ਀ऀऀ      圀䠀䔀刀䔀  搀漀挀开椀搀  㴀 䀀搀漀挀甀洀攀渀琀椀搀 
			         AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ 䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀漀开挀漀洀开漀戀樀开爀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Deletes a record in table doc_to_com_obj_radiob_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 搀漀挀甀洀攀渀琀 瘀椀愀 愀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 
-- Input is a document id and a common object list id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_to_com_obj_rb_link]਀ 
     @documentid  nvarchar(50)        = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@norecordidmessage nvarchar(200)        = '', -- Communicates that the record does not exist਀ऀऀ䀀渀漀琀攀砀椀猀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀          㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 氀椀猀琀ⴀ椀琀攀洀 䤀䐀 瀀愀椀爀 攀渀琀爀礀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@nodocumentidmessage nvarchar(200)      = '', -- Communicates that no document id was supplied਀ऀऀ䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nocomobjlistmessage nvarchar(200)      = '', -- Communicates that a common object list id was not supplied਀ऀऀ䀀渀漀挀漀洀漀戀樀攀挀琀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 眀愀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 
		@comobjlistinvalidmessage nvarchar(200) = '', -- Communicates that the common object list was invalid਀ऀऀ䀀挀漀洀漀戀樀攀挀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 挀漀洀漀渀 漀戀樀攀挀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
				   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
						@user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀ ⬀ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀ ⬀ ✀⸀⸀⸀ ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @nocomobjlistmessage = @tempmessage;					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @nocomobjlistmessage = 'A database level message error occurred on NoComObjList.';਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @comobjlistinvalidmessage = CONVERT(nvarchar(10), @commonobjlistid) + ' | ' + @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @comobjlistinvalidmessage = 'A database level message error occurred on ComObjListNotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 
					     WHERE  doc_id = @documentid਀ऀऀऀऀऀ           䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 ⬀ ✀ ✀ ⬀ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀  
		      WHERE  doc_id  = @documentid਀ऀऀऀ         䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on DeleteError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nocomobjlistmessage <> '')        SET @message = @message + ' | ' + @nocomobjlistmessage;਀ऀ䤀䘀 ⠀䀀挀漀洀漀戀樀氀椀猀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀挀漀洀漀戀樀氀椀猀琀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocumentidmessage <> '')        SET @message = @message + ' | ' + @nodocumentidmessage;਀    䤀䘀 ⠀䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@notexistmessage <> '')            SET @message = @message + ' | ' + @notexistmessage;਀    䤀䘀 ⠀䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀爀攀挀漀爀搀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀甀洀攀渀琀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_to_function_link] ਀ 
     @documentid nvarchar(50)          = NULL,਀     䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀                㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint           = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid = ''਀ऀऀ     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
				              SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
		                   FROM people.doc_to_function_links਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					        AND function_id = @functionid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀  
				WHERE doc_id = @documentid਀ऀऀऀऀ  䄀一䐀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
				  AND general_field_name_id = @genfield_nameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_transaction_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Deletes the transaction group for a document ID.਀ⴀⴀ 甀猀瀀开唀倀䐀开搀漀挀甀洀攀渀琀开椀搀 眀椀氀氀 氀攀愀瘀攀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 甀渀挀栀愀渀最攀搀 
-- if a transaction group id is not supplied.਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀⸀ 
-- Output is message and status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀  
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀  
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'  -- Data validation failed਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
		           SET document_id_list.transaction_group_id = NULL਀ऀऀऀ     圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- End if transaction ready = Ready਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀开甀猀攀爀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 搀漀挀甀洀攀渀琀开琀漀开甀猀攀爀开氀椀渀欀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_user_link] ਀ 
     @documentid nvarchar(50)          = NULL,਀     䀀猀椀搀椀搀 戀椀最椀渀琀                     㴀 一唀䰀䰀Ⰰ 
     @genfield_nameid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid = ''਀ऀऀ     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
				              SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
		                   FROM people.doc_to_user_links਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					        AND sid_id = @sidid਀ऀऀऀऀऀऀ    䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀  
				WHERE doc_id = @documentid਀ऀऀऀऀ  䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀 
				  AND general_field_name_id = @genfield_nameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_doc_xref]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 戀攀琀眀攀攀渀 琀眀漀 搀漀挀甀洀攀渀琀猀 
-- Input is a source document id, a cross-referenced document id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_doc_xref]਀ 
     @source_docid  nvarchar(50)      = NULL,਀ऀ 䀀砀爀攀昀开搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check the source document id਀ऀऀ  䤀䘀 䀀猀漀甀爀挀攀开搀漀挀椀搀 㴀 ✀✀ 
		     SET @source_docid = NULL;਀ऀऀ  䤀䘀 䀀猀漀甀爀挀攀开搀漀挀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀猀漀甀爀挀攀开搀漀挀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀猀漀甀爀挀攀开搀漀挀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @xref_docid = ''਀ऀऀ     匀䔀吀 䀀砀爀攀昀开搀漀挀椀搀 㴀 一唀䰀䰀㬀 
		  IF @xref_docid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @xref_docid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@xref_docid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
 ਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 砀爀攀昀开琀礀瀀攀开椀搀 
		               FROM xref.doc_cross_references਀ऀऀऀऀऀ  圀䠀䔀刀䔀 猀漀甀爀挀攀开搀漀挀开椀搀 㴀 䀀猀漀甀爀挀攀开搀漀挀椀搀 
					        AND xref_doc_id = @xref_docid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    DELETE FROM xref.doc_cross_references ਀ऀऀ      圀䠀䔀刀䔀 猀漀甀爀挀攀开搀漀挀开椀搀 㴀 䀀猀漀甀爀挀攀开搀漀挀椀搀 
			        AND xref_doc_id = @xref_docid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀甀洀攀渀琀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Delete a document id.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- Output is a message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开搀漀挀甀洀攀渀琀开椀搀崀  
	 @documentid nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Doc id was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀 Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 搀漀挀 椀搀 搀漀攀猀 攀砀椀猀琀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 氀漀挀欀攀搀⸀ 
			   IF ((SELECT lock_status਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 
					 WHERE doc_id = @documentid)਀ऀऀऀऀऀऀ   㴀 ✀䰀漀挀欀攀搀✀⤀ 
				 BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDLocked', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀䰀漀挀欀攀搀⸀✀⤀㬀 
				   SET @transaction_ready = 'Fail';਀ऀऀऀऀ 䔀一䐀 
		 END   -- End checking if doc id exists਀ 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
		       WHERE doc_id = @documentid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF @tempmessage IS NOT NULL ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀  ⴀⴀ 䔀渀搀 椀昀 琀爀愀渀猀愀挀琀椀漀渀 爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㄀ⴀ㈀　㈀㌀ 
-- Description:	Deletes a file record਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀⸀  伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀猀⸀  
-- Authenticates both controller and editor਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀崀  
     @id_to_delete bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@sidid bigint                           = NULL, ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
  ਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 渀漀琀 戀攀攀渀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	  IF @id_to_delete = 0਀ऀऀ 匀䔀吀 䀀椀搀开琀漀开搀攀氀攀琀攀 㴀 一唀䰀䰀㬀 
	   -- Check that the file id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @id_to_delete IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䘀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 				@file_id_to_check_ep =  @id_to_delete,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @id_to_delete), '.  ', @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
		 END   -- End checking if file id exists਀ 
    --  If enforced retention is turned on, check if the retention date has passed.਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最猀最⸀攀渀昀漀爀挀攀搀开爀攀琀攀渀琀椀漀渀  
	               FROM base.global_settings_groups AS gsg਀ऀऀ          圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
				    AND gsg.enforced_retention = 'On')਀ऀऀ    䄀一䐀 ⠀匀䔀䰀䔀䌀吀 昀洀⸀爀攀琀攀渀琀椀漀渀开搀愀琀攀 
			       FROM base.file_metadata AS fm਀ऀऀऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀⤀ 㸀 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀ 
		   BEGIN਀ऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				  SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					   @message_id   = 'FileRetentionInForce', ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				  IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				  ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀刀攀琀攀渀琀椀漀渀䤀渀䘀漀爀挀攀⸀✀⤀㬀 
		   END਀ 
਀ 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀       䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
  -- Select the SID ID for the connected user਀ऀ  匀䔀䰀䔀䌀吀 䀀猀椀搀椀搀 㴀 猀氀⸀猀椀搀开椀搀 
		FROM user_restr.sid_list AS sl਀ऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀㬀 
਀ऀ  ⴀⴀ    圀爀椀琀攀 愀渀 攀渀琀爀礀 椀渀 琀栀攀 昀椀氀攀 搀攀氀攀琀攀 氀漀最 椀昀 椀琀 椀猀 攀渀愀戀氀攀搀⸀ 
	  IF EXISTS (SELECT gsg.file_delete_log ਀ऀ               䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		          WHERE gsg.setting_group_name = 'Master'਀ऀऀऀऀ    䄀一䐀 最猀最⸀昀椀氀攀开搀攀氀攀琀攀开氀漀最 㴀 ✀伀渀✀⤀ 
		   BEGIN਀ऀऀऀऀ䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀昀椀氀攀开搀攀氀攀琀攀开氀漀最 ⠀ 
					file_id,਀ऀऀऀऀऀ昀椀氀攀渀愀洀攀Ⰰ 
					created_when,਀ऀऀऀऀऀ挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀Ⰰ 
					created_by_sid_id,਀ऀऀऀऀऀ搀攀氀攀琀攀搀开戀礀开猀椀搀开椀搀 
				)਀ऀऀऀऀ匀䔀䰀䔀䌀吀 
					fm.file_id,਀ऀऀऀऀऀ昀洀⸀昀椀氀攀渀愀洀攀Ⰰ 
					fm.created,਀ऀऀऀऀऀ昀洀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀Ⰰ 
					fm.created_by_sid_id,਀ऀऀऀऀऀ䀀猀椀搀椀搀 䄀匀 搀攀氀攀琀攀搀开戀礀开猀椀搀开椀搀 
				FROM base.file_metadata AS fm਀ऀऀऀऀ圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
਀ऀऀ   䔀一䐀 
਀ऀऀ   ⴀⴀ  刀攀氀愀琀攀搀 琀愀戀氀攀猀 愀爀攀 搀攀氀攀琀攀搀 戀礀 䌀䄀匀䌀䄀䐀䔀  
	     DELETE FROM base.file_storage ਀ऀऀ       圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀椀搀开琀漀开搀攀氀攀琀攀㬀 
਀ऀऀ 䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- End if validation = Pass਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开搀愀琀攀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 搀愀琀攀 昀椀攀氀搀 琀漀 昀椀氀攀 氀椀渀欀⸀ 
-- Authenticates both controller and editor਀ 
-- Input is a file id and a file date name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开搀愀琀攀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @filedatenameid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@datestyle int                          = '', -- Date style from base.datetime_styles਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                    㴀 ✀搀洀礀✀Ⰰ  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filedatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_date_name_id = @filedatenameid) -- Check if the file date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ 
 		  -- Check that the record exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
							 FROM file_attr.file_date_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 
							            AND file_id = @fileid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM file_attr.file_date_values ਀ऀऀ       圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		             AND file_date_name_id = @filedatenameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开搀漀挀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 22-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a file to document link਀ 
-- Authenticates both controller and editor਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 椀搀 愀渀搀 搀漀挀甀洀攀渀琀 椀搀 
-- Output is message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开搀漀挀开氀椀渀欀崀  
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		  -- Data validation਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF @documentid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 						@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 䘀椀氀攀 搀愀琀愀 
			   EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
					@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀ   䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					 BEGIN -- file id does not exist or the user does not have permission to edit it਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
					 END			 ਀ऀऀऀ 䔀一䐀 
  ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		  IF (@data_validation_status = 'Pass' ਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀  
								FROM xref.file_to_document_links਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀  
									 AND file_id = @fileid))਀ऀऀऀ䈀䔀䜀䤀一 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ 
			END -- End check that the record exists਀ 
਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM xref.file_to_document_links਀ऀऀ       圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 䄀一䐀 
			         file_id = @fileid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开昀甀渀挀琀开氀椀猀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
-- Authenticates both controller and editor਀ 
-- Input is the file id duty function list id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开昀甀渀挀琀开氀椀猀琀开氀椀渀欀崀  
     @fileid bigint                    = NULL,਀     䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   
     @genfield_nameid bigint           = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)         = 'Fail', -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
						@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT file_id਀ऀऀ                   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
					      WHERE file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM people.file_to_function_list_links ਀ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
				  AND function_list_id = @functionlistid਀ऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a record from xref.file_group_links to unlink a file from a file group.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 䤀䐀 愀渀搀 愀 昀椀氀攀 最爀漀甀瀀 䤀䐀⸀   
-- Output is a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Deletes a record from xref.file_group_links to unlink a file from a file group.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @fileid bigint  Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid file group ID or file ID and permission failures.਀⨀ 
* **Side Effects:**਀⨀ 
* - Deletes a new record from xref.file_group_links਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Controller' role.਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 愀渀搀 䀀昀椀氀攀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 愀渀搀 洀甀猀琀 洀愀琀挀栀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 
* - The connected user must have viewing permission for the file਀⨀ ⴀ 吀栀攀 昀椀氀攀 洀甀猀琀 戀攀 昀爀攀攀 昀爀漀洀 攀搀椀琀 爀攀猀琀爀椀挀琀椀漀渀猀 眀栀椀挀栀 攀砀挀氀甀搀攀 琀栀攀 挀甀爀爀攀渀琀 甀猀攀爀⸀ 
* - The connected user must have edit permission for the file group which the file is to be linked to.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @filegroupid bigint              = NULL,               -- File group ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)       = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀ    䀀昀椀氀攀最爀漀甀瀀愀甀琀栀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀⸀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
	 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check the file id਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		 SET @fileid = NULL;਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID');਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 爀攀猀瀀漀渀搀椀渀最 琀漀 渀漀 昀椀氀攀 椀搀 猀甀瀀瀀氀椀攀搀 
	  ELSE -- A file id was supplied.  ਀ऀऀ 䈀䔀䜀䤀一ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀搀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀⸀ 一伀吀 眀栀攀琀栀攀爀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀  
			EXEC [internal].[usp_AUTHENTICATE_user_file_id] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀    㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ  ✀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀⸀  䐀漀渀✀琀 搀漀 琀栀攀 渀攀砀琀 挀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
					 BEGIN -- Check if the file is free from edit restrictions which exclude the current user਀ऀऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开昀爀攀攀崀  
 							@fileid_tocheck =  @fileid,਀ऀऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀昀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
							IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 昀椀氀攀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 爀攀猀琀爀椀挀琀椀漀渀猀 眀栀椀挀栀 搀漀 渀漀琀 椀渀挀氀甀搀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
									SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
									EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䔀搀倀攀爀洀一漀琀䘀爀攀攀✀Ⰰ  
										@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
										SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid),  '.  ',  @tempmessage);਀ऀऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileEdPermNotFree');਀ऀऀऀऀऀऀऀऀ䔀一䐀 
					 END -- End checking if the file is free from edit restrictions which exclude the current user਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 昀椀氀攀 椀搀 椀猀 瘀愀氀椀搀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
		 -- End checking the file id਀ 
         -- Check the file group id਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL;਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀搀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 琀栀愀琀 昀椀氀攀 最爀漀甀瀀 椀搀 攀砀椀猀琀猀 
		   BEGIN -- Check the file group id਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				             FROM xref.file_group_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'FileGroupIdNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
਀ऀऀऀऀ䔀一䐀 
		     ELSE  -- The file group ID does exist.  Check that the user has edit permission for the file group਀ऀऀऀ   䈀䔀䜀䤀一 
					EXEC [internal].[usp_AUTHENTICATE_fl_grp_ed_pm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀最爀漀甀瀀椀搀开琀漀挀栀攀挀欀 㴀  䀀昀椀氀攀最爀漀甀瀀椀搀Ⰰ 
						@user_authentication_reslt_fgep = @filegroupauthstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀最爀漀甀瀀愀甀琀栀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- The user does not have edit permission for the file group਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀    㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'NoFileGrpEdPerm', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀最爀漀甀瀀椀搀⤀Ⰰ  ✀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀瀀䔀搀倀攀爀洀✀⤀㬀 
							END਀ऀऀऀ   䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀⸀ 
           END -- End checking the file group id.਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass' -- Only do this check if both the file id and the file group id are valid਀ऀ    䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT file_group_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀  
						 WHERE           file_id = @fileid਀ऀऀऀऀऀऀ       䄀一䐀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
			   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 
		       WHERE file_group_id = @filegroupid਀ऀऀऀ         䄀一䐀   昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开椀渀琀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 昀椀氀攀 琀漀 椀渀琀攀最攀爀 瘀愀氀甀攀 氀椀渀欀⸀ 
-- Authenticates both controller and editor਀ 
-- Input is a file id and a file integer name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_int_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
			 SET @fileintnameid = NULL;਀ 
		  -- Check the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀渀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @fileintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀渀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file int name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file int name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT file_int_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 
			 				WHERE file_int_name_id = @fileintnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀  
		  WHERE              file_id = @fileid਀ऀऀ        䄀一䐀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 
-- Authenticates both controller and editor਀ 
-- Input is the multi-select list id - attribute id - file id triplet to delete.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀  
     @fileid bigint                    = NULL,਀     䀀昀椀氀攀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @filemsattrid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	 IF @fileid = 0਀ऀऀ匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	 IF @filemslistid = 0਀ऀऀ匀䔀吀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if a record ID has not been supplied਀ऀ 䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀⤀ 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  ਀ऀ        ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END		 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			  IF (@data_validation_status = 'Pass' ਀ऀऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀  
								    FROM file_attr.file_multi_select_links ਀ऀऀऀऀऀऀऀ       圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀     㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
									     AND file_id         = @fileid਀ऀऀऀऀऀऀऀऀऀ     䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ 䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
				WHERE file_ms_list_id     = @filemslistid਀ऀऀऀऀऀ  䄀一䐀 昀椀氀攀开椀搀         㴀 䀀昀椀氀攀椀搀 
					  AND file_ms_attr_id = @filemsattrid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
-- Authenticates both controller and editor਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀ऀ 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
     @peoplelistid bigint              = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to edit the file metadata਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 				@file_id_to_check_ep =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
				END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT file_id਀ऀऀ                   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
					      WHERE file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, ('ID: ' + CONVERT(nvarchar(20), @peoplelistid) + '  ' + @tempmessage));਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM people.file_to_people_list_links ਀ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
				  AND people_list_id = @peoplelistid਀ऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_file_radiob_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description: Deletes a file radio button attribute link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_radiob_link]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
	  IF @tempuserauth_status = 'Pass'   ਀ऀऀ䈀䔀䜀䤀一 
		   SET @userauthentication_status = 'Pass';਀ऀऀ   匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
		END਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @file_radioblistid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file radio button list id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ 
 ਀ऀऀऀⴀⴀ  䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
							     FROM file_attr.file_radio_button_links਀ऀऀऀ ऀऀऀऀ    圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 
								              AND file_id = @fileid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
			-- Check if the list id is restricted and if the user does not have controller permission.਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT restricted਀ऀऀऀ                 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
							WHERE file_radiob_list_id = @file_radioblistid਀ऀऀऀऀऀऀऀ      䄀一䐀 爀攀猀琀爀椀挀琀攀搀 㴀 ✀吀爀甀攀✀⤀ 
			   AND @iscontroller = 'No'਀ऀऀऀ    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䰀椀渀欀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoLinkPermission.');਀ऀऀऀ    䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
	           WHERE                 file_id = @fileid਀ऀऀऀ         䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开爀攀愀氀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䐀攀氀攀琀攀猀 愀 昀椀氀攀 琀漀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 氀椀渀欀⸀ 
-- Authenticates both controller and editor਀ 
-- Input is a file id and a file real name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_real_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 　 
			 SET @filerealnameid = NULL;਀ 
		  -- Check the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filerealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file real name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_real_name_id = @filerealnameid) -- Check if the file real name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ 
 		  -- Check that the record exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
							 FROM file_attr.file_real_number_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 
							            AND file_id = @fileid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM file_attr.file_real_number_values ਀ऀऀ  圀䠀䔀刀䔀               昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		        AND file_real_name_id = @filerealnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
	਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_file_text_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Deletes a text value to file link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 愀 昀椀氀攀 琀攀砀琀 渀愀洀攀 椀搀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开琀攀砀琀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @filetextnameid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 㴀 　 
			 SET @filetextnameid = NULL;਀ 
		  -- Check the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filetextnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀攀砀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTextNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file text name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_free_text_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_free_text_name_id = @filetextnameid) -- Check if the file text name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TextIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 
			 				WHERE file_free_text_name_id = @filetextnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀  
  		       WHERE                     file_id = @fileid਀ऀऀ              䄀一䐀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_file_to_cm_obj_ms_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
-- which links a common object to a file via a multi-select list਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开琀漀开挀洀开漀戀樀开洀猀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀  戀椀最椀渀琀                  㴀 一唀䰀䰀Ⰰ 
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to edit the file metadata਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 				@file_id_to_check_ep =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
				END਀ 
		 -- Check the common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀ऀऀऀऀऀ 
				ELSE ਀ऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.file_to_com_obj_ms_list_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀  昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					           AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ           䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀ ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀  
		      WHERE  file_id  = @fileid਀ऀऀऀ         䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					 AND common_object_id      = @commonobjectid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Deletes a record in table file_to_com_obj_radiob_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 昀椀氀攀 瘀椀愀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
-- Authenticates both controller and editor਀ 
-- Input is a file id, a common object list id and a common object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_to_com_obj_rb_link]਀ 
     @fileid  bigint                  = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to edit the file metadata਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
							SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
								SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
								SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);					਀ऀऀऀऀ䔀䰀匀䔀  
					SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(20), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.file_to_com_obj_radiob_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀  昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					           AND common_object_list_id = @commonobjlistid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(20), @fileid), ' ', CONVERT(nvarchar(20), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM com_obj.file_to_com_obj_radiob_links ਀ऀऀ      圀䠀䔀刀䔀  昀椀氀攀开椀搀  㴀 䀀昀椀氀攀椀搀 
			         AND common_object_list_id = @commonobjlistid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
	   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
-- Authenticates both controller and editor਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_file_to_function_link] ਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
     @functionid bigint                = NULL,  ਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)         = 'Fail', -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass. ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		     SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT file_id਀ऀऀ                   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
					      WHERE file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM people.file_to_function_links ਀ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
				  AND function_id = @functionid਀ऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开甀猀攀爀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䐀攀氀攀琀攀 愀 爀攀挀漀爀搀 昀爀漀洀 昀椀氀攀开甀猀攀爀开氀椀渀欀猀 
-- Authenticates both controller and editor਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀ऀ 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开昀椀氀攀开甀猀攀爀开氀椀渀欀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
     @sidid bigint                     = NULL,਀     䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to edit the file metadata਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 				@file_id_to_check_ep =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET  @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
				END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT file_id਀ऀऀ                   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀 
					      WHERE file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀 
						    AND general_field_name_id = @genfield_nameid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀ 
  -- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM people.file_to_user_links ਀ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
				  AND sid_id = @sidid਀ऀऀऀऀ  䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_tag_doc_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 搀漀挀甀洀攀渀琀 琀愀最 琀漀 搀漀挀甀洀攀渀琀 氀椀渀欀⸀ 
-- Authenticates for both controller and editor. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开搀漀挀开氀椀渀欀崀  
਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @documentid nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL OR @documentid = ''਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
	  -- Check if a tag was supplied਀ऀ  䤀䘀 䀀琀愀最开椀搀 㴀 　  
	    SET @tag_id = NULL;਀ऀ  䤀䘀 䀀琀愀最开椀搀 䤀匀 一唀䰀䰀 
	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoTagID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䤀䐀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
		 BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 吀愀最 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ 
਀ 
-- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 䄀一䐀 
    NOT EXISTS (SELECT tag_doc_link_id਀ऀ              䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
			     WHERE    doc_id਀ऀऀऀ           㴀 䀀搀漀挀甀洀攀渀琀椀搀 
			       AND    tag_id਀ऀऀऀऀ       㴀 䀀琀愀最开椀搀⤀ 
			 BEGIN -- The record does not exist਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			 END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ 
		-- End data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRANSACTION;਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ䐀䔀䰀䔀吀䔀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
		 WHERE    doc_id਀ऀऀऀ   㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		   AND    tag_id਀ऀऀऀ   㴀 䀀琀愀最开椀搀ऀऀ             
         COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_tag_group_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 琀愀最 琀漀 琀愀最 最爀漀甀瀀 氀椀渀欀⸀ 
-- Authenticates for both controller and editor. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开最爀漀甀瀀开氀椀渀欀崀  
਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @tag_groupid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set will be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
			 BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 END਀ 
			 ELSE  -- Check if the user has rights to edit the tag਀ऀऀऀऀ  䈀䔀䜀䤀一 
					EXEC [internal].[usp_AUTHENTICATE_tag_edit]਀ऀऀऀऀऀऀ 䀀琀愀最开椀搀开攀瀀 㴀 䀀琀愀最开椀搀Ⰰ 
						 @user_authentication_result_tag = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN਀ऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 							   SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_id), '  ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
							   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagPermission');		   ਀ऀऀऀऀऀऀ 䔀一䐀 
				  END਀ 
	  --  Check the tag group ID.਀ऀ   
	  	  IF @tag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_groupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 最爀漀甀瀀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGroupID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- Tag group has been supplied.  Check if it exists. ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @tag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						  SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_groupid), '  ', @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
਀               ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀甀琀栀攀渀琀椀挀愀琀攀搀 昀漀爀 琀栀攀 琀愀最 最爀漀甀瀀⸀ 
				ELSE਀ऀऀऀऀऀ䈀䔀䜀䤀一 
					    EXEC [internal].[usp_AUTHENTICATE_tag_group]਀ऀऀऀऀऀऀऀ䀀琀愀最开最爀漀甀瀀椀搀开攀瀀 㴀 䀀琀愀最开最爀漀甀瀀椀搀Ⰰ 
							@user_authentication_result_tg = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id   = 'NoTagGrpPermission', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开最爀漀甀瀀椀搀⤀Ⰰ ✀  ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀瀀倀攀爀洀椀猀猀椀漀渀✀⤀㬀ऀऀ    
							END਀ऀऀऀऀऀ䔀一䐀 
 ਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	 IF @data_validation_status = 'Pass' ਀ऀ    䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀  
		                  FROM tagging.tag_to_tag_group_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀    琀愀最开椀搀 
					           = @tag_id਀ऀऀऀऀऀ       䄀一䐀    琀愀最开最爀漀甀瀀开椀搀  
					           = @tag_groupid)਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  
	    ਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE tagging.tag_to_tag_group_links ਀ऀऀ  圀䠀䔀刀䔀   琀愀最开椀搀  
		        = @tag_id਀ऀऀ    䄀一䐀    琀愀最开最爀漀甀瀀开椀搀 
			    = @tag_groupid਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开琀爀攀攀开戀爀愀渀挀栀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 29-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Delete a tag tree branch.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_tag_tree_branch] ਀ 
     @tag_tree_node_id bigint         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀琀愀最开琀爀攀攀开椀搀 戀椀最椀渀琀                     㴀 一唀䰀䰀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
 -- Check the tag tree node ID਀ 䤀䘀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 　 
    SET @tag_tree_node_id = NULL;਀ 䤀䘀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 䤀匀 一唀䰀䰀 
 	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一漀搀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀  䔀䰀匀䔀 ⴀⴀ 䄀 渀漀搀攀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
    BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		                 FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @tag_tree_node_id)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TreeNodeNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
	END਀ 
 -- Check if the node is root.  The root node cannot be deleted.਀   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
                FROM tagging.tag_tree_nodes਀               圀䠀䔀刀䔀    琀愀最开琀爀攀攀开渀漀搀攀开椀搀  
			         = @tag_tree_node_id਀                 䄀一䐀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀ 
                 AND tag_tree_id = (SELECT tag_tree_id਀                                      䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
                                     WHERE tag_tree_node_id = @tag_tree_node_id)) ਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀猀刀漀漀琀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IsRootNode');		   ਀ऀऀऀ䔀一䐀  
 ਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
਀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
     BEGIN TRANSACTION;਀ 
  SET @tag_tree_id = (SELECT tag_tree_id਀                        䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
					   WHERE tag_tree_node_id਀ऀऀऀऀऀ         㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀㬀 
਀     ⴀⴀ 䐀攀氀攀琀攀 愀氀氀 搀攀猀挀攀渀搀愀渀琀 渀漀搀攀猀 
     DELETE FROM tagging.tag_tree_nodes਀           圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
		         = @tag_tree_id਀             䄀一䐀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀ 
                 (SELECT tag_tree_hierarchyid਀                    䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
                   WHERE tag_tree_node_id = @tag_tree_node_id)) = 1;਀ 
		 --Delete the node ਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
		      WHERE tag_tree_node_id ਀ऀऀ            㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀㬀ऀ 
਀ 
     COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_tag_tree_node]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀 愀 琀愀最 琀爀攀攀 渀漀搀攀⸀ 
-- Authenticates for both controller and editor. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开琀爀攀攀开渀漀搀攀崀  
਀     䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
        @node_hierarchyid hierarchyid,਀        䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@tag_treeid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  SET @tag_treeid = (SELECT tag_tree_id਀                       䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
					  WHERE tag_tree_node_id਀ऀऀऀऀऀ        㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀㬀 
 -- Check the tag tree node ID਀ 䤀䘀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 　 
    SET @tag_tree_node_id = NULL;਀ 䤀䘀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 䤀匀 一唀䰀䰀 
 	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一漀搀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀  䔀䰀匀䔀 ⴀⴀ 䄀 渀漀搀攀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
    BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		                 FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @tag_tree_node_id)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TreeNodeNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
 ਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 琀愀最 琀爀攀攀 
					EXEC [internal].[usp_AUTHENTICATE_tag_tree]਀ऀऀऀऀऀ   䀀琀愀最开琀爀攀攀椀搀开攀瀀 㴀 䀀琀愀最开琀爀攀攀椀搀Ⰰ 
					   @user_authentication_result_tt = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					  BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoTagTreePerm', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀倀攀爀洀⸀✀⤀㬀 
਀ऀऀऀऀऀ  䔀一䐀 
	END਀ 
 -- Check if the node is root.  The root node cannot be deleted.਀   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
                FROM tagging.tag_tree_nodes਀               圀䠀䔀刀䔀    琀愀最开琀爀攀攀开渀漀搀攀开椀搀  
			         = @tag_tree_node_id਀                 䄀一䐀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀ 
                 AND tag_tree_id = (SELECT tag_tree_id਀                                      䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
                                     WHERE tag_tree_node_id = @tag_tree_node_id)) ਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀猀刀漀漀琀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IsRootNode');		   ਀ऀऀऀ䔀一䐀  
 ਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  
	 BEGIN TRY਀       䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
		 SELECT @parent_hierarchyid = tag_tree_hierarchyid.GetAncestor(1)਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
		  WHERE tag_tree_node_id = @tag_tree_node_id;਀ 
		 SELECT @node_hierarchyid = tag_tree_hierarchyid਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
		  WHERE tag_tree_node_id = @tag_tree_node_id;਀ 
		 --Delete the node ਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
		      WHERE tag_tree_node_id ਀ऀऀ            㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀㬀ऀ 
਀ 圀䤀吀䠀 刀攀挀甀爀猀椀瘀攀䌀吀䔀 䄀匀 ⠀ 
     -- Anchor member: direct children of the deleted node਀     匀䔀䰀䔀䌀吀 
         tag_tree_node_id,਀         琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
         0 AS Level਀     䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
     WHERE tag_tree_hierarchyid.GetAncestor(1) = @node_hierarchyid਀       䄀一䐀 琀愀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀椀搀 
਀     唀一䤀伀一 䄀䰀䰀 
਀     ⴀⴀ 刀攀挀甀爀猀椀瘀攀 洀攀洀戀攀爀㨀 挀栀椀氀搀爀攀渀 漀昀 挀栀椀氀搀爀攀渀 
     SELECT਀         琀⸀琀愀最开琀爀攀攀开渀漀搀攀开椀搀Ⰰ 
         t.tag_tree_hierarchyid,਀         爀⸀䰀攀瘀攀氀 ⬀ ㄀ 
     FROM tagging.tag_tree_nodes t਀     䤀一一䔀刀 䨀伀䤀一 刀攀挀甀爀猀椀瘀攀䌀吀䔀 爀 伀一 琀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䄀渀挀攀猀琀漀爀⠀㄀⤀ 㴀 爀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
     WHERE t.tag_tree_id = @tag_treeid਀ ⤀Ⰰ 
 -- CTE to order the nodes for update਀ 伀爀搀攀爀攀搀一漀搀攀猀 䄀匀 ⠀ 
     SELECT਀         琀愀最开琀爀攀攀开渀漀搀攀开椀搀Ⰰ 
         tag_tree_hierarchyid,਀         䰀攀瘀攀氀Ⰰ 
         ROW_NUMBER() OVER (ORDER BY Level) AS RowNum਀     䘀刀伀䴀 刀攀挀甀爀猀椀瘀攀䌀吀䔀 
 )਀ ⴀⴀ 唀瀀搀愀琀攀 琀栀攀 渀漀搀攀猀 氀攀瘀攀氀 戀礀 氀攀瘀攀氀 
 UPDATE t਀ 匀䔀吀 琀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䐀攀猀挀攀渀搀愀渀琀⠀ 
     t.tag_tree_hierarchyid.GetReparentedValue(@node_hierarchyid, NULL),਀     一唀䰀䰀 
 )਀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 琀 
 INNER JOIN OrderedNodes o ON t.tag_tree_node_id = o.tag_tree_node_id਀ 伀倀吀䤀伀一 ⠀䴀䄀堀刀䔀䌀唀刀匀䤀伀一 　⤀㬀 
਀ ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀     䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_wf_funct_output_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀⸀   
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀昀开昀甀渀挀琀开漀甀琀瀀甀琀开昀椀氀攀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ     
	 @instance_step_id bigint         = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
						@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
		 -- End checking the file id਀ 
	  IF @instance_step_id = 0਀ऀऀ 匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an instance step id was supplied.਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the instance step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
							  FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 ⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 椀搀 
	  IF @functionid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
      IF @functionid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionID.');਀ऀऀऀ 䔀一䐀 
		    -- Check if the function id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctionIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
		 ਀ 
	 -- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
		  WHERE    file_id਀ऀऀ        㴀 䀀昀椀氀攀椀搀ऀऀ   
		    AND workflow_instance_step_id ਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND    function_id ਀ऀऀऀऀ㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- Record does not exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀  䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM workflow_instances.workflow_function_output_files਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =       @instance_step_id਀ऀऀ    䄀一䐀    昀甀渀挀琀椀漀渀开椀搀  
				= @functionid ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_wf_input_step_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 氀椀渀欀 昀爀漀洀 愀 昀椀氀攀 琀漀 愀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀渀瀀甀琀⸀   
-- Input is a file id and an instance step id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_DEL_wf_input_step_file] ਀          
	 @fileid bigint                   = NULL,਀ऀ 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
	  IF @fileid = 0਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	  IF @fileid IS NULL -- Check if a file id was supplied਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀✀⤀㬀 
		 END -- End responding to no file id supplied਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀   
		 BEGIN	-- Check if the file id exists and the user has permission to access the file, NOT if the user has edit permission for the file.਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid),  '.  ',  @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist');਀ऀऀऀऀऀ䔀一䐀 
		 END   -- End checking if file id is valid and the user has permission to access it਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
਀ 
	  IF @input_step_id = 0਀ऀऀ 匀䔀吀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an instance step id was supplied.਀ऀ  䤀䘀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the instance step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
							  FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 ⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀ऀऀ  
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	 IF NOT EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀猀椀瀀⸀昀椀氀攀开椀搀 
		   FROM workflow_instances.workflow_step_input_files AS wsip਀ऀऀ  圀䠀䔀刀䔀 眀猀椀瀀⸀昀椀氀攀开椀搀  
		        =   @fileid਀ऀऀ    䄀一䐀 眀猀椀瀀⸀眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀  
				=            @input_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀ䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM workflow_instances.workflow_step_input_files਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀  
		        = @fileid਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀  
				=       @input_step_id਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_DEL_wf_people_output_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀⸀  吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 挀愀渀 漀渀氀礀 搀攀氀攀琀攀 琀栀攀椀爀 漀眀渀 爀攀挀漀爀搀猀⸀  
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开眀昀开瀀攀漀瀀氀攀开漀甀琀瀀甀琀开昀椀氀攀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ     
	 @instance_step_id bigint         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @sidid bigint,                                 -- The user id਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
		 SET @instance_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @instance_step_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀ 䔀一䐀 
	  ELSE -- An instance step id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_instance_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
							 WHERE workflow_instance_step_id = @instance_step_id ) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
	 -- Check the person id਀ऀ ⴀⴀ 刀攀琀爀椀攀瘀攀 琀栀攀 猀椀搀椀搀 
		  SET @sidid = (SELECT sl.sid_id਀ऀऀऀ              䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			  		     WHERE sl.sid = @connectedusersid)	਀ 
		 ਀ 
	 -- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
	    (SELECT wpof.workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 䄀匀 眀瀀漀昀 
		  WHERE wpof.file_id਀ऀऀ        㴀 䀀昀椀氀攀椀搀ऀऀ   
		    AND wpof.workflow_instance_step_id ਀ऀऀ        㴀            䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND wpof.sid_id ਀ऀऀऀऀ㴀   䀀猀椀搀椀搀⤀ 
		BEGIN -- Record does not exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀  䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     DELETE FROM workflow_instances.workflow_person_output_files਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =       @instance_step_id਀ऀऀ    䄀一䐀    猀椀搀开椀搀  
				= @sidid ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'DeleteError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DeleteError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_book_in]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Books a document in.਀ⴀⴀ 䄀渀 攀搀椀琀漀爀 挀愀渀 戀漀漀欀 椀渀 愀渀礀 搀漀挀甀洀攀渀琀 琀栀攀礀 栀愀瘀攀 戀漀漀欀攀搀 漀甀琀 愀渀搀 猀琀椀氀氀 
-- have edit permission rights.਀ⴀⴀ 䄀 挀漀渀琀爀漀氀氀攀爀 挀愀渀 戀漀漀欀 椀渀 愀渀礀 搀漀挀甀洀攀渀琀 昀漀爀 眀栀椀挀栀 琀栀攀礀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 爀椀最栀琀猀 
-- and which is currently booked out.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_book_in]਀ 
	 @documentid nvarchar(50)         = '',  -- Mandatory਀ऀ 䀀挀漀洀洀攀渀琀猀 渀瘀愀爀挀栀愀爀⠀㐀　　　⤀         㴀 ✀✀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	 @release_num nvarchar(50)        = '',  -- Optional਀ऀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	 @booking_id bigint               = NULL OUTPUT,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userid bigint                          = NULL,਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@iscontroller nvarchar(3)               = 'No',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀    
		BEGIN਀ऀऀ   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
		   SET @iscontroller = 'Yes';਀ऀऀ䔀一䐀   
  ਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		-- Retrieve user ID਀ऀऀ匀䔀吀 䀀甀猀攀爀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
		                 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 搀愀琀愀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not has data edit permission for the document਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ   
਀ 
		IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
		   		  -- Check if the document is not booked out਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开椀搀 
							 FROM base.document_id_list AS dil							 ਀ऀऀऀऀऀ   䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
					           ON  dil.booking_id਀ऀऀऀऀऀऀऀ      㴀 戀氀⸀戀漀漀欀椀渀最开椀搀 
			 				WHERE dil.doc_id = @documentid਀ऀऀऀऀऀऀऀ      䄀一䐀 戀氀⸀戀漀漀欀椀渀最开猀琀愀琀甀猀 㴀 ✀伀甀琀✀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocNotBookedOut', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀一漀琀䈀漀漀欀攀搀伀甀琀⸀✀⤀㬀 
				END਀ऀऀ  䔀一䐀 
਀ऀऀ   
਀ऀⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 挀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 眀愀猀 戀漀漀欀攀搀 漀甀琀 戀礀 琀栀愀琀 甀猀攀爀⸀  
		IF @data_validation_status = 'Pass'਀ऀऀ   䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀一漀✀ 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开椀搀 
							 FROM base.document_id_list AS dil							 ਀ऀऀऀऀऀ   䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 䄀匀 戀氀 
					           ON  dil.booking_id਀ऀऀऀऀऀऀऀ      㴀 戀氀⸀戀漀漀欀椀渀最开椀搀 
			 				WHERE dil.doc_id = @documentid਀ऀऀऀऀऀऀऀ      䄀一䐀 戀氀⸀甀猀攀爀开椀搀 㴀 䀀甀猀攀爀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotBOUser', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䈀伀唀猀攀爀⸀✀⤀㬀 
				END਀ऀऀ  䔀一䐀 
਀ 
		  -- Check the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ 
		  IF @fileid IS NOT NULL਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
						@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一 
	  BEGIN TRY਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最  
		             (doc_id,      booking_status, user_id, comments,                      release_number)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ✀䤀渀✀Ⰰ           䀀甀猀攀爀椀搀Ⰰ 䤀匀一唀䰀䰀⠀䀀挀漀洀洀攀渀琀猀Ⰰ ✀✀⤀Ⰰ 䤀匀一唀䰀䰀⠀䀀爀攀氀攀愀猀攀开渀甀洀Ⰰ ✀✀⤀⤀ 
        ਀ऀऀ匀䔀吀 䀀戀漀漀欀椀渀最开椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
਀ऀऀ唀倀䐀䄀吀䔀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 
		   SET booking_id = @booking_id਀ऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
਀ऀऀ 䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		  BEGIN਀ऀऀ   䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀戀漀漀欀攀搀开椀渀开昀椀氀攀猀 
		               (booking_id, file_id)਀ऀऀऀऀ嘀䄀䰀唀䔀匀 ⠀䀀戀漀漀欀椀渀最开椀搀Ⰰ 䀀昀椀氀攀椀搀⤀ 
  ਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				SELECT file_id ਀ऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀  
				 WHERE doc_id = @documentid ਀ऀऀऀऀ   䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
			           )਀ऀऀऀऀ䈀䔀䜀䤀一 
					INSERT INTO xref.file_to_document_links ਀ऀऀऀऀऀ            ⠀搀漀挀开椀搀Ⰰ 昀椀氀攀开椀搀⤀ 
					     VALUES (@documentid, @fileid);਀ऀऀऀऀ䔀一䐀 
		  END਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		COMMIT;਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     ROLLBACK;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_book_in_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Links a file to a booking in record.    ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开戀漀漀欀开椀渀开昀椀氀攀崀 
਀ऀ 䀀戀漀漀欀椀渀最开椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userid bigint                          = NULL,਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀                㴀 ✀✀Ⰰ ⴀⴀ 吀栀攀 搀漀挀甀洀攀渀琀 椀搀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 琀栀攀 爀攀挀漀爀搀 琀漀 戀攀 搀攀氀攀琀攀搀⸀  
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀搀攀愀搀氀椀渀攀 䐀䄀吀䔀吀䤀䴀䔀                      㴀 一唀䰀䰀Ⰰ ⴀⴀ 䐀攀愀搀氀椀渀攀 昀漀爀 挀漀洀瀀氀攀琀椀渀最 愀 戀漀漀欀ⴀ椀渀⸀  
		@timebox INT                            = 0,  -- Number of minutes for completing a book-in. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀   
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀⴀⴀ 刀攀琀爀椀攀瘀攀 甀猀攀爀 䤀䐀 
		SET @userid = (SELECT sid_id਀ऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						WHERE sl.sid = @connectedusersid)਀ 
਀ 
-- Check if the booking id exists.਀ 
-- Check that the booking id is the most recent booking record id for that user਀ⴀⴀ 昀漀爀 琀栀愀琀 搀漀挀甀洀攀渀琀 愀渀搀 椀猀 愀 戀漀漀欀攀搀ⴀ椀渀 爀攀挀漀爀搀 
		IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
		    SET @documentid = (SELECT doc_id਀ऀऀऀ                     䘀刀伀䴀 戀愀猀攀⸀戀漀漀欀椀渀最开氀漀最 
								WHERE booking_id = @booking_id)਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀  
				(਀ऀऀऀऀ匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开椀搀 
				  FROM base.booking_log AS bl਀ऀऀऀऀ 圀䠀䔀刀䔀 戀氀⸀甀猀攀爀开椀搀 㴀 䀀甀猀攀爀椀搀 
				   AND bl.booking_id = @booking_id਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开猀琀愀琀甀猀 㴀 ✀䤀渀✀ 
				   AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				 )਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䈀䤀刀攀挀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidBIRec.');਀ऀऀऀऀ䔀一䐀 
		  END਀ 
਀ऀऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 戀漀漀欀椀渀最ⴀ椀渀 搀攀愀搀氀椀渀攀 栀愀猀 攀砀瀀椀爀攀搀⸀ 
		-- The booking deadline is the time when the document was booked in plus the booking time box in minutes. ਀䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	BEGIN਀ऀऀ匀䔀䰀䔀䌀吀 䀀琀椀洀攀戀漀砀 㴀 最猀最⸀戀漀漀欀椀渀最开椀渀开琀椀洀攀开戀漀砀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀㬀 
਀ऀऀ匀䔀吀 䀀搀攀愀搀氀椀渀攀 㴀 䐀䄀吀䔀䄀䐀䐀⠀䴀䤀一唀吀䔀Ⰰ 䀀琀椀洀攀戀漀砀Ⰰ  
				(਀ऀऀऀऀ匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开搀愀琀攀 
				  FROM base.booking_log AS bl਀ऀऀऀऀ 圀䠀䔀刀䔀 戀氀⸀甀猀攀爀开椀搀 㴀 䀀甀猀攀爀椀搀 
				   AND bl.booking_id = @booking_id਀ऀऀऀऀ   䄀一䐀 戀氀⸀戀漀漀欀椀渀最开猀琀愀琀甀猀 㴀 ✀䤀渀✀ 
				   AND bl.booking_date = ਀ऀऀऀऀ   ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀戀漀漀欀椀渀最开搀愀琀攀⤀ 
					  FROM base.booking_log਀ऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				 ));਀ 
		IF @deadline < GETDATE()਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀攀愀搀氀椀渀攀 栀愀猀 攀砀瀀椀爀攀搀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䈀欀最吀椀洀攀䈀漀砀䔀砀瀀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on BkgTimeBoxExp.');਀ऀऀऀऀ䔀一䐀 
     END਀ 
		  -- Check the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
-- Check if an existing record exists਀  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 戀漀漀欀椀渀最开椀搀 
               FROM base.booked_in_files਀ऀऀऀ  圀䠀䔀刀䔀 戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀 
			    AND file_id = @fileid)਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ 䔀一䐀 
਀ 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一 
	  BEGIN TRY਀ 
		   INSERT INTO base.booked_in_files਀ऀऀ               ⠀戀漀漀欀椀渀最开椀搀Ⰰ 昀椀氀攀开椀搀⤀ 
				VALUES (@booking_id, @fileid)਀   
			IF NOT EXISTS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀  
				  FROM xref.file_to_document_links ਀ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀  
				   AND file_id = @fileid਀ऀऀऀ           ⤀ 
				BEGIN਀ऀऀऀऀऀ䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀  
					            (doc_id, file_id)਀ऀऀऀऀऀ     嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀昀椀氀攀椀搀⤀㬀 
				END਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		COMMIT;਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     ROLLBACK;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_book_out]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Books a document out.਀ⴀⴀ 䄀渀 攀搀椀琀漀爀 漀爀 挀漀渀琀爀漀氀氀攀爀 挀愀渀 戀漀漀欀 漀甀琀 愀渀礀 搀漀挀甀洀攀渀琀 眀栀椀挀栀 琀栀攀礀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀渀搀 眀栀椀挀栀 
-- has not already been booked out.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_book_out]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀挀漀洀洀攀渀琀猀 渀瘀愀爀挀栀愀爀⠀㐀　　　⤀         㴀 ✀✀Ⰰ 
	 @booking_id bigint               = NULL OUTPUT,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userid bigint                          = NULL,਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		-- Retrieve user ID਀ऀऀ匀䔀吀 䀀甀猀攀爀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
		                 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 搀愀琀愀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not has data edit permission for the document਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ   
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 愀爀攀愀搀礀 戀漀漀欀攀搀 漀甀琀 
		IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			IF EXISTS (SELECT bl.booking_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀ऀऀऀऀऀऀऀ  
					   INNER JOIN base.booking_log AS bl਀ऀऀऀऀऀ           伀一  搀椀氀⸀戀漀漀欀椀渀最开椀搀 
							      = bl.booking_id਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
							      AND bl.booking_status = 'Out')਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䈀漀漀欀攀搀伀甀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocBookedOut.');਀ऀऀऀऀ䔀一䐀 
		  END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);;਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	BEGIN TRANSACTION਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ 
	     INSERT INTO base.booking_log ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      戀漀漀欀椀渀最开猀琀愀琀甀猀Ⰰ 甀猀攀爀开椀搀Ⰰ 挀漀洀洀攀渀琀猀Ⰰ 爀攀氀攀愀猀攀开渀甀洀戀攀爀⤀ 
		      VALUES (@documentid, 'Out',          @userid, @comments, '')਀         
		SET @booking_id = SCOPE_IDENTITY();਀ 
		UPDATE base.document_id_list਀ऀऀ   匀䔀吀 戀漀漀欀椀渀最开椀搀 㴀 䀀戀漀漀欀椀渀最开椀搀 
		 WHERE doc_id = @documentid;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		COMMIT;਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     ROLLBACK;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_date_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description: Inserts a date value for a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 椀搀 愀渀搀 愀 搀愀琀攀 瘀愀氀甀攀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开搀愀琀攀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docdatenameid bigint            = NULL,਀ऀ 䀀搀愀琀攀瘀愀氀甀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀愀琀攀猀琀礀氀攀 椀渀琀                          㴀 ✀✀Ⰰ ⴀⴀ 䐀愀琀攀 猀琀礀氀攀 昀爀漀洀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 　 
			 SET @docdatenameid = NULL;਀ऀऀ  䤀䘀 䀀搀愀琀攀瘀愀氀甀攀 㴀 ✀✀ 
			 SET @datevalue = NULL;਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docdatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_date_name_id = @docdatenameid) -- Check if the doc date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
		IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
			IF EXISTS (SELECT doc_date_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 
			 				WHERE doc_date_name_id = @docdatenameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀           䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO doc_attr.doc_date_values ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      搀漀挀开搀愀琀攀开渀愀洀攀开椀搀Ⰰ 搀愀琀攀开瘀愀氀甀攀⤀ 
		      VALUES (@documentid, @docdatenameid,   @datevalue)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开昀甀渀挀琀开氀椀猀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table doc_to_function_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 琀漀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id and a function list id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_funct_list_link]਀ 
     @documentid  nvarchar(50)        = NULL,਀     䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
		  IF @functionlistid = 0਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check function list id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the function list id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                 FROM people.function_list_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT doc_id਀ऀऀ               䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
					  WHERE doc_id = @documentid਀ऀऀऀऀऀ        䄀一䐀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
							AND general_field_name_id = @genfield_nameid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀  
		             (doc_id,  function_list_id,     general_field_name_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table doc_to_function_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 琀漀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id, function id and general field name id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_function_link]਀ 
     @documentid  nvarchar(50)        = NULL,਀     䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		     SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 
		  IF @functionid = 0਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check function list id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the function list id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT doc_id਀ऀऀ               䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
					  WHERE doc_id = @documentid਀ऀऀऀऀऀ        䄀一䐀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
							AND general_field_name_id = @genfield_nameid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀  
		             (doc_id,  function_id,      general_field_name_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀昀甀渀挀琀椀漀渀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_group_link_restr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description: Inserts a document to document group link.਀ⴀⴀ 伀渀氀礀 瀀攀爀洀椀琀猀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 愀渀搀 搀漀挀甀洀攀渀琀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- Authenticates both controller and editor.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 愀渀搀 渀漀琀攀猀⸀ 
-- Output is a message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_group_link_restr]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @inputnotes nvarchar(max)        = '',਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
		SET @docgroupid = NULL;਀ 
		IF @docgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupId');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ 
	 -- Authenticate the user for the given document group਀ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	  EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀ    匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoDocGroupPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
		END਀ 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
਀ऀऀ   䔀䰀匀䔀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀  
			-- Check if the group has been linked to that document already਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT doc_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 
			 				WHERE doc_group_id = @docgroupid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀  
		             (doc_id,      doc_group_id,  notes)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ   䀀椀渀瀀甀琀渀漀琀攀猀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_int_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Inserts an integer value for a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 椀搀 愀渀搀 愀渀 椀渀琀攀最攀爀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开椀渀琀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docintnameid bigint             = NULL,਀ऀ 䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 搀愀琀愀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not has data edit permission for the document਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc integer name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 
							 FROM doc_attr.doc_integer_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 
							           AND doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀  
		             (doc_id,      doc_int_name_id,  int_value)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀搀漀挀椀渀琀渀愀洀攀椀搀Ⰰ    䀀椀渀琀攀最攀爀瘀愀氀甀攀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 搀漀挀甀洀攀渀琀 琀漀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Input is a document id, multi-select list id and multi-select attribute id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_multi_select_link]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @docmsattrid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　 
			 SET @docmslistid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 　  
			 SET @docmsattrid = NULL;਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
		  IF @docmslistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document multi-select attribute list has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_ms_list_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 
			  	 				 WHERE doc_ms_list_id = @docmslistid) -- Check if the attribute list id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @docmsattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
਀          ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀愀椀爀 攀砀椀猀琀猀 
		  IF @docmsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE    doc_ms_attr_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
								   AND    doc_ms_list_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀搀漀挀洀猀氀椀猀琀椀搀⤀  
					 BEGIN -- multi-select list id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
		  -- Multiple attributes from the same list are permitted, providing they are not duplicated਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 
			 				WHERE     doc_ms_list_id = @docmslistid਀ऀऀऀऀऀऀऀ      䄀一䐀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								  AND         doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO doc_attr.doc_multi_select_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      搀漀挀开洀猀开氀椀猀琀开椀搀Ⰰ 搀漀挀开洀猀开愀琀琀爀开椀搀⤀ 
		      VALUES (@documentid, @docmslistid,   @docmsattrid)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_people_list_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
-- which links a people list to a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀  渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 一唀䰀䰀Ⰰ 
     @peoplelistid bigint             = NULL,਀ऀ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)     = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid = ''਀ऀऀ     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
 	      -- Check the people list id਀ऀऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
			 SET @peoplelistid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @peoplelistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A people list id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
							WHERE people_list_id = @peoplelistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, (@tempmessage + '  ID:' + CONVERT(nvarchar(10), @peoplelistid)));਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist.');਀ऀऀऀऀ 䔀一䐀   
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT doc_id਀ऀऀ               䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
					  WHERE doc_id = @documentid਀ऀऀऀऀऀ        䄀一䐀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 
							AND general_field_name_id = @genfield_nameid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀  
		             (doc_id,  people_list_id,     general_field_name_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_radiob_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description: Inserts a document to radio button attribute link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 栀愀猀 漀渀氀礀 䔀搀椀琀漀爀 爀椀最栀琀猀 琀栀攀渀 愀挀挀攀猀猀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 漀渀氀礀 搀漀挀甀洀攀渀琀 椀搀猀 
-- for which they have edit permission. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开爀愀搀椀漀戀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docradioblistid bigint          = NULL,਀ऀ 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@iscontroller nvarchar(3)               = 'No',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀    
    BEGIN਀       匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
	   SET @iscontroller = 'Yes';਀ऀ䔀一䐀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀऀ        
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　 
			 SET @docradioblistid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　  
			 SET @docradiobattrid = NULL;਀ 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
		  IF @docradioblistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  ⴀⴀ 搀漀挀 椀搀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀瘀攀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN -- Check if the document ID exists and the user has permission to access the document and edit metadata਀ऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 					@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 漀爀 攀搀椀琀 椀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀䄀挀挀攀猀猀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT(@message , ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocIDAccess.'); ਀ऀऀऀऀऀ 䔀一䐀 
਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
								  FROM doc_attr.doc_radio_button_list_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ 
 			 END਀  
			-- Attribute list id is valid.  Check if it has been linked to that document already਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT doc_radiob_list_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
			 				WHERE doc_radiob_list_id = @docradioblistid਀ऀऀऀऀऀऀऀऀ  䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
			-- Check if the list id is restricted and if the user does not have controller permission.਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT restricted਀ऀऀऀ                 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
							WHERE doc_radiob_list_id = @docradioblistid਀ऀऀऀऀऀऀऀ      䄀一䐀 爀攀猀琀爀椀挀琀攀搀 㴀 ✀吀爀甀攀✀⤀ 
			   AND @iscontroller = 'No'਀ऀऀऀ    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䰀椀渀欀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoLinkPermission.');਀ऀऀऀ    䔀一䐀 
਀ 
		  -- Check if a doc radio button attribute id was supplied.  ਀ऀऀ  ⴀⴀ 一唀䰀䰀 椀猀 瀀攀爀洀椀琀琀攀搀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 椀猀 瘀愀氀椀搀⸀ 
		  IF @docradiobattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 瀀愀椀爀 攀砀椀猀琀猀 
				 IF NOT EXISTS (SELECT doc_radiob_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE doc_radiob_attr_id = @docradiobattrid਀ऀऀऀऀऀऀऀऀऀ   䄀一䐀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀⤀  
					 BEGIN -- Radio button list id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ  ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO doc_attr.doc_radio_button_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ      搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀Ⰰ 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀⤀ 
		      VALUES (@documentid, @docradioblistid,   @docradiobattrid)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		  SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_real_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Inserts a real value for a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 搀漀挀甀洀攀渀琀 爀攀愀氀 渀愀洀攀 椀搀 愀渀搀 愀 爀攀愀氀 渀甀洀戀攀爀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开爀攀愀氀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docrealnameid bigint            = NULL,਀ऀ 䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docrealnameid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docrealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_real_name_id = @docrealnameid) -- Check if the doc real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
							 FROM doc_attr.doc_real_number_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 
							            AND doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀  
		             (doc_id,      doc_real_name_id,  real_value)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀Ⰰ    䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开琀愀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a new document tag.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_tag] ਀ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀琀愀最渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀            㴀 一唀䰀䰀Ⰰ  
	 @description nvarchar(max)       = NULL,਀ऀ 䀀琀愀最开最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
     -- Check for duplicate record...਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @tagname = ''਀ऀऀ   匀䔀吀 䀀琀愀最渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开渀愀洀攀  
		 			 FROM tagging.doc_tags ਀ऀऀऀऀऀ圀䠀䔀刀䔀 琀愀最开渀愀洀攀 㴀 䀀琀愀最渀愀洀攀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀琀愀最渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀琀愀最渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀⤀㬀 
			END਀ 
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 最爀漀甀瀀⸀ 
  	 IF @tag_groupid = 0 ਀ऀ   匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
਀ऀ 䤀䘀 䀀琀愀最开最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
	   BEGIN਀   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀愀最 最爀漀甀瀀 攀砀椀猀琀猀⸀ 
			IF NOT EXISTS (SELECT tag_group_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
						    WHERE    tag_group_id ਀ऀऀऀऀऀऀऀऀ  㴀 䀀琀愀最开最爀漀甀瀀椀搀⤀ 
				BEGIN -- tag group id does not exist਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'TagGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀऀऀऀऀऀ 
   -- Check user rights to the tag group਀            䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   BEGIN਀ऀऀऀ     䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开最爀漀甀瀀崀 
				   @tag_groupid_ep = @tag_groupid,਀ऀऀऀऀ   䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀最 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				 IF @temp_userauth_status <> 'Pass'਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGrpPermission.');਀ऀऀऀऀ   䔀一䐀 
			   END਀ 
਀ऀ   䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  ਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     INSERT INTO tagging.doc_tags ਀ऀऀ             ⠀洀渀攀洀Ⰰ                   琀愀最开渀愀洀攀Ⰰ        搀攀猀挀爀 ⤀ 
		      VALUES (ISNULL(@mnemonic, ''), @tagname, ISNULL(@description, '') ); ਀ 
		 SET @newrecordid = SCOPE_IDENTITY();਀ 
		 IF @tag_groupid IS NOT NULL਀ऀऀ   䈀䔀䜀䤀一 
		    INSERT INTO tagging.tag_to_tag_group_links਀ऀऀऀ            ⠀琀愀最开椀搀Ⰰ        琀愀最开最爀漀甀瀀开椀搀⤀ 
				 VALUES (@newrecordid, @tag_groupid);਀ऀऀ   䔀一䐀 
਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开琀攀砀琀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 琀攀砀琀 瘀愀氀甀攀 昀漀爀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id, document text name id and a text string.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_text_value]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @textvalue nvarchar(max)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀऀ        
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 㴀 　 
			 SET @doctextnameid = NULL;਀ऀऀ  䤀䘀 䀀琀攀砀琀瘀愀氀甀攀 㴀 ✀✀  
			 SET @textvalue = NULL;਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
				   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
						@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have permission to access it or edit it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'NoDocIDAccess', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀  
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @doctextnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀攀砀琀一愀洀攀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTextNameId.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc text name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_free_text_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_free_text_name_id = @doctextnameid) -- Check if the doc text name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TextIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 琀攀砀琀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
							 FROM doc_attr.doc_free_text_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 
							            AND doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀  
		             (doc_id,      doc_free_text_name_id, text_value)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀Ⰰ        䀀琀攀砀琀瘀愀氀甀攀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table doc_to_com_obj_ms_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 搀漀挀甀洀攀渀琀 瘀椀愀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
-- Input is a document id, a common object list id and a common object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
-- Both controler and editor are authenticated.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀  渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 一唀䰀䰀Ⰰ 
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		 -- Check the common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀ऀऀऀऀऀ 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　  
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		               FROM com_obj.doc_to_com_obj_ms_list_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀  搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					        AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF NOT EXISTS (SELECT common_object_list_id਀ऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
					  WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
	     INSERT INTO com_obj.doc_to_com_obj_ms_list_links ਀ऀऀ             ⠀搀漀挀开椀搀Ⰰ       挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀⤀ 
		      VALUES (@documentid, @commonobjlistid,      @commonobjectid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开琀漀开挀漀洀开漀戀樀开爀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table doc_to_com_obj_radiob_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 搀漀挀甀洀攀渀琀 瘀椀愀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
-- Input is a document id, a common object list id and a common object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_to_com_obj_rb_link]਀ 
     @documentid  nvarchar(50)        = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT common_object_list_id਀ऀऀ               䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 
					  WHERE  doc_id = @documentid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF NOT EXISTS (SELECT common_object_list_id਀ऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
					  WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  -- Noting that docid is not case sensitive, the code should to store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀  
		             (doc_id,       common_object_list_id, common_object_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀Ⰰ      䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀㬀  
		COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀开甀猀攀爀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table doc_to_user_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 甀猀攀爀 琀漀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id and a sid_id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_user_link]਀ 
     @documentid  nvarchar(50)        = NULL,਀     䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		     SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀爀猀漀渀 椀搀 
		  IF @sidid = 0਀ऀऀऀ 匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			                 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT doc_id਀ऀऀ               䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀 
					  WHERE doc_id = @documentid਀ऀऀऀऀऀ        䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀 
							AND general_field_name_id = @genfield_nameid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, the code should store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀  
		             (doc_id,  sid_id,     general_field_name_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀猀椀搀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_doc_xref]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 戀攀琀眀攀攀渀 琀眀漀 搀漀挀甀洀攀渀琀猀 
-- Input is a source document id, a cross-referenced document id and a cross reference type id and notes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_doc_xref]਀ 
     @source_docid  nvarchar(50)      = NULL,਀ऀ 䀀砀爀攀昀开搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
     @xref_typeid bigint              = NULL,਀ऀ 䀀椀渀瀀甀琀开渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀ऀऀ  㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check the source document id਀ऀऀ  䤀䘀 䀀猀漀甀爀挀攀开搀漀挀椀搀 㴀 ✀✀ 
		     SET @source_docid = NULL;਀ऀऀ  䤀䘀 䀀猀漀甀爀挀攀开搀漀挀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀猀漀甀爀挀攀开搀漀挀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀猀漀甀爀挀攀开搀漀挀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @xref_docid = ''਀ऀऀ     匀䔀吀 䀀砀爀攀昀开搀漀挀椀搀 㴀 一唀䰀䰀㬀 
		  IF @xref_docid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @xref_docid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@xref_docid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
 	      -- Check the cross reference id਀ऀऀ  䤀䘀 䀀砀爀攀昀开琀礀瀀攀椀搀 㴀 　 
			 SET @xref_typeid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @xref_typeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀堀爀攀昀吀礀瀀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoXrefTypeID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A cross reference id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT xref_type_id਀ऀऀऀ                 䘀刀伀䴀 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀 
							WHERE xref_type_id = @xref_typeid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀爀攀昀吀礀瀀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, (@tempmessage + '  ID:' + CONVERT(nvarchar(10), @xref_typeid)));਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on XrefTypeIDNotExist.');਀ऀऀऀऀ 䔀一䐀   
਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 砀爀攀昀开琀礀瀀攀开椀搀 
		               FROM xref.doc_cross_references਀ऀऀऀऀऀ  圀䠀䔀刀䔀 猀漀甀爀挀攀开搀漀挀开椀搀 㴀 䀀猀漀甀爀挀攀开搀漀挀椀搀 
					        AND xref_doc_id = @xref_docid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   BEGIN TRANSACTION;਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀猀漀甀爀挀攀开搀漀挀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀猀漀甀爀挀攀开搀漀挀椀搀⤀㬀 
        SET @xref_docid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @xref_docid);਀ 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀  
		             ( source_doc_id, xref_doc_id, xref_type_id,       notes)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀猀漀甀爀挀攀开搀漀挀椀搀Ⰰ 䀀砀爀攀昀开搀漀挀椀搀Ⰰ 䀀砀爀攀昀开琀礀瀀攀椀搀Ⰰ 䀀椀渀瀀甀琀开渀漀琀攀猀⤀㬀  
	     COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开搀漀挀甀洀攀渀琀开椀搀开爀攀猀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀爀攀愀琀攀猀 愀 渀攀眀 搀漀挀甀洀攀渀琀 䤀䐀 爀攀挀漀爀搀⸀ 
-- Input is a document ID, a transaction group id (optional),਀ⴀⴀ 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 渀愀洀攀 愀渀搀 愀渀 䤀䐀 氀漀挀欀 猀琀愀琀甀猀⸀ 
-- The document group id is mandatory and must be a document group which ਀ⴀⴀ 琀栀攀 甀猀攀爀 愀氀爀攀愀搀礀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀⸀  吀栀椀猀 愀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 
-- then add metadata to the document.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_document_id_restr] ਀ऀ 
     @documentid nvarchar(50)         = NULL, -- Optional if auto-generation is on਀ऀ 䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ ⴀⴀ 䴀愀渀搀愀琀漀爀礀 
	 @transactiongroup bigint         = NULL,  -- Optional਀ऀ 䀀椀搀氀漀挀欀猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㄀　⤀       㴀 ✀唀渀氀漀挀欀攀搀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newdocumentid nvarchar(50)      = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
        @nodatamessage nvarchar(200)         = '', -- Communicates that no data was supplied਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀猀椀搀椀搀 戀椀最椀渀琀                        㴀 一唀䰀䰀Ⰰ   
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 愀 猀琀爀椀渀最 眀愀猀 氀漀渀最攀爀 琀栀愀渀 㔀　 挀栀愀爀愀挀琀攀爀猀 愀渀搀 洀愀礀 栀愀瘀攀 戀攀攀渀 琀爀甀渀挀愀琀攀搀 
		@nodocgroupmessage nvarchar(200)     = '', -- Communicates that no document group was supplied਀ऀऀ䀀搀漀挀最爀漀甀瀀椀渀瘀愀氀椀搀洀猀最 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 爀椀最栀琀猀 琀漀 椀琀 
		@notuniquemessage nvarchar(200)      = '', -- Communicates that the document ID was not unique਀ऀऀ䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
		@maxiterationcount int	             = NULL, -- Maximum number of attempts to autogenerate a document ID਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @idlockstatus = 'Unlocked';਀ 
਀ 
SET @maxiterationcount = (SELECT doc_autogen_max_tries ਀                           䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⤀㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀㬀 
	END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
  -- Select the SID ID for the connected user਀ऀ  匀䔀䰀䔀䌀吀 䀀猀椀搀椀搀 㴀 猀氀⸀猀椀搀开椀搀 
		FROM user_restr.sid_list AS sl਀ऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀㬀 
਀ऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoDocGroupId', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			ELSE ਀ऀऀऀ匀䔀吀 䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀✀㬀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀ऀऀ䔀䰀匀䔀 
਀ऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
	 -- This also returns fail if the id does not exist਀ऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开最爀瀀开攀搀开瀀洀崀  
			 @doc_grp_to_check_ep = @docgroupid,਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开搀最攀瀀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
		  IF @tempuserauth_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @docgroupinvalidmsg = 'Document group ID: ' + ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL') + '  ' + @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @docgroupinvalidmsg = 'A database level message error occurred on NoDocGroupPermission.';਀ऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check if the document ID is NULL਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN਀ऀऀऀऀ䤀䘀 ⠀匀䔀䰀䔀䌀吀 甀猀攀开愀甀琀漀开最攀渀开搀漀挀开椀搀开漀渀开渀甀氀氀 
					  FROM base.global_settings_groups) = 'No'਀ऀऀऀऀऀ䈀䔀䜀䤀一 
						 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀愀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						 ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀愀⸀✀㬀 
						 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 一唀䰀䰀 愀渀搀 琀栀攀 愀甀琀漀 最攀渀攀爀愀琀攀 漀瀀琀椀漀渀 椀猀 渀漀琀 ✀一漀✀ 
				   BEGIN -- Auto generate a document ID਀ऀऀऀऀऀऀ圀䠀䤀䰀䔀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㸀 　 
							BEGIN਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㴀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 ⴀ ㄀㬀 
								EXEC internal.usp_SEL_random_doc_id਀ऀऀऀऀऀऀऀऀऀ䀀爀愀渀搀漀洀搀漀挀甀洀攀渀琀椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 伀唀吀倀唀吀㬀 
								IF NOT EXISTS (SELECT doc_id ਀ऀऀऀऀऀऀऀऀऀऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 
												WHERE doc_id = @documentid)਀ऀऀऀऀऀऀऀऀ   䈀刀䔀䄀䬀 
								ELSE  CONTINUE਀ऀऀऀऀऀऀऀ䔀一䐀 
						IF @maxiterationcount < 1  -- Can't generate a unique random document ID਀ऀऀऀऀऀऀ   䈀䔀䜀䤀一 
								SET @documentid = NULL;਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'MaxDocTries', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @nodatamessage = @tempmessage;਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @nodatamessage = 'A database level message error occurred on MaxDocTries.';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀一䐀 
				   END਀ऀऀऀ 䔀一䐀 
		  ELSE -- document ID supplied.਀ऀऀऀ䈀䔀䜀䤀一   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 甀渀椀焀甀攀⸀ 
			   IF EXISTS (SELECT doc_id ਀   ऀऀऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
							   WHERE doc_id = @documentid) ਀ऀऀऀऀ  䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀漀挀一漀琀唀渀椀焀甀攀✀Ⰰ  
						 @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					   SET @notuniquemessage = LEFT(@documentid, 6) + '...' + ' | ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @notuniquemessage = 'A database level message error occurred on DocNotUnique.';਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀ  䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 甀渀椀焀甀攀渀攀猀猀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 
਀ऀऀऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 洀椀最栀琀 栀愀瘀攀 戀攀攀渀 愀甀琀漀洀愀琀椀挀愀氀氀礀 琀爀甀渀挀愀琀攀搀 
			 IF (LEN(@documentid) >= 50)਀ऀऀऀऀ䈀䔀䜀䤀一 
				  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀漀漀䰀漀渀最㔀　✀Ⰰ  
					   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					 SET @toolong50message = LEFT(@documentid, 8) + '...' + ' | ' + @tempmessage;਀ऀऀऀऀ  䔀䰀匀䔀  
					   SET @toolong50message = 'A database level message error occurred on TooLong50.';਀ऀऀऀऀऀ ⴀⴀ 䐀漀渀✀琀 昀愀椀氀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀⸀  吀栀攀 猀琀爀椀渀最 椀猀 樀甀猀琀 琀爀甀渀挀愀琀攀搀⸀  
				 END -- End checking the length of the document ID਀ऀऀ  䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 攀氀猀攀 昀漀爀 渀漀 搀漀挀甀洀攀渀琀 椀猀 猀甀瀀瀀氀椀攀搀 
਀ऀऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀 
਀ऀऀऀ 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一伀吀 一唀䰀䰀 
				 BEGIN਀ऀऀऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
									FROM base.transaction_groups ਀ऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀  
					   BEGIN਀ ऀऀऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							   @message_id = 'TGNotExist', ਀ऀऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						  IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ 匀䔀吀 䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
						  ELSE ਀ऀऀऀऀऀऀऀ   匀䔀吀 䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀䜀一漀琀䔀砀椀猀琀⸀✀㬀 
						  SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END਀ऀऀऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
਀ऀऀ  䤀䘀 䀀椀搀氀漀挀欀猀琀愀琀甀猀 㰀㸀 ✀䰀漀挀欀攀搀✀ 
			 SET @idlockstatus = 'Unlocked';਀ 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				 SET @transactionmessage = @tempmessage;਀ऀऀऀ  䔀䰀匀䔀  
				   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
			 INSERT INTO base.document_id_list ਀ऀऀऀ             ⠀搀漀挀开椀搀Ⰰ       琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀Ⰰ 氀漀挀欀开猀琀愀琀甀猀Ⰰ 挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀⤀ 
				  VALUES (@documentid, @transactiongroup,     @idlockstatus, @sidid); ਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀  
						 (doc_id,      doc_group_id)਀ऀऀऀऀ  嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀ 
		 COMMIT TRANSACTION;਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'Success', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				  IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀  䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀ ⬀ 䀀搀漀挀甀洀攀渀琀椀搀 ⬀ ✀ 挀爀攀愀琀攀搀⸀✀㬀 
				  ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
			 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 ⴀⴀ 䔀渀搀 攀砀攀挀甀琀椀渀最 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀ 
     SET @newdocumentid = @documentid;਀  䔀䰀匀䔀 匀䔀吀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀㬀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@notuniquemessage <> '')           SET @message = @message + ' | ' + @notuniquemessage;਀    䤀䘀 ⠀䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀              匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀愀琀愀洀攀猀猀愀最攀㬀 
    IF (@toolong50message <> '')           SET @message = @message + ' | ' + @toolong50message;਀    䤀䘀 ⠀䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀最爀漀甀瀀洀攀猀猀愀最攀㬀 
	IF (@docgroupinvalidmsg <> '')         SET @message = @message + ' | ' + @docgroupinvalidmsg;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_binary_input]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㘀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀⼀⨀ 
	Inserts files into the filestream container਀ऀ䤀渀瀀甀琀 椀猀 愀 戀椀渀愀爀礀 昀椀氀攀Ⰰ 昀椀氀攀渀愀洀攀 漀昀 琀栀攀 爀攀挀漀爀搀 琀漀 戀攀  
	saved, an optional transaction group id, an optional document id,਀ऀ愀渀 漀瀀琀椀漀渀愀氀 搀漀挀甀洀攀渀琀 椀搀 愀甀琀漀最攀渀攀爀愀琀攀 昀氀愀最Ⰰ 愀渀 漀瀀琀椀漀渀愀氀 琀栀甀洀戀渀愀椀氀 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 昀甀氀氀 琀攀砀琀 挀漀渀琀攀渀琀 猀琀爀椀渀最⸀ 
	The autogenerate flag instructs the code to automatically generate਀ऀ愀 搀漀挀甀洀攀渀琀 椀搀 椀昀 渀漀渀攀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 䀀搀漀挀椀搀愀甀琀漀最攀渀 洀甀猀琀 戀攀 ✀夀䔀匀✀  
	to initiate autogeneration of a document ID. ਀ऀ吀栀攀 昀椀氀攀渀愀洀攀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀漀 戀攀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 昀椀氀攀渀愀洀攀  
	of the record to be saved, but it must be a valid filename. Filename is optional. ਀ऀ吀栀攀 琀爀愀渀猀愀挀琀椀漀渀 椀搀 椀猀 爀攀琀爀椀攀瘀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀  
	from a different stored procedure and passed back to this one.਀ऀ䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 愀 最爀漀甀瀀 漀昀 昀椀氀攀猀 戀攀椀渀最 愀搀搀攀搀 愀琀 琀栀攀 猀愀洀攀 琀椀洀攀 
	can be grouped by the same transaction id. ਀ऀ吀栀攀 漀瀀琀椀漀渀愀氀 搀漀挀甀洀攀渀琀 椀搀 愀氀氀漀眀猀 愀 昀椀氀攀 琀漀 戀攀 椀洀洀攀搀椀愀琀攀氀礀 爀攀猀琀爀椀挀琀攀搀 
	via document view group permissions. ਀ऀ伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 
	the id of the new record.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_binary_input] ਀ऀⴀⴀ 䄀搀搀 琀栀攀 瀀愀爀愀洀攀琀攀爀猀 昀漀爀 琀栀攀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀 栀攀爀攀 
਀ऀ䀀昀椀氀攀开挀漀渀琀攀渀琀开戀椀渀 瘀愀爀戀椀渀愀爀礀⠀洀愀砀⤀ 㴀 一唀䰀䰀Ⰰ  ⴀⴀ 䴀愀渀搀愀琀漀爀礀 
	@stored_filename nvarchar(255)   = NULL,  -- Optional਀ऀ䀀昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀ 㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	@thumbnail varbinary(max)        = NULL,  -- Optional਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	@documentid nvarchar(50)         = NULL,  -- Optional਀ऀ䀀搀漀挀椀搀愀甀琀漀最攀渀 渀瘀愀爀挀栀愀爀⠀㔀⤀        㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀⸀  䄀甀琀漀洀愀琀椀挀愀氀氀礀 最攀渀攀爀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀 椀昀 渀漀渀攀 猀甀瀀瀀氀椀攀搀⸀ 
	@filegroupid bigint              = NULL,  -- Optional਀ऀ䀀搀漀挀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀 
	@duplicate_check nvarchar(3)     = NULL,  -- Optional.  Checks if a duplicate file exists.਀ऀ䀀爀攀琀攀渀琀椀漀渀开洀漀渀琀栀猀  椀渀琀           㴀 一唀䰀䰀Ⰰ  ⴀⴀ 伀瀀琀椀漀渀愀氀⸀  一甀洀戀攀爀 漀昀 洀漀渀琀栀猀 漀昀 爀攀琀攀渀琀椀漀渀⸀   
	@message nvarchar(1000)          = NULL OUTPUT,਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
    @fileid bigint                   = NULL OUTPUT,਀ऀ䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀      㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ऀ䐀䔀䌀䰀䄀刀䔀 
		@file_hash varbinary(MAX),਀ऀ    䀀琀攀洀瀀琀爀愀渀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ  
		@filename_validation_status nchar(10),        ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀               㴀 ✀✀Ⰰ 
		@sanitised_text NVARCHAR(MAX)            = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
	    @connectedusersid varbinary(100)         = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                  㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@sidid bigint                            = NULL,  ਀ऀऀ䀀爀攀琀攀渀琀椀漀渀开搀愀琀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀             㴀 一唀䰀䰀Ⰰ 
		@userauthentication_status nchar(10)     = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 椀渀琀ऀ                 㴀 一唀䰀䰀Ⰰ ⴀⴀ 䴀愀砀椀洀甀洀 渀甀洀戀攀爀 漀昀 愀琀琀攀洀瀀琀猀 琀漀 愀甀琀漀最攀渀攀爀愀琀攀 愀 搀漀挀甀洀攀渀琀 䤀䐀 
		@match_count int                         = NULL, -- Count of the number of duplicate files. ਀ऀ    䀀昀椀氀攀最爀漀甀瀀愀甀琀栀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀           㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀⸀  
		@transaction_ready nchar(10)             = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
SET @maxiterationcount = (SELECT doc_autogen_max_tries ਀                           䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
						  WHERE gsg.setting_group_name = 'Master');਀ 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀猀 愀渀 攀搀椀琀漀爀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
਀  ⴀⴀ 匀攀氀攀挀琀 琀栀攀 匀䤀䐀 䤀䐀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	  SELECT @sidid = sl.sid_id਀ऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	   WHERE sl.sid = @connectedusersid;਀ 
਀ 
਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀⴀⴀ 匀琀漀爀攀搀 昀椀氀攀渀愀洀攀 洀甀猀琀 戀攀 愀 瘀愀氀椀搀 昀椀氀攀渀愀洀攀 
		EXEC internal.usp_VALIDATE_filename਀ऀऀऀ 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 㴀 䀀猀琀漀爀攀搀开昀椀氀攀渀愀洀攀Ⰰ 
			 @filename_validation_result = @filename_validation_status OUTPUT;਀ 
		IF @filename_validation_status = 'Invalid'਀ऀऀ  䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀瘀愀氀椀搀䘀椀氀攀渀愀洀攀✀Ⰰ  
				  @message_text =  @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀ 
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidFilename.');਀ऀऀ  䔀一䐀 
		-- End filename validation਀ 
		-- Stored filename length must be less than 255਀ऀऀ䤀䘀 䰀䔀一⠀䀀猀琀漀爀攀搀开昀椀氀攀渀愀洀攀⤀ 㸀 ㈀㔀㐀 
		  BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				 @message_id   = 'FilenameTooLong', ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL)਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀渀愀洀攀吀漀漀䰀漀渀最⸀✀⤀㬀 
		  END਀ऀऀⴀⴀ 䔀渀搀 昀椀氀攀渀愀洀攀 氀攀渀最琀栀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀⸀  一唀䰀䰀 椀猀 愀氀氀漀眀攀搀⸀ 
		  IF @transactiongroup IS NOT NULL਀ऀऀऀ䈀䔀䜀䤀一 
			   IF NOT EXISTS (SELECT transaction_group_id ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀  
							   WHERE transaction_group_id = @transactiongroup) ਀ऀऀऀऀ  䈀䔀䜀䤀一 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
 					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀ 
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀 
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TGNotExist.');਀ऀऀऀऀ  䔀一䐀 
			  END਀ऀऀⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
਀ 
਀ऀⴀⴀ 䤀昀 琀栀甀洀戀渀愀椀氀 猀琀漀爀愀最攀 椀猀 漀渀 琀栀攀渀 琀栀攀挀欀 琀栀攀 琀栀甀洀戀渀愀椀氀 
	IF EXISTS (SELECT gsg.store_thumbnails਀ऀ             䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
				WHERE gsg.setting_group_name = 'Master'਀ऀऀऀऀ  䄀一䐀 最猀最⸀猀琀漀爀攀开琀栀甀洀戀渀愀椀氀猀 㴀 ✀伀渀✀⤀ 
      BEGIN਀ऀऀⴀⴀ 吀栀甀洀戀渀愀椀氀 洀甀猀琀 戀攀 猀洀愀氀氀攀爀 琀栀愀渀 ㄀䴀䈀 
		IF DATALENGTH(@thumbnail) > 1048576਀ऀऀ  䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀栀甀洀戀渀愀椀氀吀漀漀䈀椀最✀Ⰰ  
				 @message_text =  @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀ 
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀 
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ThumbnailTooBig.');਀ऀऀ  䔀一䐀 
	   END਀ऀ 䔀䰀匀䔀 匀䔀吀 䀀琀栀甀洀戀渀愀椀氀 㴀 一唀䰀䰀㬀  ⴀⴀ 䤀昀 昀甀氀氀 琀栀甀洀戀渀愀椀氀 椀猀 漀昀昀 琀栀攀渀 搀攀氀攀琀攀 愀渀礀 琀栀甀洀戀渀愀椀氀 猀甀瀀瀀氀椀攀搀⸀ 
਀ 
਀ऀऀⴀⴀ 䔀渀搀 琀栀甀洀戀渀愀椀氀 猀椀稀攀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
		-- Document id validation਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ 
		  SET @docidautogen = UPPER(@docidautogen);਀ 
          IF @documentid IS NULL਀ऀऀ     䈀䔀䜀䤀一 
			   IF @docidautogen = 'YES'਀ऀऀऀऀ   䈀䔀䜀䤀一 ⴀⴀ 䄀甀琀漀 最攀渀攀爀愀琀攀 愀 搀漀挀甀洀攀渀琀 䤀䐀 
						WHILE @maxiterationcount > 0਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
								SET @maxiterationcount = @maxiterationcount - 1;਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开爀愀渀搀漀洀开搀漀挀开椀搀 
									@randomdocumentid = @documentid OUTPUT;਀ऀऀऀऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀  
												 FROM base.document_id_list਀ऀऀऀऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
								   BREAK਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  䌀伀一吀䤀一唀䔀 
							END਀ऀऀऀऀऀऀ䤀䘀 䀀洀愀砀椀琀攀爀愀琀椀漀渀挀漀甀渀琀 㰀 ㄀  ⴀⴀ 䌀愀渀✀琀 最攀渀攀爀愀琀攀 愀 甀渀椀焀甀攀 爀愀渀搀漀洀 搀漀挀甀洀攀渀琀 䤀䐀 
						   BEGIN਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䴀愀砀䐀漀挀吀爀椀攀猀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䴀愀砀䐀漀挀吀爀椀攀猀⸀✀⤀㬀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   END਀ऀऀऀऀ       匀䔀吀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
				   END਀ऀऀऀ 䔀一䐀 
		  ELSE -- Supplied @documentid is not NULL਀ऀऀ      䈀䔀䜀䤀一 
                   -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 						@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
		/*਀ऀऀ 唀猀椀渀最 伀倀䔀一刀伀圀匀䔀吀⠀䈀唀䰀䬀⸀⸀⸀ 椀猀 愀渀 甀渀猀甀椀琀愀戀氀攀 愀瀀瀀爀漀愀挀栀 椀渀 琀栀椀猀 挀漀渀琀攀砀琀 
		 because it requires BULK ADMIN privileges, which introduces਀ऀऀ 猀攀挀甀爀椀琀礀 椀猀猀甀攀猀⸀  䠀攀渀挀攀 琀栀攀 愀瀀瀀爀漀愀挀栀 甀猀攀搀 椀猀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
		 must open the file and place it into an object which is passed਀ऀऀ 琀漀 琀栀攀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀⸀ 
		*/਀ 
		 -- File length validation਀ऀऀ ⴀⴀ 瘀愀爀戀椀渀愀爀礀⠀洀愀砀⤀ 愀猀 愀 洀愀砀椀洀甀洀 猀琀漀爀愀最攀 漀昀 ㈀ 䜀䈀∀ 吀攀猀琀 愀琀 漀渀攀 氀攀猀猀 琀栀愀渀 洀愀砀椀洀甀洀⸀  
		  IF DATALENGTH(@file_content_bin) > 2147483647਀ऀऀऀ䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';  ਀  ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀椀氀攀吀漀漀䰀愀爀最攀✀Ⰰ  
					@message_text =  @tempmessage OUTPUT;਀ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀 
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀 
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileTooLarge.');਀ऀऀऀ䔀一䐀 
		  -- End file length validation਀ 
		  -- Don't load empty or null files.  ਀ऀऀ  䤀䘀 ⠀䐀䄀吀䄀䰀䔀一䜀吀䠀⠀䀀昀椀氀攀开挀漀渀琀攀渀琀开戀椀渀⤀ 㴀 　⤀ 伀刀 ⠀䀀昀椀氀攀开挀漀渀琀攀渀琀开戀椀渀 䤀匀 一唀䰀䰀⤀ 
			BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀   
  			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoFileSupplied', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			   IF @tempmessage IS NOT NULL਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀匀甀瀀瀀氀椀攀搀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 攀洀瀀琀礀 昀椀氀攀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
਀ 
	਀ 
         -- Check the file group id਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL;਀ 
		 IF @filegroupid IS NOT NULL  -- A file group id was supplied.  Check that file group id exists਀ऀऀ   䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀 
			 IF NOT EXISTS (SELECT file_group_id਀ऀऀऀऀ             䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 
							WHERE file_group_id = @filegroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  						SET @message =  CONCAT(@message, ' | ', 'File Group ID: ', ISNULL(CONVERT(nvarchar(10), @filegroupid), 'NULL'), '.  ', @tempmessage); ਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message =  CONCAT_WS(' | ', @message, 'A database level message error occurred on FileGroupIdNotExist');਀ 
				END਀ऀऀ     䔀䰀匀䔀  ⴀⴀ 吀栀攀 昀椀氀攀 最爀漀甀瀀 䤀䐀 搀漀攀猀 攀砀椀猀琀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀 
			   BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀氀开最爀瀀开攀搀开瀀洀崀  
 						@filegroupid_tocheck =  @filegroupid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀瀀 㴀 䀀昀椀氀攀最爀漀甀瀀愀甀琀栀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @filegroupauthstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀 
								SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䜀爀瀀䔀搀倀攀爀洀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File Group ID: ', CONVERT(nvarchar(20), @filegroupid),  '.  ',  @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileGrpEdPerm');਀ऀऀऀऀऀऀऀ䔀一䐀 
			   END -- End checking if the user has edit permission for the file group.਀           䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀⸀ 
	਀ऀⴀⴀ 䌀栀攀挀欀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀搀 
		IF @docgroupid = 0਀ऀऀ匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		BEGIN਀ऀऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
		 -- This also returns fail if the id does not exist਀ऀऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
				@docgroupid_to_check_vp = @docgroupid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
		  IF @tempuserauth_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', 'Document group ID: ', ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL'), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupPermission.');਀ऀऀऀ䔀一䐀 
		END -- END if @docgroupid IS NOT NULL਀ 
		IF @docgroupid IS NOT NULL AND @documentid IS NULL਀ऀऀ䈀䔀䜀䤀一 
		 -- If a doc group ID has been supplied then an associated document ID must also be supplied. ਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoDocForGroup', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䘀漀爀䜀爀漀甀瀀⸀✀⤀㬀 
		END -- END if @docgroupid IS NOT NULL਀ 
਀ 
		-- Determine if duplicate check is required਀ 
		-- Carry out duplicate check.਀ऀऀ䤀䘀 䀀搀甀瀀氀椀挀愀琀攀开挀栀攀挀欀 䤀匀 一唀䰀䰀 伀刀 䀀搀甀瀀氀椀挀愀琀攀开挀栀攀挀欀 㴀 ✀✀ 
		   BEGIN਀ऀऀ     匀䔀吀 䀀搀甀瀀氀椀挀愀琀攀开挀栀攀挀欀 㴀 ⠀匀䔀䰀䔀䌀吀 搀甀瀀氀椀挀愀琀攀开洀愀渀愀最攀洀攀渀琀 
			                           FROM base.global_settings_groups਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀ 
		   END਀ऀऀ䤀䘀 唀倀倀䔀刀⠀䀀搀甀瀀氀椀挀愀琀攀开挀栀攀挀欀⤀ 㴀 ✀伀一✀ 
		   BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀攀开栀愀猀栀 㴀 䠀䄀匀䠀䈀夀吀䔀匀⠀✀匀䠀䄀㈀开㈀㔀㘀✀Ⰰ 䀀昀椀氀攀开挀漀渀琀攀渀琀开戀椀渀⤀㬀 
				-- Check if a duplicate file exists.਀ऀऀऀⴀⴀ 䌀漀甀渀琀 琀栀攀 渀甀洀戀攀爀 漀昀 洀愀琀挀栀攀猀 漀昀 搀甀瀀氀椀挀愀琀攀 昀椀氀攀猀 
			  SELECT @match_count = COUNT(*)਀                䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 
               WHERE content_hash = @file_hash;਀ऀऀऀⴀⴀ 䘀愀椀氀 椀昀 琀栀攀爀攀 椀猀 洀漀爀攀 琀栀愀渀 漀渀攀 洀愀琀挀栀⸀ 
			IF (@match_count > 1 AND @documentid IS NOT NULL) -- Message mentions unable to link to doc id.਀ऀऀऀऀ  䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䴀甀氀琀椀䐀甀瀀氀䘀椀氀攀猀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on MultiDuplFiles.');਀ऀऀऀऀ  䔀一䐀 
            -- Fail if there is more than 0 matches and a document ID has not been supplied. ਀ऀऀऀ䤀䘀 ⠀䀀洀愀琀挀栀开挀漀甀渀琀 㸀 　 䄀一䐀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀⤀ ⴀⴀ 䴀攀猀猀愀最攀 搀漀攀猀 渀漀琀 洀攀渀琀椀漀渀 甀渀愀戀氀攀 琀漀 氀椀渀欀 琀漀 搀漀挀 䤀䐀⸀ 
				  BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'DuplicateFile', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀甀瀀氀椀挀愀琀攀䘀椀氀攀⸀✀⤀㬀 
				  END਀ऀऀ    
			-- If there is exactly one match AND a document ID has been supplied then extract the file_id to @fileid.਀ऀऀ   䤀䘀 ⠀䀀洀愀琀挀栀开挀漀甀渀琀 㴀 ㄀ 䄀一䐀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀⤀ 
				   BEGIN਀ऀऀऀऀऀ  匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀 㴀 昀椀氀攀开椀搀 
						FROM base.file_metadata਀ऀऀऀऀऀ   圀䠀䔀刀䔀 挀漀渀琀攀渀琀开栀愀猀栀 㴀 䀀昀椀氀攀开栀愀猀栀㬀 
਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'DuplicateFile', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀甀瀀氀椀挀愀琀攀䘀椀氀攀⸀✀⤀㬀 
਀ऀऀऀऀ   䔀一䐀 
		  END -- END IF UPPER(@duplicate_check) = 'ON'਀ऀ 
	-- If full text storage is on then sanitise the string਀ऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最猀最⸀猀琀漀爀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀 
	             FROM base.global_settings_groups AS gsg਀ऀऀऀऀ圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
				  AND gsg.store_plain_text_content = 'On')਀      䈀䔀䜀䤀一 
		-- Sanitise the full text content string and truncate to 1 million characters.  ਀ऀऀ 匀䔀吀 䀀猀愀渀椀琀椀猀攀搀开琀攀砀琀 㴀 椀渀琀攀爀渀愀氀⸀甀昀渀开䌀䠀䬀开猀愀渀椀琀椀猀攀开昀椀氀攀开琀攀砀琀开匀嘀䘀⠀䀀昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀⤀㬀 
	 END਀ऀ 䔀䰀匀䔀 匀䔀吀 䀀昀甀氀氀开琀攀砀琀开挀漀渀琀攀渀琀 㴀 一唀䰀䰀㬀  ⴀⴀ 䤀昀 昀甀氀氀 琀攀砀琀 椀渀搀攀砀椀渀最 椀猀 漀昀昀 琀栀攀渀 椀最渀漀爀攀 愀渀礀 昀甀氀氀 琀攀砀琀 挀漀渀琀攀渀琀 猀甀瀀瀀氀椀攀搀⸀ 
਀ऀ ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 爀攀琀攀渀琀椀漀渀 瀀攀爀椀漀搀 
		IF @retention_months < 0 OR @retention_months > 9999਀ऀऀऀ䈀䔀䜀䤀一   
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀瘀愀氀椀搀刀攀琀攀渀琀椀漀渀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', @tempmessage, ' ', @retention_months);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidRetention.');਀ऀऀऀ䔀一䐀 
਀ 
਀ 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
					   			 ਀ऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀ऀ    
਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ    ⴀⴀ 䌀愀氀挀甀氀愀琀攀 爀攀琀攀渀琀椀漀渀 搀愀琀攀 
	  IF @retention_months IS NOT NULL  SET @retention_date = CAST(DATEADD(MONTH, @retention_months, SYSDATETIME()) AS DATE);਀ 
	  -- Noting that docid is not case sensitive, the code should store the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
	      IF @documentid IS NOT NULL਀ऀऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
								 FROM base.document_id_list AS dil਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
਀         ⴀⴀ 䰀漀愀搀 琀栀攀 昀椀氀攀 椀昀 搀甀瀀氀椀挀愀琀攀 挀栀攀挀欀椀渀最 椀猀 渀漀琀 漀渀Ⰰ 漀爀 椀昀 琀栀攀爀攀 愀爀攀 渀漀 搀甀瀀氀椀挀愀琀攀猀⸀ 
          IF (UPPER(@duplicate_check) <> 'ON' OR @match_count = 0)਀              䈀䔀䜀䤀一 
				  EXEC internal.usp_INS_file ਀ऀऀऀऀऀ   䀀昀开椀渀猀开昀椀氀攀开挀漀渀琀攀渀琀       㴀 䀀昀椀氀攀开挀漀渀琀攀渀琀开戀椀渀Ⰰ 
 					   @f_ins_stored_filename    = @stored_filename,਀ऀऀऀऀऀ   䀀昀开椀渀猀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀  㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀Ⰰ 
					   @f_ins_created_by_id      = @sidid,਀ऀऀऀऀऀ   䀀昀开椀渀猀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀 㴀 䀀猀愀渀椀琀椀猀攀搀开琀攀砀琀Ⰰ 
					   @f_ins_thumbnail          = @thumbnail,਀ऀऀऀऀऀ   䀀昀开椀渀猀开爀攀琀攀渀琀椀漀渀开搀愀琀攀     㴀 䀀爀攀琀攀渀琀椀漀渀开搀愀琀攀Ⰰ 
					   @f_ins_message            = @message OUTPUT,਀ऀऀऀऀऀ   䀀昀开椀渀猀开琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
					   @f_ins_file_id            = @fileid OUTPUT;਀              䔀一䐀 
਀ऀऀ  ⴀⴀ 䤀昀 愀 渀攀眀 搀漀挀甀洀攀渀琀 䤀䐀 栀愀猀 戀攀攀渀 挀爀攀愀琀攀搀 琀栀攀渀 椀渀猀攀爀琀 椀琀 椀渀琀漀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 氀椀猀琀⸀ 
				IF @newdocumentid IS NOT NULL਀ऀऀऀऀ䈀䔀䜀䤀一 
					BEGIN TRY਀ऀऀऀऀऀऀ䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 
							(doc_id, transaction_group_id)਀ऀऀऀऀऀऀ嘀䄀䰀唀䔀匀 
							(@newdocumentid, @transactiongroup);਀ऀऀऀऀऀ䔀一䐀 吀刀夀 
					BEGIN CATCH਀ऀऀऀऀऀऀ䤀䘀 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀ 一伀吀 䤀一 ⠀㈀㘀　㄀Ⰰ ㈀㘀㈀㜀⤀ 
							THROW;਀ऀऀऀऀऀऀⴀⴀ 攀氀猀攀㨀 攀砀琀爀攀洀攀氀礀 爀愀爀攀 挀漀氀氀椀猀椀漀渀 鈀‡椀最渀漀爀攀 
						-- (optionally you could regenerate here, but not required)਀ऀऀऀऀऀ䔀一䐀 䌀䄀吀䌀䠀 
				END਀ 
         -- Insert the file to document ID link if it does not already exist.਀ऀऀऀ䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀昀椀氀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ䈀䔀䜀䤀一 吀刀夀 
					INSERT INTO xref.file_to_document_links਀ऀऀऀऀऀऀ⠀搀漀挀开椀搀Ⰰ 昀椀氀攀开椀搀Ⰰ 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀⤀ 
					VALUES਀ऀऀऀऀऀऀ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀昀椀氀攀椀搀Ⰰ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀㬀 
				END TRY਀ऀऀऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
					IF ERROR_NUMBER() NOT IN (2601, 2627)਀ऀऀऀऀऀऀ吀䠀刀伀圀㬀 
					-- else: duplicate link → ignore਀ऀऀऀऀ䔀一䐀 䌀䄀吀䌀䠀 
			END਀ऀऀऀऀ   
		--Insert the file to file group link if it does not already exist			 ਀ऀऀऀ䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀昀椀氀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
				BEGIN਀ऀऀऀऀऀ䈀䔀䜀䤀一 吀刀夀 
						INSERT INTO xref.file_group_links਀ऀऀऀऀऀऀऀ⠀昀椀氀攀开最爀漀甀瀀开椀搀Ⰰ 昀椀氀攀开椀搀⤀ 
						VALUES਀ऀऀऀऀऀऀऀ⠀䀀昀椀氀攀最爀漀甀瀀椀搀Ⰰ 䀀昀椀氀攀椀搀⤀㬀 
					END TRY਀ऀऀऀऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
						IF ERROR_NUMBER() NOT IN (2601, 2627)਀ऀऀऀऀऀऀऀ吀䠀刀伀圀㬀 
						-- else: duplicate link → ignore਀ऀऀऀऀऀ䔀一䐀 䌀䄀吀䌀䠀 
				END -- END inserting file group id link਀ 
		-- Insert the document to document group link if it does not already exist਀ऀऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		BEGIN਀ऀऀऀ䈀䔀䜀䤀一 吀刀夀 
				INSERT INTO xref.doc_group_links (doc_id, doc_group_id)਀ऀऀऀऀ嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀㬀 
			END TRY਀ऀऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
				IF ERROR_NUMBER() NOT IN (2601, 2627)਀ऀऀऀऀऀ吀䠀刀伀圀㬀 
				-- else: duplicate link already exists → ignore਀ऀऀऀ䔀一䐀 䌀䄀吀䌀䠀 
		END਀ 
		 COMMIT TRANSACTION;਀ 
          EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ      䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	         SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ      䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀऀ    
		   SET @fileid = NULL; -- The file insert will be rolled back.  ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
          EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀ऀ        䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ         䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		    ELSE ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开搀愀琀攀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀 搀愀琀攀 瘀愀氀甀攀 昀漀爀 愀 昀椀氀攀⸀ 
-- Input is a file id, file date name id and a date value.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_date_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @datevalue datetime2(7)          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀搀愀琀攀猀琀礀氀攀 椀渀琀                          㴀 ✀✀Ⰰ ⴀⴀ 䐀愀琀攀 猀琀礀氀攀 昀爀漀洀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @datevalue = '' ਀ऀऀऀ 匀䔀吀 䀀搀愀琀攀瘀愀氀甀攀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		  -- Check the file date name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM file_attr.file_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
 		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
							 FROM file_attr.file_date_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 
							            AND file_id = @fileid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO file_attr.file_date_values ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ   昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀Ⰰ 搀愀琀攀开瘀愀氀甀攀⤀ 
		      VALUES (@fileid,  @filedatenameid,   @datevalue)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ    
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_doc_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 昀椀氀攀ⴀ搀漀挀甀洀攀渀琀 氀椀渀欀⸀ 
-- Input is a file id, document id and an optional transaction group id.਀ⴀⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 愀氀猀漀 昀椀氀攀 椀搀⸀  
-- Output is a message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀  䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开搀漀挀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Data validation਀ 
	  -- Check that a document id was supplied਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ  ⴀⴀ 一唀䰀䰀 搀漀挀甀洀攀渀琀 椀搀 渀漀琀 瀀攀爀洀椀琀琀攀搀 
	  IF @documentid IS NULL  ਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to edit the document data਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 	            @doc_id_to_check_ep =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
		   IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀䄀挀挀攀猀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocIDAccess.');਀ऀऀऀऀ 䔀一䐀ऀऀऀ  
		 END਀ 
	  -- Check that a file id was supplied਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		 SET @fileid = NULL;਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀  
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Check that the file id is valid਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 䘀椀氀攀 搀愀琀愀 
		   EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀ            䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
	            @user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀ   䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- file id does not exist or the user does not have permission to edit it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
				 END			 ਀ऀऀ 䔀一䐀 
਀ 
	  -- Check if the doc_id - file_id link pair record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
		 BEGIN਀ऀऀ   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 
						FROM xref.file_to_document_links਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀  
							 AND doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
				  SET @data_validation_status = 'Fail';਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
 					  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ  䔀䰀匀䔀  
						 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
		 END -- End check if record already exists਀ 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀一䐀 唀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
  ਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ  ⴀⴀ 一漀琀椀渀最 琀栀愀琀 搀漀挀椀搀 椀猀 渀漀琀 挀愀猀攀 猀攀渀猀椀琀椀瘀攀Ⰰ 琀栀攀 挀漀搀攀 猀栀漀甀氀搀 琀漀 猀琀漀爀攀 琀栀攀 搀漀挀椀搀  
      -- with the same letter case as is stored rather than what was supplied. ਀        匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                             FROM base.document_id_list AS dil਀ऀऀऀ                圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀㬀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 ⠀搀漀挀开椀搀Ⰰ 昀椀氀攀开椀搀⤀ 
		      VALUES (@documentid, @fileid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开昀甀渀挀琀开氀椀猀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table file_to_function_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 琀漀 愀 昀椀氀攀⸀ 
-- Input is a file id and a function list id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_funct_list_link]਀ 
     @fileid  bigint                  = NULL,਀     䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '',  -- Communicates if the user is not authorised to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
 	      -- Check the function list id਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
			 SET @functionlistid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @functionlistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionListID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A function list id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT function_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 
							WHERE function_list_id = @functionlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctListIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 
		               FROM people.file_to_function_list_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND function_list_id = @functionlistid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
	    END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀  
		             (file_id,  function_list_id,      general_field_name_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀椀搀Ⰰ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_function_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
-- which links a duty function to a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 愀 昀甀渀挀琀椀漀渀 椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀  戀椀最椀渀琀                  㴀 一唀䰀䰀Ⰰ 
     @functionid bigint               = NULL,਀ऀ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
						@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 
		  IF @functionid = 0਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check function id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀甀渀挀琀椀漀渀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the function id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctionIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END  ਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT file_id਀ऀऀ               䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 
					  WHERE file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
							AND general_field_name_id = @genfield_nameid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO people.file_to_function_links ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开椀搀Ⰰ      最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀⤀ 
		      VALUES (@fileid, @functionid, @genfield_nameid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_group_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 琀漀 氀椀渀欀 愀 昀椀氀攀 琀漀 愀 昀椀氀攀 最爀漀甀瀀⸀ 
-- Authenticates both controller and editor਀ 
-- Input is a file ID, a file group ID and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 琀漀 氀椀渀欀 愀 昀椀氀攀 琀漀 愀 昀椀氀攀 最爀漀甀瀀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀ 伀瀀琀椀漀渀愀氀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid file group ID or file ID or permission failures.਀⨀ 
* **Side Effects:**਀⨀ 
* - Adds a new record to xref.file_group_links਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Editor' role.਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 愀渀搀 䀀昀椀氀攀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 
* - The connected user must have viewing permission for the file਀⨀ ⴀ 吀栀攀 昀椀氀攀 洀甀猀琀 戀攀 昀爀攀攀 昀爀漀洀 攀搀椀琀 爀攀猀琀爀椀挀琀椀漀渀猀 眀栀椀挀栀 攀砀挀氀甀搀攀 琀栀攀 挀甀爀爀攀渀琀 甀猀攀爀⸀ 
* - The connected user must have edit permission for the file group which the file is to be linked to.਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
     @filegroupid bigint              = NULL,               -- File group ਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ    ⴀⴀ 一漀琀攀猀 昀漀爀 琀栀攀 攀渀琀爀礀 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus nchar(10)  = '',     -- Status of authorisation for the connected user to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
	    @filegroupauthstatus nchar(10)       = '',     -- Status of the authentication status for the connected user for the given file group. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
	  IF @fileid = 0਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	  IF @fileid IS NULL -- Check if a file id was supplied਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀✀⤀㬀 
		 END -- End responding to no file id supplied਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀   
		 BEGIN	-- Check if the file id exists and the user has permission to access the file, NOT if the user has edit permission for the file.਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid),  '.  ',  @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist');਀ऀऀऀऀऀ䔀一䐀 
				ELSE -- The file ID exists and the user has permission to access it.  Don't do the next check if the user does not have viewing permission for the file਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀猀 昀爀攀攀 昀爀漀洀 攀搀椀琀 爀攀猀琀爀椀挀琀椀漀渀猀 眀栀椀挀栀 攀砀挀氀甀搀攀 琀栀攀 挀甀爀爀攀渀琀 甀猀攀爀 
						EXEC [internal].[usp_AUTHENTICATE_file_ed_free] ਀ ऀऀऀऀऀऀऀ䀀昀椀氀攀椀搀开琀漀挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
							@user_authentication_reslt_fgef = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
								BEGIN -- The file has edit permission restrictions which do not include the connected user਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀    㴀 ✀䘀愀椀氀✀㬀 
									SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
										@message_id = 'FileEdPermNotFree', ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  									IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ  ✀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
									ELSE ਀ऀऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䔀搀倀攀爀洀一漀琀䘀爀攀攀✀⤀㬀 
								END਀ऀऀऀऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 琀栀攀 昀椀氀攀 椀猀 昀爀攀攀 昀爀漀洀 攀搀椀琀 爀攀猀琀爀椀挀琀椀漀渀猀 眀栀椀挀栀 攀砀挀氀甀搀攀 琀栀攀 挀甀爀爀攀渀琀 甀猀攀爀 
		 END   -- End checking if file id is valid and the user has permission to access it਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
਀         ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀 
	     IF @filegroupid = 0਀ऀऀ    匀䔀吀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		 IF @filegroupid IS NULL -- Check if a file group id was supplied਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䘀椀氀攀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileGroupId');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE -- A file group id was supplied.  Check that file group id exists਀ऀऀ   䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀 
			 IF NOT EXISTS (SELECT file_group_id਀ऀऀऀऀ             䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 
							WHERE file_group_id = @filegroupid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  						SET @message =  CONCAT(@message, ' | ', 'File Group ID: ', ISNULL(CONVERT(nvarchar(10), @filegroupid), 'NULL'), '.  ', @tempmessage); ਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message =  CONCAT_WS(' | ', @message, 'A database level message error occurred on FileGroupIdNotExist');਀ 
				END਀ऀऀ     䔀䰀匀䔀  ⴀⴀ 吀栀攀 昀椀氀攀 最爀漀甀瀀 䤀䐀 搀漀攀猀 攀砀椀猀琀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀 
			   BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀氀开最爀瀀开攀搀开瀀洀崀  
 						@filegroupid_tocheck =  @filegroupid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀瀀 㴀 䀀昀椀氀攀最爀漀甀瀀愀甀琀栀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @filegroupauthstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀 
								SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䜀爀瀀䔀搀倀攀爀洀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File Group ID: ', CONVERT(nvarchar(20), @filegroupid),  '.  ',  @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileGrpEdPerm');਀ऀऀऀऀऀऀऀ䔀一䐀 
			   END -- End checking if the user has edit permission for the file group.਀           䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀⸀ 
਀ 
      -- Check if a matching record already exists਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 伀渀氀礀 搀漀 琀栀椀猀 挀栀攀挀欀 椀昀 戀漀琀栀 琀栀攀 昀椀氀攀 椀搀 愀渀搀 琀栀攀 昀椀氀攀 最爀漀甀瀀 椀搀 愀爀攀 瘀愀氀椀搀 
	    BEGIN਀ऀऀऀ 䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				   	      FROM xref.file_group_links ਀ऀऀऀऀऀऀ 圀䠀䔀刀䔀           昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
						       AND file_group_id = @filegroupid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists');਀ऀऀऀ   䔀一䐀 
		END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End of IF authentication status = Pass.਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO xref.file_group_links਀ऀऀ             ⠀昀椀氀攀开最爀漀甀瀀开椀搀Ⰰ 昀椀氀攀开椀搀Ⰰ              渀漀琀攀猀⤀ 
		      VALUES (@filegroupid, @fileid,   ISNULL(@inputnotes, '')); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开椀渀琀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䤀渀猀攀爀琀猀 愀渀 椀渀琀攀最攀爀 瘀愀氀甀攀 昀漀爀 愀 昀椀氀攀⸀ 
-- Input is a file id, file integer name id and an integer.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_int_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @integervalue bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
			 SET @fileintnameid = NULL;਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the integer value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF EXISTS (SELECT file_int_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 
			 				WHERE file_int_name_id = @fileintnameid਀ऀऀऀऀऀऀऀ           䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀  
		             (file_id, file_int_name_id,  int_value)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀椀搀Ⰰ 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀Ⰰ    䀀椀渀琀攀最攀爀瘀愀氀甀攀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_multi_select_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description: Inserts a file to multi-select attribute link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @filemslistid bigint             = NULL,਀ऀ 䀀昀椀氀攀洀猀愀琀琀爀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 　 
			 SET @filemslistid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 　  
			 SET @filemsattrid = NULL;਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
						@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
		  IF @filemslistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file multi-select attribute list has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_ms_list_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 
			  	 				 WHERE file_ms_list_id = @filemslistid) -- Check if the attribute list id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @filemsattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
਀          ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀愀椀爀 攀砀椀猀琀猀 
		  IF @filemsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE file_ms_attr_id = @filemsattrid਀ऀऀऀऀऀऀऀऀऀ   䄀一䐀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀  
					 BEGIN -- multi-select list id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
		  -- Multiple attributes from the same list are permitted, providing they are not duplicated਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 
			 				WHERE     file_ms_list_id = @filemslistid਀ऀऀऀऀऀऀऀ      䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀ऀऀऀऀऀऀऀ       
								  AND         file_id = @fileid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
		             (file_id,      file_ms_list_id, file_ms_attr_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀椀搀Ⰰ 䀀昀椀氀攀洀猀氀椀猀琀椀搀Ⰰ   䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_people_list_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
-- which links a people list to a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 愀 瀀攀漀瀀氀攀开氀椀猀琀 椀搀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀  戀椀最椀渀琀                  㴀 一唀䰀䰀Ⰰ 
     @peoplelistid bigint             = NULL,਀ऀ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '',  -- Communicates if the user is not authorised to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 
		  IF @peoplelistid = 0਀ऀऀऀ 匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check people list id has been supplied਀ऀऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoPeopleListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 瀀攀漀瀀氀攀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the people list id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
			                 FROM people.people_list_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'PeopleListIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END  ਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 
		               FROM people.file_to_people_list_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND people_list_id = @peoplelistid਀ऀऀऀऀऀऀऀ䄀一䐀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
	    END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀  
		             (file_id,  people_list_id,      general_field_name_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀椀搀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀Ⰰ 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_radiob_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description: Inserts a file to radio button attribute link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @file_radioblistid bigint        = NULL,਀ऀ 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   ਀    䈀䔀䜀䤀一 
       SET @userauthentication_status = 'Pass';਀ऀ   匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
	END਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @file_radioblistid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @file_radiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
			  IF @file_radioblistid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀऀ 䔀一䐀 
਀ 
਀ऀऀ   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  ⴀⴀ 昀椀氀攀 椀搀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀瘀攀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN ਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀  
								 FROM base.file_metadata਀ऀऀऀ  ऀ ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 昀椀氀攀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
								  FROM file_attr.file_radio_button_list_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ 
 			 END਀  
			-- Attribute list id is valid.  Check if it has been linked to that file already਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT file_radiob_list_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
			 				WHERE file_radiob_list_id = @file_radioblistid਀ऀऀऀऀऀऀऀऀ          䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'AttrExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
			-- Check if the list id is restricted and if the user does not have controller permission.਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT restricted਀ऀऀऀ                 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
							WHERE file_radiob_list_id = @file_radioblistid਀ऀऀऀऀऀऀऀ      䄀一䐀 爀攀猀琀爀椀挀琀攀搀 㴀 ✀吀爀甀攀✀⤀ 
			   AND @iscontroller = 'No'਀ऀऀऀ    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䰀椀渀欀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoLinkPermission.');਀ऀऀऀ    䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀   
		  -- NULL is permitted, providing that the radio button list id is valid.਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  -- Check that the radio button attribute and radio button list id pair exists਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
								  FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀     昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 
									   AND file_radiob_list_id = @file_radioblistid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO file_attr.file_radio_button_links ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀Ⰰ  昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀⤀ 
		      VALUES (@fileid, @file_radioblistid,   @file_radiobattrid)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_real_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Inserts a real value for a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 昀椀氀攀 爀攀愀氀 渀愀洀攀 椀搀 愀渀搀 愀 爀攀愀氀 渀甀洀戀攀爀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开爀攀愀氀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @filerealnameid bigint           = NULL,਀ऀ 䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filerealnameid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
			  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		  -- Check the file real number name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM file_attr.file_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			IF EXISTS (SELECT file_real_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 
			 				WHERE file_real_name_id = @filerealnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀  
		             (file_id,  file_real_name_id,  real_value)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀椀搀Ⰰ 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀Ⰰ    䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_text_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description: Inserts a text value for a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 昀椀氀攀 琀攀砀琀 渀愀洀攀 椀搀 愀渀搀 愀 琀攀砀琀 猀琀爀椀渀最⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开琀攀砀琀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @filetextnameid bigint           = NULL,਀ऀ 䀀琀攀砀琀瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filetextnameid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the file id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFileID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
						@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filetextnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀攀砀琀一愀洀攀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTextNameId.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file text name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_free_text_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_free_text_name_id = @filetextnameid) -- Check if the file text name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TextIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 琀攀砀琀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 		  -- Check if a duplicate record already exists਀ऀऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
							 FROM file_attr.file_free_text_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 
							            AND file_id = @fileid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO file_attr.file_free_text_values ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀Ⰰ 琀攀砀琀开瘀愀氀甀攀⤀ 
		      VALUES (@fileid, @filetextnameid,        @textvalue)਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table file_to_com_obj_ms_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 昀椀氀攀 瘀椀愀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
-- Input is a file id, a common object list id and a common object id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
-- Both controler and editor are authenticated.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀渀欀崀 
਀     䀀昀椀氀攀椀搀  戀椀最椀渀琀                  㴀 一唀䰀䰀Ⰰ 
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus nchar(10)     = '',  -- Communicates if the user is not authorised to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		 -- Check the common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE  ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		               FROM com_obj.file_to_com_obj_ms_list_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'RecordExists', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE  ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
		END਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF NOT EXISTS (SELECT common_object_list_id਀ऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
					  WHERE common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO com_obj.file_to_com_obj_ms_list_links ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀Ⰰ 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀⤀ 
		      VALUES (@fileid, @commonobjlistid,      @commonobjectid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_file_to_com_obj_radiob_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀戀开氀椀猀琀开氀椀渀欀猀 
-- which links a common object to a filet via a multi-select list਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀⸀ 
-- Output is a status message and a transaction status. ਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_to_com_obj_radiob_lnk]਀ 
     @fileid  bigint                  = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transactionmessage2 nvarchar(200)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		 -- Check the common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀        䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
    -- Check for duplicate record਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		               FROM com_obj.file_to_com_obj_radiob_links਀ऀऀऀऀऀ  圀䠀䔀刀䔀  昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND common_object_list_id = @commonobjlistid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀऀ䔀一䐀 
਀ 
	  -- Check that the cross reference record exists਀ऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
	                   FROM com_obj.common_object_lists AS col਀ऀऀऀऀऀ  圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					        AND common_object_id      = @commonobjectid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), '  ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidListItem.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀  
		             (file_id,  common_object_list_id, common_object_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀椀搀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀Ⰰ      䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀开甀猀攀爀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Creates a new record in table file_to_user_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 甀猀攀爀 琀漀 愀 昀椀氀攀⸀ 
-- Input is a file id and a sid_id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_file_user_link]਀ 
	 @fileid bigint                   = NULL,਀     䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
	 @genfield_nameid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  -- Check that a file id was supplied਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		 SET @fileid = NULL;਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀  
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Check that the file id is valid਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 䘀椀氀攀 搀愀琀愀 
		   EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀ            䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
	            @user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀ   䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- file id does not exist or the user does not have permission to edit it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
				 END			 ਀ऀऀ 䔀一䐀 
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 瀀攀爀猀漀渀 椀搀 
		  IF @sidid = 0਀ऀऀऀ 匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			                 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀    ⴀⴀ 䌀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT file_id਀ऀऀ               䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀 
					  WHERE file_id = @fileid਀ऀऀऀऀऀ        䄀一䐀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀 
							AND general_field_name_id = @genfield_nameid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO people.file_to_user_links ਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  猀椀搀开椀搀Ⰰ     最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀⤀ 
		      VALUES (@fileid, @sidid, @genfield_nameid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		 ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开瀀攀爀猀漀渀愀氀开瀀攀漀瀀氀攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into people.people_list_names to create a people list name and links it to the connected user.਀ⴀⴀ 吀栀椀猀 愀氀氀漀眀猀 愀 甀猀攀爀 琀漀 挀爀攀愀琀攀 琀栀攀椀爀 漀眀渀 瀀攀爀猀漀渀愀氀 瀀攀漀瀀氀攀 氀椀猀琀 愀渀搀 氀椀渀欀 昀椀氀攀猀 愀渀搀 搀漀挀甀洀攀渀琀猀 琀漀 椀琀⸀ 
-- Output is a status message, transaction status and new record id.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀ 
CREATE PROCEDURE [editing].[usp_INS_personal_people_list] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@connecteduser_sidid bigint          = '',਀ऀऀ䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀               㴀 ✀✀Ⰰ              
		@peoplelist_name nvarchar(50)        = '',਀ऀऀ䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀           㴀 ✀✀Ⰰ  
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  SELECT @connecteduser_sidid = sid_id  -- Retrieve the SID ID of the connected user਀    䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
   WHERE   sl.sid਀         㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
਀  匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀 㴀 ⴀⴀ 匀琀爀椀瀀 琀栀攀 搀漀洀愀椀渀 渀愀洀攀 昀爀漀洀 琀栀攀 甀猀攀爀渀愀洀攀⸀   
    CASE ਀        圀䠀䔀一 䌀䠀䄀刀䤀一䐀䔀堀⠀✀尀✀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀ 㸀 　 吀䠀䔀一  
            RIGHT(@username, LEN(@username) - CHARINDEX('\', @username))਀        圀䠀䔀一 䌀䠀䄀刀䤀一䐀䔀堀⠀✀䀀✀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀ 㸀 　 吀䠀䔀一  
            LEFT(@username, CHARINDEX('@', @username) - 1)਀        䔀䰀匀䔀  
            @username -- No domain part, return as-is਀    䔀一䐀 
	 ਀  匀䔀吀 䀀搀攀猀挀爀椀瀀琀椀漀渀 㴀 䌀伀一䌀䄀吀⠀✀倀攀爀猀漀渀愀氀 氀椀猀琀 昀漀爀 ✀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀 
  ਀  匀䔀吀 䀀洀渀攀洀漀渀椀挀 㴀 ✀倀攀爀猀漀渀愀氀✀ 
਀ 
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
	  IF EXISTS (SELECT pln.name਀ऀऀऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
				  WHERE pln.name = @peoplelist_name)਀ऀऀ   䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT(@message, ' | ', LEFT(@peoplelist_name, 10), '...  ',  @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀ   䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
			EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
				@attr_name        = @peoplelist_name,਀ऀऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
				@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempvalidationstatus = 'Fail'਀ऀऀऀऀ䈀䔀䜀䤀一 
				  SET @message = CONCAT_WS(' |', @message, @validationmessage); ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				  SET @data_validation_status = 'Fail';਀ऀऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀ऀऀऀ   ऀऀ  
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  BEGIN TRANSACTION;਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
		             (mnem,                              name,           description)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 䀀瀀攀漀瀀氀攀氀椀猀琀开渀愀洀攀Ⰰ   䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀⤀㬀  
਀ऀ  匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀  ⴀⴀ 刀攀琀爀椀攀瘀攀 琀栀攀 䤀䐀 漀昀 琀栀攀 渀攀眀 瀀攀漀瀀氀攀 氀椀猀琀 
਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀  ⴀⴀ 䰀椀渀欀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀✀猀 䤀䐀 琀漀 琀栀攀 渀攀眀氀礀ⴀ挀爀攀愀琀攀搀 瀀攀漀瀀氀攀 氀椀猀琀⸀ 
		             (people_list_id,               sid_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀渀攀眀爀攀挀漀爀搀椀搀Ⰰ  䀀挀漀渀渀攀挀琀攀搀甀猀攀爀开猀椀搀椀搀⤀㬀 
					 ਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开搀漀挀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a document tag to document link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_tag_doc_link] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newrecordid bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@docauthenticationstatus nchar(10)     = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'NoDocIDAccess', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @tag_id)਀ऀऀ 䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @tag_id), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
  IF @data_validation_status = 'Pass' AND਀     䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开搀漀挀开氀椀渀欀开椀搀 
	           FROM tagging.tag_to_document_links਀ऀऀऀ  圀䠀䔀刀䔀    搀漀挀开椀搀 
			        = @documentid਀ऀऀऀऀ䄀一䐀    琀愀最开椀搀 
				    = @tag_id)਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ 䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  END -- END IF @userauthentication_status = 'Pass'਀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ 
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ  ⴀⴀ 匀攀琀 挀愀瀀椀琀愀氀椀猀愀琀椀漀渀 琀漀 洀愀琀挀栀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀⸀  
		SELECT @documentid = doc_id਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 
		 WHERE doc_id = @documentid;਀ऀऀ䤀一匀䔀刀吀 䤀一吀伀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
		            (doc_id,       tag_id)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀琀愀最开椀搀⤀ 
	    SET @newrecordid = SCOPE_IDENTITY();਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_INS_tag_group_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 琀愀最 琀漀 琀愀最 最爀漀甀瀀 氀椀渀欀⸀ 
-- Authenticates for both controller and editor. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开最爀漀甀瀀开氀椀渀欀崀  
਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @tag_groupid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set will be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
			 BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 END਀ 
			 ELSE  -- Check if the user has rights to edit the tag਀ऀऀऀऀ  䈀䔀䜀䤀一 
					EXEC [internal].[usp_AUTHENTICATE_tag_edit]਀ऀऀऀऀऀऀ 䀀琀愀最开椀搀开攀瀀 㴀 䀀琀愀最开椀搀Ⰰ 
						 @user_authentication_result_tag = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN਀ऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 							   SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_id), '  ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
							   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagPermission');		   ਀ऀऀऀऀऀऀ 䔀一䐀 
				  END਀ 
	  --  Check the tag group ID.਀ऀ   
	  	  IF @tag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_groupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 最爀漀甀瀀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGroupID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- Tag group has been supplied.  Check if it exists. ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @tag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						  SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_groupid), '  ', @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
਀               ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀甀琀栀攀渀琀椀挀愀琀攀搀 昀漀爀 琀栀攀 琀愀最 最爀漀甀瀀⸀ 
				ELSE਀ऀऀऀऀऀ䈀䔀䜀䤀一 
					    EXEC [internal].[usp_AUTHENTICATE_tag_group]਀ऀऀऀऀऀऀऀ䀀琀愀最开最爀漀甀瀀椀搀开攀瀀 㴀 䀀琀愀最开最爀漀甀瀀椀搀Ⰰ 
							@user_authentication_result_tg = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id   = 'NoTagGrpPermission', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开最爀漀甀瀀椀搀⤀Ⰰ ✀  ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀瀀倀攀爀洀椀猀猀椀漀渀✀⤀㬀ऀऀ    
							END਀ऀऀऀऀऀ䔀一䐀 
 ਀     ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	    AND EXISTS (SELECT tag_group_id ਀ऀऀ              䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 
					 WHERE    tag_id਀ऀऀऀऀऀ       㴀 䀀琀愀最开椀搀 
					   AND    tag_group_id ਀ऀऀऀऀऀ       㴀 䀀琀愀最开最爀漀甀瀀椀搀⤀ 
			 BEGIN -- A duplicate record exists਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'RecordExists', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
			 END਀ऀऀ  
	    ਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO tagging.tag_to_tag_group_links ਀                     ⠀ 琀愀最开椀搀Ⰰ  琀愀最开最爀漀甀瀀开椀搀⤀ 
			  VALUES (@tag_id, @tag_groupid)਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开琀爀攀攀开渀漀搀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a document tag into a tag relationship tree.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_INS_tag_tree_node] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀琀愀最开琀爀攀攀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	 @parentid bigint                 = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newnode nvarchar(4000)          = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@parent_hierarchyid hierarchyid,਀ऀऀ䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @tag_id)਀ऀऀ 䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @tag_id), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ऀऀ 䔀䰀匀䔀  ⴀⴀ 吀愀最 攀砀椀猀琀猀⸀  䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 攀搀椀琀 琀栀攀 琀愀最 
               -- Adding a tag to a relationship tree changes the tag function਀ऀ           ⴀⴀ 䠀攀渀挀攀 琀栀攀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 攀搀椀琀 爀椀最栀琀猀 昀漀爀 琀栀攀 琀愀最 椀渀 漀爀搀攀爀 琀漀 愀搀搀 椀琀 琀漀 愀 琀爀攀攀⸀ 
			  BEGIN਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开攀搀椀琀崀 
					 @tag_id_ep = @tag_id,਀ऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				  IF @temp_userauth_status = 'Fail'਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 						   SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagPermission');		   ਀ऀऀऀऀऀ 䔀一䐀 
			  END਀  
 ਀ 
਀  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 瀀愀爀攀渀琀 䤀䐀 
    IF @parentid = 0਀ऀ    匀䔀吀 䀀瀀愀爀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	IF @parentid IS NULL਀ऀ   䈀䔀䜀䤀一 
	    -- Check if a root node already exists for this tag tree਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀⠀ 
		       SELECT tag_tree_id਀ऀऀऀ     䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
				WHERE    tag_tree_id਀ऀऀऀऀ      㴀 䀀琀愀最开琀爀攀攀椀搀 
				  AND tag_tree_hierarchyid = hierarchyid::GetRoot()਀ऀऀऀऀ  ⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'RootNodeExists', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀漀漀琀一漀搀攀䔀砀椀猀琀猀✀⤀㬀ऀऀ    
					 END਀ऀ   䔀一䐀 
	ELSE -- A parent id has been supplied.  NULL is permitted and will be stored as root if a root does not already exist.਀ऀ     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 瀀愀爀攀渀琀 䤀䐀 攀砀椀猀琀猀 昀漀爀 琀栀愀琀 琀爀攀攀 䤀䐀 
	   BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		                 FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @parentid਀ऀऀऀऀऀऀ  䄀一䐀    琀愀最开琀爀攀攀开椀搀 
						      = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀倀愀爀攀渀琀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ParentNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
਀ऀ   䔀一䐀 
	   		 ਀ 
		 -- Check the tag tree ID਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag tree id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagTree', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
								       = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
				 ELSE  --  A valid tag tree has been supplied.  Check that the user has rights to it. ਀ऀऀऀऀ  䈀䔀䜀䤀一 
					EXEC [internal].[usp_AUTHENTICATE_tag_tree]਀ऀऀऀऀऀ   䀀琀愀最开琀爀攀攀椀搀开攀瀀 㴀 䀀琀愀最开琀爀攀攀椀搀Ⰰ 
					   @user_authentication_result_tt = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					  BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoTagTreePerm', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀倀攀爀洀⸀✀⤀㬀 
਀ऀऀऀऀऀ  䔀一䐀 
				  END਀          䔀一䐀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
       BEGIN TRANSACTION;਀ऀ    䤀䘀 䀀瀀愀爀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		   SET @new_hierarchyid = hierarchyid::GetRoot(); -- If no parent, set as root਀ऀऀ䔀䰀匀䔀   
		   BEGIN਀ऀऀ     匀䔀䰀䔀䌀吀 䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 㴀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀  ⴀⴀ 匀攀琀 琀栀攀 瀀愀爀攀渀琀 琀漀 䀀瀀愀爀攀渀琀椀搀 
			   FROM tagging.tag_tree_nodes਀ऀऀऀ  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
			        = @parentid਀ऀऀऀ ⴀⴀ 䜀攀渀攀爀愀琀攀 渀攀眀 栀椀攀爀愀爀挀栀礀 椀搀 愀猀 挀栀椀氀搀 漀昀 瀀愀爀攀渀琀 
			 SELECT @new_hierarchyid = @parent_hierarchyid.GetDescendant(਀ऀऀऀ    ⠀匀䔀䰀䔀䌀吀 䴀䄀堀⠀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 
				   FROM tagging.tag_tree_nodes਀ऀऀऀऀ  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀ 
				    AND tag_tree_hierarchyid.GetLevel() = @parent_hierarchyid.GetLevel() + 1), NULL);਀           䔀一䐀 
		-- Insert the new node਀ऀऀ䤀一匀䔀刀吀 䤀一吀伀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
		            (tag_tree_id,  tag_id, tag_tree_hierarchyid)਀ऀऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀琀愀最开琀爀攀攀椀搀Ⰰ 䀀琀愀最开椀搀Ⰰ     䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀⤀ 
	    SET @newrecordid = SCOPE_IDENTITY();਀ऀऀ匀䔀吀 䀀渀攀眀渀漀搀攀 㴀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀⸀吀漀匀琀爀椀渀最⠀⤀㬀 
         COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
   ਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀昀开椀渀瀀甀琀开猀琀攀瀀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Creates a link from a file to a workflow instance step input.  ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 愀渀搀 椀渀瀀甀琀 猀琀攀瀀 椀搀⸀  
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀昀开椀渀瀀甀琀开猀琀攀瀀开昀椀氀攀崀  
         ਀ऀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @input_step_id bigint            = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@fileauthenticationstatus nchar(10)  = '',     -- Status of authorisation for the connected user to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@docauthenticationstatus nchar(10)   = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
	  IF @fileid = 0਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	  IF @fileid IS NULL -- Check if a file id was supplied਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀✀⤀㬀 
		 END -- End responding to no file id supplied਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀   
		 BEGIN	-- Check if the file id exists and the user has permission to access the file, NOT if the user has edit permission for the file.਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid),  '.  ',  @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist');਀ऀऀऀऀऀ䔀一䐀 
		 END   -- End checking if file id is valid and the user has permission to access it਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
਀ 
	  IF @input_step_id = 0਀ऀऀ 匀䔀吀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an instance step id was supplied.਀ऀ  䤀䘀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the instance step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
							  FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 ⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
				BEGIN਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
					@instance_step_to_check = @input_step_id,਀ऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
				 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 
		 				SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ 䔀一䐀ऀऀ  
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	 IF EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀猀椀瀀⸀昀椀氀攀开椀搀 
		   FROM workflow_instances.workflow_step_input_files AS wsip਀ऀऀ  圀䠀䔀刀䔀 眀猀椀瀀⸀昀椀氀攀开椀搀  
		        =   @fileid਀ऀऀ    䄀一䐀 眀猀椀瀀⸀眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀  
				=            @input_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀ䔀一䐀 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO workflow_instances.workflow_step_input_files਀ऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀⤀ 
		      VALUES (@fileid,          @input_step_id); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_SEL_all_user_booking_ids]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description: Selects all booking IDs for the connected user.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_SEL_all_user_booking_ids]਀ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀椀搀 戀椀最椀渀琀                          㴀 一唀䰀䰀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀     
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
		-- Retrieve user ID਀ऀऀ匀䔀吀 䀀甀猀攀爀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
		                 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀       匀䔀䰀䔀䌀吀  
	          booking_id       AS [Booking ID],਀ऀऀऀ  戀氀⸀搀漀挀开椀搀        䄀匀 嬀䐀漀挀甀洀攀渀琀 䤀䐀崀Ⰰ 
			  booking_status   AS [Booking Status],਀ऀऀऀ  䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 甀猀攀爀开椀搀⤀    䄀匀 嬀唀猀攀爀 䤀䐀崀Ⰰ 
			  system_username  AS [System Username],਀ऀऀऀ  䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 戀漀漀欀椀渀最开搀愀琀攀Ⰰ ㄀㈀　⤀    䄀匀 嬀䈀漀漀欀椀渀最 䐀愀琀攀崀Ⰰ 
			  ISNULL(comments, '')       AS [Comments],਀ऀऀऀ  䤀匀一唀䰀䰀⠀爀攀氀攀愀猀攀开渀甀洀戀攀爀Ⰰ ✀✀⤀ 䄀匀 嬀刀攀氀攀愀猀攀 一甀洀戀攀爀崀 
 		 FROM base.booking_log AS bl਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
           ON bl.doc_id = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 戀氀⸀甀猀攀爀开椀搀 㴀 䀀甀猀攀爀椀搀 
		ORDER BY [Booking Date] DESC਀ 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ     刀伀䰀䰀䈀䄀䌀䬀㬀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开戀漀漀欀开椀渀开昀椀氀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-02-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䰀椀猀琀猀 愀氀氀 琀栀攀 戀漀漀欀攀搀 椀渀 昀椀氀攀猀 昀漀爀 愀 戀漀漀欀椀渀最 椀搀⸀     
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_SEL_book_in_files]਀ 
	  @booking_id bigint               = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @message nvarchar(1000)          = NULL OUTPUT,਀ऀ  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀椀搀 戀椀最椀渀琀                          㴀 一唀䰀䰀Ⰰ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@iscontroller nvarchar(3)               = 'No',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   ਀ऀऀ䈀䔀䜀䤀一 
		   SET @userauthentication_status = 'Pass';਀ऀऀ   匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
		END  ਀ 
  ਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		-- Retrieve user ID਀ऀऀ匀䔀吀 䀀甀猀攀爀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
		                 FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 戀漀漀欀椀渀最 椀搀 攀砀椀猀琀猀⸀ 
਀ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 戀漀漀欀椀渀最 椀搀 椀猀 瘀愀氀椀搀⸀  䘀漀爀 攀搀椀琀漀爀 洀甀猀琀 戀攀 愀 戀漀漀欀椀渀最 椀搀 琀栀攀礀 挀爀攀愀琀攀搀⸀  䘀漀爀 挀漀渀琀爀漀氀氀攀爀Ⰰ 愀渀礀 戀漀漀欀椀渀最 椀搀⸀  
		IF @data_validation_status = 'Pass'਀ऀऀ  䈀䔀䜀䤀一 
਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀  
				(਀ऀऀऀऀ匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开椀搀 
				  FROM base.booking_log AS bl਀ऀऀऀऀ ⤀  
				OR (@iscontroller = 'No' AND਀ऀऀऀऀ一伀吀 䔀堀䤀匀吀匀 
					(਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 戀氀⸀戀漀漀欀椀渀最开椀搀 
					  FROM base.booking_log AS bl਀ऀऀऀऀऀ 圀䠀䔀刀䔀 戀氀⸀甀猀攀爀开椀搀 㴀 䀀甀猀攀爀椀搀 
					 ) )਀ 
਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䈀䤀刀攀挀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidBIRec.');਀ऀऀऀऀ䔀一䐀 
		  END਀ 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);;਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀ⴀⴀⴀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 琀攀砀琀 昀椀攀氀搀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀戀漀漀欀攀搀开椀渀开昀椀氀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.booking_id = @booking_id  --### The search criteria    ਀ऀऀऀ  ⤀ 
਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ऀऀ 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ     刀伀䰀䰀䈀䄀䌀䬀㬀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开攀搀开搀漀挀开最爀漀甀瀀开攀搀开瀀攀爀洀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 愀氀氀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 
-- for which the connected user has edit permission.਀ⴀⴀ 伀渀氀礀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 昀漀爀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 
-- will be listed.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- ===============================================਀ 
CREATE PROCEDURE [editing].[usp_SEL_ed_doc_group_ed_perms] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
        @zerorecordsmessage nvarchar(200)    = '', -- Communicates that zero records were retrieved਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @nopermissionmessage = ISNULL(@username, '') + '  ' + @tempmessage;਀ऀ    䔀䰀匀䔀  
		   SET @nopermissionmessage = 'A database level message error occurred on NoPermission.';਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
		BEGIN TRY਀ऀऀ       圀䤀吀䠀 䌀漀洀戀椀渀攀搀刀攀猀甀氀琀猀 䄀匀  
					(SELECT DISTINCT dgn.doc_group_id AS 'Doc Group ID',਀ऀऀऀऀऀऀ             搀最渀⸀愀琀琀爀开渀愀洀攀    䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀ 
					FROM xref.doc_group_names AS dgn਀ऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 搀最攀瀀昀氀 
						ON       dgn.doc_group_id਀ऀऀऀऀऀऀऀ㴀 搀最攀瀀昀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
				LEFT JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ伀一  搀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
							=  fln.function_list_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						ON   fln.function_list_id ਀ऀऀऀऀऀऀऀ㴀  昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
				LEFT JOIN  people.duty_functions AS df਀ऀऀऀऀऀऀ伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
							= df.function_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						ON  dfsl.function_id਀ऀऀऀऀऀऀऀ㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
				INNER JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀऀ        伀一  搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀  
						   = dgn.doc_group_id				਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						ON  dfsl.sid_id਀ऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
							AND਀ऀऀऀऀऀऀऀ搀最瘀瀀⸀猀椀搀开椀搀  
							= sl.sid_id਀ऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
						     ਀ऀऀऀऀ唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
						   dgn.attr_name    AS 'Doc Group Name'਀ऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
				 LEFT JOIN user_restr.doc_group_edit_perm_people_lst AS dgeppl	਀ऀऀऀऀऀऀ   伀一      搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
							  = dgeppl.doc_group_id਀ऀऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
						   ON dgeppl.people_list_id ਀ऀऀऀऀऀऀऀ  㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				 LEFT JOIN people.people_lists AS pl਀ऀऀऀऀऀऀ   伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
							 = pl.people_list_id਀ऀऀऀऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
				           ON   dgvp.doc_group_id ਀ऀऀऀऀऀऀ       㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				 LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀ   伀一    瀀氀⸀猀椀搀开椀搀 
							   = sl.sid_id਀ऀऀऀऀऀऀ   䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 
						       = sl.sid_id਀ऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀  
				਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 嬀䐀漀挀 䜀爀漀甀瀀 䤀䐀崀Ⰰ 嬀䐀漀挀 䜀爀漀甀瀀 一愀洀攀崀 
                           FROM  CombinedResults਀                       伀刀䐀䔀刀 䈀夀 嬀䐀漀挀 䜀爀漀甀瀀 一愀洀攀崀㬀 
਀ ऀऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
				BEGIN਀ऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					   @message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				   ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
				END਀ 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀  ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @transactionmessage = @tempmessage;਀ऀऀऀ 䔀䰀匀䔀  
				 SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   		  END TRY਀ऀऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
			 SET @transaction_status = 'Bad';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'SelectError', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
				CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀऀ 䔀䰀匀䔀  
				SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
    END਀ऀ  
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开搀愀琀攀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 搀愀琀攀 瘀愀氀甀攀 昀漀爀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id, document date name id and a date value.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开搀愀琀攀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docdatenameid bigint            = NULL,਀ऀ 䀀搀愀琀攀瘀愀氀甀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docdatenameid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docdatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_date_name_id = @docdatenameid) -- Check if the doc date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 		  -- Check that the record exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
							 FROM doc_attr.doc_date_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 
							            AND doc_id = @documentid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE doc_attr.doc_date_values ਀ऀऀ    匀䔀吀 搀愀琀攀开瘀愀氀甀攀 㴀 䀀搀愀琀攀瘀愀氀甀攀 
		  WHERE               doc_id = @documentid਀ऀऀ        䄀一䐀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_doc_grp_lnk_notes_rstr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description: Updates the notes for a document to document group link.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀ⴀⴀ 伀渀氀礀 瀀攀爀洀椀琀猀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 愀渀搀 搀漀挀甀洀攀渀琀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- Input is a document id, document group id and notes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开最爀瀀开氀渀欀开渀漀琀攀猀开爀猀琀爀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @docgroupid bigint               = NULL,਀ऀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 　 
		SET @docgroupid = NULL;਀ 
		IF @docgroupid IS NULL਀ऀऀ   䈀䔀䜀䤀一 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀䤀搀✀Ⰰ  
				  @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupId');਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀ   䔀一䐀 
		 ELSE਀ 
	 -- Authenticate the user for the given document group਀ऀ ⴀⴀ 吀栀椀猀 愀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
	  EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀搀漀挀最爀漀甀瀀椀搀Ⰰ 
			@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀ    匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'NoDocGroupPermission', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 最爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀搀漀挀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
		END਀ 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
		   ELSE਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀  
			-- Check if the record exists਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND NOT EXISTS (SELECT doc_id਀ऀऀऀऀऀऀ   ऀ     䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 
			 				    WHERE doc_group_id = @docgroupid਀ऀऀऀऀऀऀऀऀ      䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE xref.doc_group_links਀ऀऀ    匀䔀吀 渀漀琀攀猀 㴀 䀀椀渀瀀甀琀渀漀琀攀猀 
			  WHERE       doc_id = @documentid਀ऀऀऀ    䄀一䐀 搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开椀渀琀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀渀 椀渀琀攀最攀爀 瘀愀氀甀攀 昀漀爀 愀 搀漀挀甀洀攀渀琀⸀ 
-- Input is a document id, document integer name id and an integer.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_int_value]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @integervalue bigint		      = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 　 
			 SET @docintnameid = NULL;਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check the doc int name field id਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document int name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 椀渀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 椀渀琀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- No validation is performed on the integer because an invalid value਀ऀऀ  ⴀⴀ 眀椀氀氀 爀攀猀甀氀琀 椀渀 愀渀 攀爀爀漀爀 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 椀猀 攀砀攀挀甀琀攀搀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT doc_int_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 
			 				WHERE doc_int_name_id = @docintnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀  
		    SET int_value = @integervalue਀ऀऀ  圀䠀䔀刀䔀              搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		        AND doc_int_name_id = @docintnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 愀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 爀攀挀漀爀搀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_multi_select_link] ਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
     @docmslistid bigint              = NULL,਀ऀ 䀀搀漀挀洀猀愀琀琀爀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	 @newdocmsattrid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
		@nopermissionmessage nvarchar(200)      = '', -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
		@docidinvalidmessage nvarchar(200)      = '', -- Communicates that the document id was invalid਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as a controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ 䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		SET @documentid = NULL;਀ऀ 䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　 
		SET @docmslistid = NULL;਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀攀挀漀爀搀 䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF (@documentid IS NULL OR @docmslistid IS NULL)਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀挀漀爀搀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRecordID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一   
		-- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 					@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
	 ਀ऀऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		   IF NOT EXISTS (SELECT doc_ms_list_id ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀  
						   WHERE    doc_ms_list_id     ਀ऀऀऀऀऀऀ         㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
							 AND    doc_id        ਀ऀऀऀऀऀऀऀ     㴀 䀀搀漀挀甀洀攀渀琀椀搀 
							 AND    doc_ms_attr_id ਀ऀऀऀऀऀऀऀ     㴀 䀀搀漀挀洀猀愀琀琀爀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀऀ 䔀一䐀 
--=====================================਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
਀ 
          -- Check that the multi-select attribute and multi-select list id pair exists਀ऀऀ  䤀䘀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
								  FROM doc_attr.doc_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    搀漀挀开洀猀开愀琀琀爀开椀搀  
								       = @newdocmsattrid਀ऀऀऀऀऀऀऀऀ   䄀一䐀    搀漀挀开洀猀开氀椀猀琀开椀搀  
								       = @docmslistid) ਀ऀऀऀऀऀऀऀ  䈀䔀䜀䤀一 
									EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ  
										@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
										SET @message = CONCAT(@message, ' | List ID: ', CONVERT(nvarchar(10), @docmslistid), '  Object ID: ', CONVERT(nvarchar(10), @newdocmsattrid), ' | ', @tempmessage);਀ऀऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidListItem.');਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
									SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀ  䔀一䐀 
਀ऀऀऀ 䔀一䐀 
਀ 
		 -- Check for a duplicate record਀ऀऀ   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀  
							FROM doc_attr.doc_multi_select_links ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀    搀漀挀开洀猀开氀椀猀琀开椀搀      
						         = @docmslistid਀ऀऀऀऀऀऀऀ 䄀一䐀    搀漀挀开椀搀         
							     = @documentid਀ऀऀऀऀऀऀऀ 䄀一䐀    搀漀挀开洀猀开愀琀琀爀开椀搀  
							     = @newdocmsattrid਀ऀऀऀऀऀऀऀ 䄀一䐀       䀀搀漀挀洀猀愀琀琀爀椀搀  
								 <> @newdocmsattrid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 ਀ 
--=====================================਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ 
	--===================================================਀ 
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE doc_attr.doc_multi_select_links ਀ऀऀ    匀䔀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀搀漀挀洀猀愀琀琀爀椀搀 
		  WHERE    doc_ms_list_id     ਀ऀऀऀ    㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
		    AND    doc_id         ਀ऀऀऀ    㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		    AND    doc_ms_attr_id ਀ऀऀऀ    㴀 䀀搀漀挀洀猀愀琀琀爀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- END IF @transaction_ready = 'Ready'਀ 
   END -- End user authentication = Pass਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开爀愀搀椀漀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a document to radio button attribute link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_radiob_link]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @docradiobattrid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ     ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ                                                  ⴀⴀ 䐀攀昀愀甀氀琀猀 琀漀 䘀愀椀氀 甀渀琀椀氀 椀琀 椀猀 猀攀琀 琀漀 倀愀猀猀⸀ 
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀               㴀 ✀一漀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀    
		BEGIN਀ऀऀ   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
		   SET @iscontroller = 'Yes';਀ऀऀ䔀一䐀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		  -- Data validation਀ 
		 IF @documentid = ''਀ऀऀऀ匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		 IF @docradioblistid = 0਀ऀऀऀ匀䔀吀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
				   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
						@user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have permission to access it or edit it਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'NoDocIDAccess', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀  
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  䤀䘀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document radio button list id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE -- A record id link pair has been supplied਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 椀搀 氀椀渀欀 瀀愀椀爀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			   IF NOT EXISTS (SELECT doc_radiob_list_id ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀  
							   WHERE doc_radiob_list_id = @docradioblistid਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀऀ 䔀一䐀 
਀ऀऀऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 椀昀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀⸀ 
			IF @data_validation_status = 'Pass'਀ऀऀऀ   䄀一䐀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀攀猀琀爀椀挀琀攀搀 
			                 FROM doc_attr.doc_radio_button_list_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀 
							      AND restricted = 'True')਀ऀऀऀ   䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀一漀✀ 
			    BEGIN  -- The list id is restricted and the user does not have controller permission਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoLinkPermission', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䰀椀渀欀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
			    END਀ 
		  -- Check if a doc radio button attribute id was supplied.  ਀ऀऀ  ⴀⴀ 一唀䰀䰀 椀猀 瀀攀爀洀椀琀琀攀搀Ⰰ 瀀爀漀瘀椀搀渀最 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 椀猀 瘀愀氀椀搀⸀ 
਀ऀऀ  䤀䘀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　  
			 SET @docradiobattrid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  -- Check if the radio button attribute and radio button list id pair does not exist਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
								  FROM doc_attr.doc_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 
									   AND doc_radiob_list_id = @docradioblistid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀   
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE doc_attr.doc_radio_button_links ਀ऀऀ    匀䔀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 
		  WHERE doc_id = @documentid਀ऀऀऀ    䄀一䐀 搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀氀椀猀琀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_doc_real_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Updates a real value for a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 搀漀挀甀洀攀渀琀 爀攀愀氀 渀愀洀攀 椀搀 愀渀搀 愀渀 爀攀愀氀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_real_value]਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @realnumbervalue real		      = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 　 
			 SET @docrealnameid = NULL;਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
	  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check the doc real name field id਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document real name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- No validation is performed on the real because an invalid value਀ऀऀ  ⴀⴀ 眀椀氀氀 爀攀猀甀氀琀 椀渀 愀渀 攀爀爀漀爀 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 椀猀 攀砀攀挀甀琀攀搀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT doc_real_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 
			 				WHERE doc_real_name_id = @docrealnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀  
		    SET real_value = @realnumbervalue਀ऀऀ  圀䠀䔀刀䔀               搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		        AND doc_real_name_id = @docrealnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开琀愀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a document tag.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_tag] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @tagname nvarchar(50)            = NULL, ਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 眀椀氀氀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
		 BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ 
	 ELSE  -- Check if the user has rights to edit the tag਀ऀऀ  䈀䔀䜀䤀一 
			EXEC [internal].[usp_AUTHENTICATE_tag_edit]਀ऀऀऀऀ 䀀琀愀最开椀搀开攀瀀 㴀 䀀琀愀最开椀搀Ⰰ 
				 @user_authentication_result_tag = @temp_userauth_status OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 					   SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagPermission');		   ਀ऀऀऀऀ 䔀一䐀 
		  END਀ 
     -- Check for duplicate record...਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @tagname = ''਀ऀऀ   匀䔀吀 䀀琀愀最渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开渀愀洀攀  
		 			 FROM tagging.doc_tags ਀ऀऀऀऀऀ圀䠀䔀刀䔀 琀愀最开渀愀洀攀 㴀 䀀琀愀最渀愀洀攀 
					  AND tag_id <> @tag_id) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ISNULL(LEFT(@tagname, 10), ''), '... | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @tagname,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @validationmessage);਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ   
	  BEGIN TRY਀ऀ   
	     UPDATE tagging.doc_tags ਀ऀऀ    匀䔀吀           洀渀攀洀  
			    = ISNULL(@mnemonic, ''),਀ऀऀऀ       琀愀最开渀愀洀攀  
				= @tagname,਀ऀऀऀऀ          搀攀猀挀爀 
				= ISNULL(@description, '') ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开椀搀 
		        = @tag_id਀ 
         ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10), ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_doc_text_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Updates a text value for a document.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 搀漀挀甀洀攀渀琀 琀攀砀琀 渀愀洀攀 椀搀 愀渀搀 愀 琀攀砀琀 猀琀爀椀渀最⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开琀攀砀琀开瘀愀氀甀攀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
	 @doctextnameid bigint            = NULL,਀ऀ 䀀琀攀砀琀瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @doctextnameid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @textvalue = '' ਀ऀऀऀ 匀䔀吀 䀀琀攀砀琀瘀愀氀甀攀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check the doc text name field id਀ऀऀ  䤀䘀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document text name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTextNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀攀砀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_free_text_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TextIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- No validation is performed on the text string because an invalid value਀ऀऀ  ⴀⴀ 眀椀氀氀 爀攀猀甀氀琀 椀渀 愀渀 攀爀爀漀爀 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 椀猀 攀砀攀挀甀琀攀搀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT doc_free_text_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 
			 				WHERE doc_free_text_name_id = @doctextnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀  
		    SET text_value = @textvalue਀ऀऀ  圀䠀䔀刀䔀                    搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		        AND doc_free_text_name_id = @doctextnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Update a record in table doc_to_com_obj_ms_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 搀漀挀甀洀攀渀琀 瘀椀愀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
-- Output is a status message and a transaction status.  ਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_doc_to_com_obj_ms_link]਀ 
     @documentid  nvarchar(50)        = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ 
		  -- Check the document id਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0 ਀           匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.doc_to_com_obj_ms_list_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀  搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					           AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ           䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ✀   䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check the new parameters਀ 
    -- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.doc_to_com_obj_ms_list_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀  搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					       AND     common_object_list_id ਀ऀऀऀऀऀऀऀ    㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					       AND       common_object_id      ਀ऀऀऀऀऀऀ       㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
						   AND       @commonobjectid਀ऀऀऀऀऀऀ       㰀㸀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'RecordExists', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ✀ ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀琀攀洀 攀砀椀猀琀猀 
	  IF NOT EXISTS (SELECT common_object_list_id਀ऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
					  WHERE    common_object_list_id ਀ऀऀऀऀऀ        㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					    AND       common_object_id     ਀ऀऀऀऀऀऀऀ㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀  䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
਀ 
--=====================਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀  
		    SET       common_object_id      ਀ऀऀऀ    㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
		  WHERE  doc_id  = @documentid਀ऀऀ    䄀一䐀    挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			    = @commonobjlistid਀ऀऀऀ䄀一䐀    挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀       
			    = @commonobjectid; ਀ 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_doc_to_com_obj_rb_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	਀ⴀⴀ 唀瀀搀愀琀攀 愀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 搀漀挀开琀漀开挀漀洀开漀戀樀开爀戀开氀椀猀琀开氀椀渀欀猀 
-- which links a common object to a document via a radio button list਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀   
-- Both controler and editor are authenticated.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开琀漀开挀漀洀开漀戀樀开爀戀开氀椀渀欀崀 
਀     䀀搀漀挀甀洀攀渀琀椀搀  渀瘀愀爀挀栀愀爀⠀㔀　⤀        㴀 一唀䰀䰀Ⰰ 
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @newcommonobjectid bigint        = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF NOT EXISTS (SELECT common_object_list_id਀ऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 
					     WHERE  doc_id = @documentid਀ऀऀऀऀऀ           䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					           AND common_object_id      = @commonobjectid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', @documentid, '   List ID: ', CONVERT(nvarchar(10), @commonobjlistid), '  Object ID: ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
-- =======================਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
਀ 
    -- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.doc_to_com_obj_radiob_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀  搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
					       AND     common_object_list_id ਀ऀऀऀऀऀऀऀ    㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					       AND       common_object_id      ਀ऀऀऀऀऀऀ       㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
						   AND       @commonobjectid਀ऀऀऀऀऀऀ       㰀㸀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'RecordExists', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ✀ ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀琀攀洀 攀砀椀猀琀猀 
	  IF NOT EXISTS (SELECT common_object_list_id਀ऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
					  WHERE       common_object_list_id ਀ऀऀऀऀऀ        㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					    AND       common_object_id     ਀ऀऀऀऀऀऀऀ㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ✀   䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
--=====================਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀  
		    SET common_object_id      = @newcommonobjectid਀ऀऀ  圀䠀䔀刀䔀  搀漀挀开椀搀  㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		    AND common_object_list_id = @commonobjlistid਀ऀऀऀ䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀㬀  
਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 昀漀爀 愀 搀漀挀甀洀攀渀琀 䤀䐀⸀ 
-- usp_UPD_document_id will leave the transaction group unchanged਀ⴀⴀ 椀昀 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 椀猀 渀漀琀 猀甀瀀瀀氀椀攀搀⸀ 
-- Input is a document ID and transaction group ID.  ਀ⴀⴀ 吀栀椀猀 甀瀀搀愀琀攀 椀猀 瀀攀爀洀椀琀琀攀搀 攀瘀攀渀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 氀漀挀欀攀搀⸀  
-- Output is message and status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀  
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @transactiongroup bigint         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected users for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if a doc id has not been supplied.  Fail if it has not been supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoDocID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 				@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 漀爀 攀搀椀琀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀䄀挀挀攀猀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT(@message , ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocIDAccess.'); ਀ऀऀऀऀऀ䔀一䐀 
		END਀ 
			 -- Check that the transaction group exists਀ऀऀऀ 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 　  
				SET @transactiongroup = NULL;  -- Null transaction group allowed਀ऀऀऀ 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一伀吀 一唀䰀䰀 
				 BEGIN਀ऀऀऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
									FROM base.transaction_groups ਀ऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀  
					   BEGIN਀ ऀऀऀऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							   @message_id = 'TGNotExist', ਀ऀऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ              匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						  ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						  SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   END਀ऀऀऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
 ਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 昀愀椀氀攀搀 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ 
	-- End of validation checks਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE base.document_id_list ਀ऀऀ           匀䔀吀 搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 
			     WHERE doc_id = @documentid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀  ⴀⴀ 䔀渀搀 椀昀 琀爀愀渀猀愀挀琀椀漀渀 爀攀愀搀礀 㴀 刀攀愀搀礀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开砀爀攀昀开琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Updates the notes for a cross-reference link between two documents਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 猀漀甀爀挀攀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 愀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀搀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 椀渀瀀甀琀 渀漀琀攀猀⸀ 
-- Output is a status message and a transaction status.  ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀开砀爀攀昀开琀攀砀琀崀 
਀     䀀猀漀甀爀挀攀开搀漀挀椀搀  渀瘀愀爀挀栀愀爀⠀㔀　⤀      㴀 一唀䰀䰀Ⰰ 
	 @xref_docid nvarchar(50)         = NULL,਀ऀ 䀀椀渀瀀甀琀开渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀ऀऀ  㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀  ⴀⴀ 匀琀愀琀甀猀 椀猀 瀀愀猀猀 甀渀氀攀猀猀 椀琀 椀猀 猀攀琀 琀漀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check the source document id਀ऀऀ  䤀䘀 䀀猀漀甀爀挀攀开搀漀挀椀搀 㴀 ✀✀ 
		     SET @source_docid = NULL;਀ऀऀ  䤀䘀 䀀猀漀甀爀挀攀开搀漀挀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀猀漀甀爀挀攀开搀漀挀椀搀Ⰰ 
							 @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀猀漀甀爀挀攀开搀漀挀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @xref_docid = ''਀ऀऀ     匀䔀吀 䀀砀爀攀昀开搀漀挀椀搀 㴀 一唀䰀䰀㬀 
		  IF @xref_docid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @xref_docid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@xref_docid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
 ਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 砀爀攀昀开琀礀瀀攀开椀搀 
		               FROM xref.doc_cross_references਀ऀऀऀऀऀ  圀䠀䔀刀䔀 猀漀甀爀挀攀开搀漀挀开椀搀 㴀 䀀猀漀甀爀挀攀开搀漀挀椀搀 
					        AND xref_doc_id = @xref_docid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀   
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ऀ    䔀一䐀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE  ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	   UPDATE xref.doc_cross_references ਀ऀ      匀䔀吀 渀漀琀攀猀 㴀 䀀椀渀瀀甀琀开渀漀琀攀猀 
		WHERE source_doc_id = @source_docid਀ऀऀ      䄀一䐀 砀爀攀昀开搀漀挀开椀搀 㴀 䀀砀爀攀昀开搀漀挀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀   
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_document_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㈀ⴀ㈀　㈀㐀 
-- Description:	Updates a document ID.  Only applies to document IDs for which the controller has view permission for.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀Ⰰ 渀攀眀 搀漀挀甀洀攀渀琀 䤀䐀 愀渀搀 漀瀀琀椀漀渀愀氀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀⸀ 
-- Output is message and status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀椀搀开琀漀开甀瀀搀愀琀攀㨀  䴀甀猀琀 戀攀 愀 渀漀渀 一唀䰀䰀 瘀愀氀椀搀 搀漀挀甀洀攀渀琀 椀搀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 愀渀搀 洀攀琀愀搀愀琀愀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 愀挀挀攀猀猀 琀漀⸀ 
* - @new_doc_id: Must be a non NULL valid document id which is not a duplicate of an existing ID. ਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀㨀 伀瀀琀椀漀渀愀氀⸀  䤀昀 猀甀瀀瀀氀椀攀搀 洀甀猀琀 戀攀 愀 瘀愀氀椀搀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 䤀䐀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 攀爀爀漀爀猀⸀  圀椀氀氀 漀渀氀礀 爀攀琀甀爀渀 搀愀琀愀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 愀渀搀 洀攀琀愀搀愀琀愀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 愀挀挀攀猀猀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀⸀  
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀氀琀攀爀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 爀漀氀攀 瀀攀爀洀椀猀猀椀漀渀 
* - The user must have view permission for the document ID਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开搀漀挀甀洀攀渀琀开椀搀崀  
਀ऀ 䀀椀搀开琀漀开甀瀀搀愀琀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀Ⰰ 
	 @new_doc_id nvarchar(50)         = NULL,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
	-- Authenticate the connected user for the document ID਀ 
਀ 
-- End user authentication਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ  䤀䘀 䀀椀搀开琀漀开甀瀀搀愀琀攀 㴀 ✀✀ 
		 SET @id_to_update = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @id_to_update IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.'); ਀ऀऀ 䔀一䐀 
਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if the document ID exists and the user has permission to view the document਀ऀऀ        ⴀⴀ 䄀 挀漀渀琀爀漀氀氀攀爀 挀愀渀 攀搀椀琀 琀栀攀 䤀䐀 漀昀 愀渀礀 搀漀挀甀洀攀渀琀 琀栀攀礀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀⸀ 
		   EXEC [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀椀搀开琀漀开甀瀀搀愀琀攀Ⰰ 
	             @user_authentication_result_dep = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it or edit it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀 Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀椀搀开琀漀开甀瀀搀愀琀攀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀  
				 END਀ऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 搀漀挀 椀搀 搀漀攀猀 攀砀椀猀琀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀⸀   
					-- Check if it is locked.਀ऀऀऀऀऀ䤀䘀 ⠀⠀匀䔀䰀䔀䌀吀 氀漀挀欀开猀琀愀琀甀猀 
							FROM base.document_id_list਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀椀搀开琀漀开甀瀀搀愀琀攀⤀ 
								= 'Locked')਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 
							SET @transaction_ready = 'Fail';਀ऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
							EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀䰀漀挀欀攀搀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@id_to_update, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDLocked.');਀ऀऀऀऀऀऀ䔀一䐀 
         END -- End ELSE -- A doc id has been supplied਀      䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			BEGIN -- Check that the new document id is unique, unless it is the same as the existing਀ऀऀऀऀ䤀䘀 ⠀䀀渀攀眀开搀漀挀开椀搀 㰀㸀 䀀椀搀开琀漀开甀瀀搀愀琀攀⤀  
					AND EXISTS (SELECT doc_id ਀   ऀऀऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
								WHERE doc_id = @new_doc_id) ਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 椀猀 渀漀琀 甀渀椀焀甀攀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀漀挀一漀琀唀渀椀焀甀攀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  							SET @message = CONCAT(@message, ' | ', LEFT(@new_doc_id, 6), '...', ' | ', @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocNotUnique.');਀ऀऀऀऀऀ䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 甀渀椀焀甀攀渀攀猀猀 漀昀 琀栀攀 渀攀眀 搀漀挀甀洀攀渀琀 椀搀 
            END਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 洀椀最栀琀 栀愀瘀攀 戀攀攀渀 愀甀琀漀洀愀琀椀挀愀氀氀礀 琀爀甀渀挀愀琀攀搀 
      IF (@data_validation_status = 'Pass') AND (LEN(@new_doc_id) >= 50)਀ऀऀऀ䈀䔀䜀䤀一 
				-- Don't fail the transaction.  The string is just truncated. ਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'TooLong50', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䰀䔀䘀吀⠀䀀渀攀眀开搀漀挀开椀搀Ⰰ 㠀⤀Ⰰ ✀⸀⸀⸀✀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀漀漀䰀漀渀最㔀　⸀✀⤀㬀 
			END -- End checking the length of the document id਀ 
		-- Check that the transaction group exists਀ऀ  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 　  
		SET @transactiongroup = NULL; -- NULL transaction group is allowed਀ऀ  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一伀吀 一唀䰀䰀 
		BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
							FROM base.transaction_groups ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀  
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'TGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ऀऀ䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'  -- Data validation failed਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀  䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
    -- The transaction group id is optional.਀    ⴀⴀ 䤀昀 琀栀攀爀攀 眀愀猀 渀漀 琀最 椀搀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 猀攀琀 椀琀 琀漀 琀栀攀 猀愀洀攀 愀猀 瀀爀攀瘀椀漀甀猀⸀ 
      IF @transactiongroup IS NULL਀         匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
	                                FROM base.document_id_list਀ऀऀऀऀऀऀऀ       圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀椀搀开琀漀开甀瀀搀愀琀攀⤀㬀 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀  
		           SET document_id_list.doc_id               = @new_doc_id,਀ऀऀऀ           搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 
			     WHERE doc_id = @id_to_update;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀  ⴀⴀ 䔀渀搀 椀昀 琀爀愀渀猀愀挀琀椀漀渀 爀攀愀搀礀 㴀 刀攀愀搀礀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_file_date_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Updates a date value for a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 昀椀氀攀 搀愀琀攀 渀愀洀攀 椀搀 愀渀搀 愀 搀愀琀攀 瘀愀氀甀攀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_date_value]਀ 
     @fileid bigint                   = '', ਀ऀ 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @datevalue datetime2(7)          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀搀愀琀攀猀琀礀氀攀 椀渀琀                          㴀 ✀✀Ⰰ ⴀⴀ 䐀愀琀攀 猀琀礀氀攀 昀爀漀洀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		-- Data validation਀ 
		  IF @fileid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @datevalue = '' ਀ऀऀऀ 匀䔀吀 䀀搀愀琀攀瘀愀氀甀攀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
	  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		  -- Check the file date name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM file_attr.file_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
 		  -- Check that the record exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
							 FROM file_attr.file_date_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 
							            AND file_id = @fileid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE file_attr.file_date_values ਀ऀऀ    匀䔀吀 搀愀琀攀开瘀愀氀甀攀 㴀 䀀搀愀琀攀瘀愀氀甀攀 
		  WHERE               file_id = @fileid਀ऀऀ        䄀一䐀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_file_doc_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 昀椀氀攀 琀漀 搀漀挀甀洀攀渀琀 氀椀渀欀⸀ 
-- Both the new document ID and file ID must be sent. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开搀漀挀开氀椀渀欀崀  
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ  
     @newdocumentid nvarchar(50)      = '', ਀ऀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @newfileid bigint                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
		  -- Data validation਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @documentid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF @documentid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 						@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 䘀椀氀攀 搀愀琀愀 
			   EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
					@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀ   䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					 BEGIN -- file id does not exist or the user does not have permission to edit it਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
					 END			 ਀ऀऀऀ 䔀一䐀 
  ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
		  IF (@data_validation_status = 'Pass' ਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀  
								FROM xref.file_to_document_links਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀  
									 AND file_id = @fileid))਀ऀऀऀ䈀䔀䜀䤀一 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ 
			END -- End check that the record exists਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check the new parameters਀ 
  -- Check the new document id਀ऀऀ  䤀䘀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
			 SET @newdocumentid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF @newdocumentid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 						@doc_id_to_check_ep =  @newdocumentid,਀ऀऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ' + LEFT(@newdocumentid, 20) + '... ' + @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 渀攀眀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@newfileid IS NULL OR @newfileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀渀攀眀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN  -- Check if it exists and the user has permission to edit the File data਀ऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 					@file_id_to_check_ep =  @newfileid,਀ऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			   IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 昀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 椀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileIDAccess.');਀ऀऀऀऀऀ 䔀一䐀ऀऀऀ  
			 END਀ 
-- Check for a duplicate record਀ऀऀ  䤀䘀 ⠀䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
			  AND EXISTS (SELECT doc_id ਀ऀऀऀऀऀ        䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
						   WHERE    doc_id ਀ऀऀऀऀऀऀ         㴀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀  
							 AND       file_id ਀ऀऀऀऀऀऀऀ     㴀 䀀渀攀眀昀椀氀攀椀搀 
							 AND @fileid਀ऀऀऀऀऀऀऀ     㰀㸀 䀀渀攀眀昀椀氀攀椀搀 
							 AND       @documentid਀ऀऀऀऀऀऀऀ     㰀㸀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀⤀⤀ 
			BEGIN਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
਀ऀऀऀ䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀 昀漀爀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 
਀ 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    唀倀䐀䄀吀䔀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
		   SET       file_id ਀ऀऀ       㴀 䀀渀攀眀昀椀氀攀椀搀Ⰰ 
			         doc_id਀ऀऀऀ   㴀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 
		 WHERE    doc_id ਀ऀऀ       㴀 䀀搀漀挀甀洀攀渀琀椀搀  
		   AND    file_id ਀ऀऀ       㴀 䀀昀椀氀攀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_file_group_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 挀漀氀甀洀渀 漀昀 愀 爀攀挀漀爀搀 椀渀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 昀椀氀攀 琀漀 昀椀氀攀 最爀漀甀瀀 氀椀渀欀猀⸀ 
-- Authenticates both controller and editor਀ 
-- Input is a file ID, a file group ID and notes.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 唀瀀搀愀琀攀猀 琀栀攀 渀漀琀攀猀 挀漀氀甀洀渀 漀昀 愀 爀攀挀漀爀搀 椀渀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
* - @filegroupid bigint  Must be a non-null and non-empty valid identifier.਀⨀ ⴀ 䀀椀渀瀀甀琀渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀ 伀瀀琀椀漀渀愀氀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 唀猀攀爀 刀漀氀攀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 ✀一漀 倀攀爀洀椀猀猀椀漀渀✀ 洀攀猀猀愀最攀⸀ 
* - Data Validation Fail: Returns messages for missing or invalid file group ID or file ID or permission failures.਀⨀ 
* **Side Effects:**਀⨀ 
* - Updates a record in xref.file_group_links਀⨀ 
* **Preconditions:**਀⨀ 
* - The user executing the procedure must have the 'Editor' role.਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 愀渀搀 䀀昀椀氀攀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 愀渀搀 洀愀琀挀栀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 
* - The connected user must have viewing permission for the file਀⨀ ⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀 眀栀椀挀栀 琀栀攀 昀椀氀攀 椀猀 琀漀 戀攀 氀椀渀欀攀搀 琀漀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_group_link] ਀ 
     @fileid bigint                   = NULL,਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ               ⴀⴀ 䘀椀氀攀 最爀漀甀瀀  
	 @inputnotes nvarchar(max)        = '',    -- Notes for the entry਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempuserauth_status nchar(10)       = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀ    䀀昀椀氀攀最爀漀甀瀀愀甀琀栀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀⸀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check the file id਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		 SET @fileid = NULL;਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID');਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 爀攀猀瀀漀渀搀椀渀最 琀漀 渀漀 昀椀氀攀 椀搀 猀甀瀀瀀氀椀攀搀 
	  ELSE -- A file id was supplied.  ਀ऀऀ 䈀䔀䜀䤀一ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀搀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀Ⰰ 一伀吀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 
			EXEC [internal].[usp_AUTHENTICATE_user_file_id] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀    㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ  ✀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀ            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀⸀  䐀漀渀✀琀 搀漀 琀栀攀 渀攀砀琀 挀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
					 BEGIN -- Check if the file is free from edit restrictions which exclude the current user਀ऀऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开昀爀攀攀崀  
 							@fileid_tocheck =  @fileid,਀ऀऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀昀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
							IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 昀椀氀攀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 爀攀猀琀爀椀挀琀椀漀渀猀 眀栀椀挀栀 搀漀 渀漀琀 椀渀挀氀甀搀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
									SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
									EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䔀搀倀攀爀洀一漀琀䘀爀攀攀✀Ⰰ  
										@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
										SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid),  '.  ',  @tempmessage);਀ऀऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileEdPermNotFree');਀ऀऀऀऀऀऀऀऀ䔀一䐀 
					 END -- End checking if the file is free from edit restrictions which exclude the current user਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 昀椀氀攀 椀搀 椀猀 瘀愀氀椀搀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
		 -- End checking the file id਀ 
         -- Check the file group id਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　 
		    SET @filegroupid = NULL;਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀搀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 琀栀愀琀 昀椀氀攀 最爀漀甀瀀 椀搀 攀砀椀猀琀猀 
		   BEGIN -- Check the file group id਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				             FROM xref.file_group_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'FileGroupIdNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
਀ऀऀऀऀ䔀一䐀 
		     ELSE  -- The file group ID does exist.  Check that the user has edit permission for the file group਀ऀऀऀ   䈀䔀䜀䤀一 
					EXEC [internal].[usp_AUTHENTICATE_fl_grp_ed_pm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀最爀漀甀瀀椀搀开琀漀挀栀攀挀欀 㴀  䀀昀椀氀攀最爀漀甀瀀椀搀Ⰰ 
						@user_authentication_reslt_fgep = @filegroupauthstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀最爀漀甀瀀愀甀琀栀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- The user does not have edit permission for the file group਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀    㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready         = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'NoFileGrpEdPerm', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀最爀漀甀瀀椀搀⤀Ⰰ  ✀⸀  ✀Ⰰ  䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀瀀䔀搀倀攀爀洀✀⤀㬀 
							END਀ऀऀऀ   䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 最爀漀甀瀀⸀ 
           END -- End checking the file group id.਀ 
਀      ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 攀砀椀猀琀猀 
	  IF @data_validation_status = 'Pass' -- Only do this check if both the file id and the file group id are valid਀ऀ    䈀䔀䜀䤀一 
			 IF NOT EXISTS (SELECT file_group_id਀ऀऀऀऀ   ऀ      䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀  
						 WHERE           file_id = @fileid਀ऀऀऀऀऀऀ       䄀一䐀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
			   BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NotExist', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
			   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 䤀䘀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀琀愀琀甀猀 㴀 倀愀猀猀⸀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 
            SET notes = ISNULL(@inputnotes, '')਀ऀऀ  圀䠀䔀刀䔀           昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		        AND file_group_id = @filegroupid; ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_file_int_value]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description: Updates an integer value for a file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 椀搀 愀渀搀 愀渀 椀渀琀攀最攀爀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_int_value]਀ 
     @fileid bigint                   = NULL, ਀ऀ 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @integervalue bigint		      = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
			 SET @fileintnameid = NULL;਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
	  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀渀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @fileintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀渀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file int name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_int_name_id = @fileintnameid) -- Check if the file int name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 一漀 瘀愀氀椀搀愀琀椀漀渀 椀猀 瀀攀爀昀漀爀洀攀搀 漀渀 琀栀攀 椀渀琀攀最攀爀 戀攀挀愀甀猀攀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 
		  -- will result in an error before the procedure is executed. ਀ 
 		  -- Check that the record exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
							 FROM file_attr.file_integer_values਀ऀऀऀ ऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 
							            AND file_id = @fileid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀ䔀一䐀 
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentiation = Pass਀ऀ 
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE file_attr.file_integer_values ਀ऀऀ    匀䔀吀 椀渀琀开瘀愀氀甀攀 㴀 䀀椀渀琀攀最攀爀瘀愀氀甀攀 
		  WHERE              file_id = @fileid਀ऀऀ        䄀一䐀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_file_multi_select_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Updates a file_multi_select_links record਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀崀  
     @fileid bigint                   = NULL,਀     䀀昀椀氀攀洀猀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @filemsattrid bigint             = NULL,਀ऀ 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀   
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user as a controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass'   SET @userauthentication_status = 'Pass';਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	 IF @fileid = 0਀ऀऀ匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	 IF @filemslistid = 0਀ऀऀ匀䔀吀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
	 -- Check if a record ID has not been supplied਀ऀ 䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀⤀ 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoRecordID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀挀漀爀搀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  ਀ऀ        ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END		 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			  IF (@data_validation_status = 'Pass' ਀ऀऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀  
								    FROM file_attr.file_multi_select_links ਀ऀऀऀऀऀऀऀ       圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀     㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
									     AND file_id         = @fileid਀ऀऀऀऀऀऀऀऀऀ     䄀一䐀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀⤀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ 䔀一䐀 
--=====================================਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
਀ 
          -- Check that the multi-select attribute and multi-select list id pair exists਀ऀऀ  䤀䘀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 
								  FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    昀椀氀攀开洀猀开愀琀琀爀开椀搀  
								       = @newfilemsattrid਀ऀऀऀऀऀऀऀऀ   䄀一䐀    昀椀氀攀开洀猀开氀椀猀琀开椀搀  
								       = @filemslistid) ਀ऀऀऀऀऀऀऀ  䈀䔀䜀䤀一 
									EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ  
										@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
										SET @message = CONCAT(@message, ' | ', '  List ID: ', CONVERT(nvarchar(10), @filemslistid), '  Object ID: ', CONVERT(nvarchar(10), @newfilemsattrid),  ' | ', @tempmessage);਀ऀऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
										SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidListItem.');਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
									SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀ  䔀一䐀 
਀ऀऀऀ 䔀一䐀 
਀ 
		 -- Check for a duplicate record਀ऀऀ   䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀  
							FROM file_attr.file_multi_select_links ਀ऀऀऀऀऀऀ   圀䠀䔀刀䔀    昀椀氀攀开洀猀开氀椀猀琀开椀搀      
						         = @filemslistid਀ऀऀऀऀऀऀऀ 䄀一䐀    昀椀氀攀开椀搀         
							     = @fileid਀ऀऀऀऀऀऀऀ 䄀一䐀    昀椀氀攀开洀猀开愀琀琀爀开椀搀  
							     = @newfilemsattrid਀ऀऀऀऀऀऀ     䄀一䐀       䀀昀椀氀攀洀猀愀琀琀爀椀搀 
							     <> @newfilemsattrid)਀ऀऀऀ   䈀䔀䜀䤀一 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀一䐀 
		 ਀ 
--=====================================਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ 
	--===================================================਀ 
  -- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE file_attr.file_multi_select_links ਀ऀऀ    匀䔀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀渀攀眀昀椀氀攀洀猀愀琀琀爀椀搀 
		  WHERE    file_ms_list_id     ਀ऀऀऀ    㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 
		    AND    file_id         ਀ऀऀऀ    㴀 䀀昀椀氀攀椀搀 
		    AND    file_ms_attr_id ਀ऀऀऀ    㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- END IF @transaction_ready = 'Ready'਀ 
   END -- End user authentication = Pass਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a file to radio button attribute link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀Ⰰ 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀⸀ 
-- Output is a message and transaction status਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀愀搀椀漀戀开氀椀渀欀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                     㴀 一唀䰀䰀Ⰰ  
	 @file_radioblistid bigint          = NULL,਀ऀ 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)            = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀   㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@tempuserauth_status nchar(10)          = '',     -- Temporary value for authentication sp.਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		                                                  -- Defaults to Fail until it is set to Pass.਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@iscontroller nvarchar(3)               = 'No',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀    
		BEGIN਀ऀऀ   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
		   SET @iscontroller = 'Yes';਀ऀऀ䔀一䐀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ 䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			SET @fileid = NULL;਀ऀऀ 䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 　 
			SET @file_radioblistid = NULL;਀ 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		  IF @file_radioblistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 氀椀渀欀 瀀愀椀爀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN  -- Check if the id link pair does not exist਀ऀऀऀ   䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
								FROM file_attr.file_radio_button_links ਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 
									         AND file_id = @fileid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
			 END਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀   
		  -- NULL is permitted, providng that the radio button list id is valid.਀ 
			-- Check if the list id is restricted and if the user does not have controller permission.਀ऀऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			   AND EXISTS (SELECT restricted਀ऀऀऀ                 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 
							WHERE file_radiob_list_id = @file_radioblistid਀ऀऀऀऀऀऀऀ      䄀一䐀 爀攀猀琀爀椀挀琀攀搀 㴀 ✀吀爀甀攀✀⤀ 
			   AND @iscontroller = 'No'਀ऀऀऀ    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 氀椀猀琀 椀搀 椀猀 爀攀猀琀爀椀挀琀攀搀 愀渀搀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䰀椀渀欀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
					   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoLinkPermission.');਀ऀऀऀ    䔀一䐀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 ✀✀  
			 SET @file_radiobattrid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  -- Check if the radio button attribute and radio button list id pair does not exist਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
								  FROM file_attr.file_radio_button_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 
									   AND file_radiob_list_id = @file_radioblistid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End IF user authentication = Pass਀   
  -- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE file_attr.file_radio_button_links ਀ऀऀ    匀䔀吀 昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 
		  WHERE                 file_id = @fileid਀ऀऀऀ    䄀一䐀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	             SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ          䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀攀愀氀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 爀攀愀氀 瘀愀氀甀攀 昀漀爀 愀 昀椀氀攀⸀ 
-- Input is a file id, file real name id and an real.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开爀攀愀氀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @filerealnameid bigint           = NULL,਀ऀ 䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀ऀऀ      㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 　 
			 SET @filerealnameid = NULL;਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		  -- Check the file real name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file real name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM file_attr.file_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- No validation is performed on the real because an invalid value਀ऀऀ  ⴀⴀ 眀椀氀氀 爀攀猀甀氀琀 椀渀 愀渀 攀爀爀漀爀 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 椀猀 攀砀攀挀甀琀攀搀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT file_real_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 
			 				WHERE file_real_name_id = @filerealnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀  
		    SET real_value = @realnumbervalue਀ऀऀ  圀䠀䔀刀䔀               昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		        AND file_real_name_id = @filerealnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开琀攀砀琀开瘀愀氀甀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 唀瀀搀愀琀攀猀 愀 琀攀砀琀 瘀愀氀甀攀 昀漀爀 愀 昀椀氀攀⸀ 
-- Input is a file id, file text name id and a text string.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- Both controler and editor are authenticated.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开琀攀砀琀开瘀愀氀甀攀崀 
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 ✀✀Ⰰ  
	 @filetextnameid bigint           = NULL,਀ऀ 䀀琀攀砀琀瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀऀⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
			 SET @fileid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 㴀 　 
			 SET @filetextnameid = NULL;਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
		  -- Check the file text name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file text name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTextNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀攀砀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_free_text_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TextIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- No validation is performed on the text string because an invalid value਀ऀऀ  ⴀⴀ 眀椀氀氀 爀攀猀甀氀琀 椀渀 愀渀 攀爀爀漀爀 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 椀猀 攀砀攀挀甀琀攀搀⸀  
਀ ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT file_free_text_name_id਀ऀऀऀऀऀऀऀ 䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 
			 				WHERE file_free_text_name_id = @filetextnameid਀ऀऀऀऀऀऀऀ            䄀一䐀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 甀猀攀爀 愀甀琀栀攀渀琀椀愀琀椀漀渀 㴀 倀愀猀猀 
	਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀  
		    SET text_value = @textvalue਀ऀऀ  圀䠀䔀刀䔀                    昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		        AND file_free_text_name_id = @filetextnameid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	          ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开琀漀开挀洀开漀戀樀开洀猀开氀椀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 15-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Update a record in table file_to_com_obj_ms_list_links਀ⴀⴀ 眀栀椀挀栀 氀椀渀欀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 琀漀 愀 昀椀氀攀 瘀椀愀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
-- Input and output parameters are declared below.  ਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_to_cm_obj_ms_link]਀ 
     @fileid bigint                   = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ 
  -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.file_to_com_obj_ms_list_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀  昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					           AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ           䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀昀椀氀攀椀搀Ⰰ ✀   䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Check the new parameters਀ 
਀    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	IF @data_validation_status = 'Pass'਀ऀ    䈀䔀䜀䤀一 
		  IF EXISTS (SELECT common_object_list_id਀ऀऀ                  䘀刀伀䴀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 
					     WHERE file_id = @fileid਀ऀऀऀऀऀ       䄀一䐀    挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
							   = @commonobjlistid਀ऀऀऀऀऀ       䄀一䐀       挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀       
						       = @newcommonobjectid਀ऀऀऀऀऀऀ   䄀一䐀       䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
						       <> @newcommonobjectid)਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', @fileid, ' ', CONVERT(nvarchar(10), @commonobjlistid), ' ', CONVERT(nvarchar(10), @newcommonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		END਀ 
	  -- Check that the list item exists਀ऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
	                   FROM com_obj.common_object_lists AS col਀ऀऀऀऀऀ  圀䠀䔀刀䔀    挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
					        = @commonobjlistid਀ऀऀऀऀऀ    䄀一䐀       挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      
							= @newcommonobjectid)਀ऀऀ  䈀䔀䜀䤀一 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					  SET @message = CONCAT(@message, ' |  List ID: ', CONVERT(nvarchar(10), @commonobjlistid), '  Object ID: ', CONVERT(nvarchar(10), @newcommonobjectid), ' | ', @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InvalidListItem.');਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ 
		  END਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE com_obj.file_to_com_obj_ms_list_links ਀ऀऀ    匀䔀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
		  WHERE  file_id  = @fileid਀ऀऀ    䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
			AND common_object_id      = @commonobjectid; ਀ 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_file_to_com_obj_rb_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	਀ⴀⴀ 唀瀀搀愀琀攀 愀 爀攀挀漀爀搀 椀渀 琀愀戀氀攀 昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀戀开氀椀猀琀开氀椀渀欀猀 
-- which links a common object to a file via a radio-button list਀ⴀⴀ 䈀漀琀栀 挀漀渀琀爀漀氀攀爀 愀渀搀 攀搀椀琀漀爀 愀爀攀 愀甀琀栀攀渀琀椀挀愀琀攀搀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_to_com_obj_rb_lnk]਀ 
     @fileid bigint                   = NULL,਀     䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	 @commonobjectid bigint           = NULL,਀ऀ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀          㴀 ✀✀Ⰰ  ⴀⴀ 吀攀洀瀀漀爀愀爀礀 瘀愀氀甀攀 昀漀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 猀瀀⸀ 
		@fileauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
		@role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
		  IF @fileid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @fileid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
    -- Check if the record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                   FROM com_obj.file_to_com_obj_radiob_links ਀ऀऀऀऀऀ      圀䠀䔀刀䔀  昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					        AND common_object_list_id = @commonobjlistid਀ऀऀऀऀऀ        䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'NotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀昀椀氀攀椀搀Ⰰ ✀   䰀椀猀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  伀戀樀攀挀琀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
-- =======================਀ⴀⴀ 䌀栀攀挀欀 琀栀攀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
਀ 
    -- Check if a duplicate record exists਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	    BEGIN਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		                  FROM com_obj.file_to_com_obj_radiob_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
					       AND    common_object_list_id ਀ऀऀऀऀऀऀऀ   㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					       AND       common_object_id      ਀ऀऀऀऀऀऀ       㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
						   AND       @commonobjectid਀ऀऀऀऀऀऀ       㰀㸀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'RecordExists', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀昀椀氀攀椀搀Ⰰ ✀ ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 氀椀猀琀 椀琀攀洀 攀砀椀猀琀猀 
	  IF NOT EXISTS (SELECT common_object_list_id਀ऀ                   䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
					  WHERE    common_object_list_id ਀ऀऀऀऀऀ        㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
					    AND       common_object_id     ਀ऀऀऀऀऀऀऀ㴀 䀀渀攀眀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ 
		  BEGIN਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'InvalidListItem', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀  ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䰀椀猀琀䤀琀攀洀⸀✀⤀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ  䔀一䐀 
--=====================਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀  
		    SET common_object_id      = @newcommonobjectid਀ऀऀ  圀䠀䔀刀䔀  昀椀氀攀开椀搀  㴀 䀀昀椀氀攀椀搀 
		    AND common_object_list_id = @commonobjlistid਀ऀऀऀ䄀一䐀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀㬀  
਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ唀瀀搀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 昀漀爀 愀 昀椀氀攀 䤀䐀⸀ 
-- Input is a file ID and transaction group ID.   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀⸀ 
-- 05-08-2023 Added user authentication਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_file_transaction_group] ਀ 
	 @fileid bigint                   = NULL,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)          = '',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀ    匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready         = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	-- Validation checks਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
		 SET @fileid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @fileid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A file id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 琀栀攀 䘀椀氀攀 搀愀琀愀 
		   EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀ            䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
	            @user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀ   䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- file id does not exist or the user does not have permission to edit it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
				 END			 ਀ऀऀ 䔀一䐀 
਀ऀऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀 
			 IF @transactiongroup = 0 ਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 一唀䰀䰀㬀  ⴀⴀ 一甀氀氀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 愀氀氀漀眀攀搀 
			 IF @transactiongroup IS NOT NULL਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   IF NOT EXISTS (SELECT transaction_group_id ਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀  
								   WHERE transaction_group_id = @transactiongroup) ਀ऀऀऀऀऀ   䈀䔀䜀䤀一 
 						  EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
							   @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				              SET @message = CONCAT(@message, ' | ',  CONVERT(nvarchar(20), @transactiongroup), '  ', @tempmessage);਀ऀऀऀऀऀऀ  䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TGNotExist.');਀ऀऀऀऀऀऀ  匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						  SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀一䐀 
				 END   -- End checking transaction group reference਀  
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'  -- Data validation failed਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀  
		           SET transaction_group_id = @transactiongroup਀ऀऀऀ     圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- End if transaction ready = Ready਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_filename]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㠀ⴀ㈀　㈀㐀 
-- Description:	Updates a filename.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 䤀䐀   
-- Output is message and status.਀ⴀⴀ 　㔀ⴀ　㠀ⴀ㈀　㈀㌀ 䄀搀搀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开昀椀氀攀渀愀洀攀崀  
਀ऀ 䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @stored_filename nvarchar(255)   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀渀愀洀攀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀Ⰰ 
		@tempuserauth_status nchar(10)          = 'Fail',  -- Temporary value for authentication sp.਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
	  IF @fileid = 0਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if a file id has not been supplied.  Fail if it has not been supplied.਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoFileID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to edit the file data਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 	            @file_id_to_check_ep =  @fileid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
		   IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 昀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 攀搀椀琀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileIDAccess.');਀ऀऀऀऀ 䔀一䐀ऀऀऀ  
		 END਀ 
		-- Stored filename must be a valid filename਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开昀椀氀攀渀愀洀攀 
			 @filename_to_validate = @stored_filename,਀ऀऀऀ 䀀昀椀氀攀渀愀洀攀开瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀渀愀洀攀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
਀ऀऀ䤀䘀 䀀昀椀氀攀渀愀洀攀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䤀渀瘀愀氀椀搀✀ 
		  BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'InvalidFilename', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL)਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀瘀愀氀椀搀䘀椀氀攀渀愀洀攀⸀✀⤀㬀 
		  END਀ऀऀⴀⴀ 䔀渀搀 昀椀氀攀渀愀洀攀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
		-- Stored filename length must be less than 255਀ऀऀ䤀䘀 䰀䔀一⠀䀀猀琀漀爀攀搀开昀椀氀攀渀愀洀攀⤀ 㸀 ㈀㔀㐀 
		  BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				 @message_id   = 'FilenameTooLong', ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL)਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀渀愀洀攀吀漀漀䰀漀渀最⸀✀⤀㬀 
		  END਀ऀऀⴀⴀ 䔀渀搀 昀椀氀攀渀愀洀攀 氀攀渀最琀栀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'  -- Data validation failed਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ऀⴀⴀ 䔀渀搀 漀昀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
    END -- End IF user authentication = Pass਀ 
-- Execute the update query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀  
		           SET filename = @stored_filename਀ऀऀऀ     圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- End if transaction ready = Ready਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_tag_doc_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 搀漀挀甀洀攀渀琀 琀愀最 琀漀 搀漀挀甀洀攀渀琀 氀椀渀欀⸀ 
-- Authenticates for both controller and editor. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开搀漀挀开氀椀渀欀崀  
਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @documentid nvarchar(50)         = NULL,਀     䀀渀攀眀琀愀最开椀搀 戀椀最椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @newdocumentid nvarchar(50)      = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @documentid IS NULL OR @documentid = ''਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
	  -- Check if a tag was supplied਀ऀ  䤀䘀 䀀琀愀最开椀搀 㴀 　  
	    SET @tag_id = NULL;਀ऀ  䤀䘀 䀀琀愀最开椀搀 䤀匀 一唀䰀䰀 
	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoTagID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䤀䐀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
		 BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 吀愀最 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ 
਀ 
-- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 䄀一䐀 
    NOT EXISTS (SELECT tag_doc_link_id਀ऀ              䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
			     WHERE    doc_id਀ऀऀऀ           㴀 䀀搀漀挀甀洀攀渀琀椀搀 
			       AND    tag_id਀ऀऀऀऀ       㴀 䀀琀愀最开椀搀⤀ 
			 BEGIN -- The record does not exist਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
			 END਀ 
--============================ ਀ 
-- Check the new parameters਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
		  IF @newdocumentid IS NULL OR @newdocumentid = ''਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 							@doc_id_to_check_ep =  @newdocumentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@newdocumentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
	  -- Check if a tag was supplied਀ऀ  䤀䘀 䀀渀攀眀琀愀最开椀搀 㴀 　  
	    SET @newtag_id = NULL;਀ऀ  䤀䘀 䀀渀攀眀琀愀最开椀搀 䤀匀 一唀䰀䰀 
	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoTagID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䤀䐀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀渀攀眀琀愀最开椀搀⤀ 
		 BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 吀愀最 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		 END਀ 
਀ⴀⴀ 䌀栀攀挀欀 昀漀爀 愀 搀甀瀀氀椀挀愀琀攀 漀昀 琀栀攀 渀攀眀 爀攀挀漀爀搀⸀ 
਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	    AND EXISTS (SELECT tag_id ਀ऀऀ              䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
					 WHERE    tag_id਀ऀऀऀऀऀ       㴀 䀀渀攀眀琀愀最开椀搀 
					   AND       doc_id ਀ऀऀऀऀऀ       㴀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀 
					   AND NOT(@tag_id਀ऀऀऀऀऀ           㴀 䀀渀攀眀琀愀最开椀搀 
						   AND      @documentid  ਀ऀऀऀऀऀऀ       㴀 䀀渀攀眀搀漀挀甀洀攀渀琀椀搀ऀऀऀऀऀऀ       
						  ))਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ 䔀一䐀 
--===========================਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ 
		-- End data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  ⴀⴀ 匀攀琀 琀栀攀 挀愀瀀椀琀愀氀椀猀愀琀椀漀渀 琀漀 洀愀琀挀栀 琀栀攀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 
	  	SELECT @newdocumentid = doc_id਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 
		 WHERE doc_id = @newdocumentid;਀ 
	  BEGIN TRY਀ 
		UPDATE tagging.tag_to_document_links਀ऀऀ   匀䔀吀       琀愀最开椀搀 
			   = @newtag_id,਀                     搀漀挀开椀搀  
			   = @newdocumentid਀ऀऀ 圀䠀䔀刀䔀    搀漀挀开椀搀 
			   = @documentid਀ऀऀ   䄀一䐀    琀愀最开椀搀 
			   = @tag_id		            ਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_tag_group_link]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 琀愀最 琀漀 琀愀最 最爀漀甀瀀 氀椀渀欀⸀ 
-- Authenticates for both controller and editor. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开最爀漀甀瀀开氀椀渀欀崀  
਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @tag_groupid bigint              = NULL,਀     䀀渀攀眀琀愀最开椀搀 戀椀最椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @newtag_groupid bigint           = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',		਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set will be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
			 BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 END਀ 
			 ELSE  -- Check if the user has rights to edit the tag਀ऀऀऀऀ  䈀䔀䜀䤀一 
					EXEC [internal].[usp_AUTHENTICATE_tag_edit]਀ऀऀऀऀऀऀ 䀀琀愀最开椀搀开攀瀀 㴀 䀀琀愀最开椀搀Ⰰ 
						 @user_authentication_result_tag = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀ  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN਀ऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 							   SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_id), '  ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
							   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagPermission');		   ਀ऀऀऀऀऀऀ 䔀一䐀 
				  END਀ 
	  --  Check the tag group ID.਀ऀ   
	  	  IF @tag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_groupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 最爀漀甀瀀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGroupID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- Tag group has been supplied.  Check if it exists. ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @tag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						  SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_groupid), '  ', @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
਀               ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀甀琀栀攀渀琀椀挀愀琀攀搀 昀漀爀 琀栀攀 琀愀最 最爀漀甀瀀⸀ 
				ELSE਀ऀऀऀऀऀ䈀䔀䜀䤀一 
					    EXEC [internal].[usp_AUTHENTICATE_tag_group]਀ऀऀऀऀऀऀऀ䀀琀愀最开最爀漀甀瀀椀搀开攀瀀 㴀 䀀琀愀最开最爀漀甀瀀椀搀Ⰰ 
							@user_authentication_result_tg = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id   = 'NoTagGrpPermission', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
								IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开最爀漀甀瀀椀搀⤀Ⰰ ✀  ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀瀀倀攀爀洀椀猀猀椀漀渀✀⤀㬀ऀऀ    
							END਀ऀऀऀऀऀ䔀一䐀 
 ਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
	 IF @data_validation_status = 'Pass' ਀ऀ    䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀  
		                  FROM tagging.tag_to_tag_group_links਀ऀऀऀऀऀ     圀䠀䔀刀䔀    琀愀最开椀搀 
					           = @tag_id਀ऀऀऀऀऀ       䄀一䐀    琀愀最开最爀漀甀瀀开椀搀  
					           = @tag_groupid)਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀऀ 䔀一䐀 
਀ 
-- ===========================================================਀ⴀⴀ 䌀栀攀挀欀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 
	  -- Check if a new tag was supplied਀ऀ  䤀䘀 䀀渀攀眀琀愀最开椀搀 㴀 　  
	    SET @newtag_id = NULL;਀ऀ  䤀䘀 䀀渀攀眀琀愀最开椀搀 䤀匀 一唀䰀䰀 
	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoTagID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䤀䐀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @newtag_id)਀ऀऀऀ 䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @newtag_id), '  ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀一䐀 
਀ऀऀऀ 䔀䰀匀䔀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 攀搀椀琀 琀栀攀 琀愀最 
				  BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开攀搀椀琀崀 
						 @tag_id_ep = @newtag_id,਀ऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					  IF @temp_userauth_status = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 
							SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id   = 'NoTagPermission', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
							IF (@tempmessage IS NOT NULL) ਀ ऀऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
							ELSE ਀ऀऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀⤀㬀ऀऀ    
						 END਀ऀऀऀऀ  䔀一䐀 
਀ऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 琀愀最 最爀漀甀瀀 䤀䐀⸀ 
	  ਀ऀ  ऀ  䤀䘀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 㴀 　  
			 SET @newtag_groupid = NULL;਀  
		  -- Check if a tag group id was supplied. ਀ऀऀ  䤀䘀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag group id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagGroupID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䜀爀漀甀瀀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 吀愀最 最爀漀甀瀀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
				 IF NOT EXISTS (SELECT tag_group_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
								 WHERE    tag_group_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀⤀ 
					 BEGIN -- Tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagGroupNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ 
               -- Check if the user is authenticated for the tag group.਀ऀऀऀऀ䔀䰀匀䔀 
					BEGIN਀ऀऀऀऀऀ    䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开最爀漀甀瀀崀 
							@tag_groupid_ep = @newtag_groupid,਀ऀऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀最 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @temp_userauth_status = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䜀爀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							        SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @newtag_groupid), '  ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGrpPermission');		   ਀ऀऀऀऀऀऀऀ䔀一䐀 
					END਀ 
਀     ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
਀ऀ 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
	    AND EXISTS (SELECT tag_group_id ਀ऀऀ              䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 
					 WHERE    tag_id਀ऀऀऀऀऀ       㴀 䀀渀攀眀琀愀最开椀搀 
					   AND    tag_group_id ਀ऀऀऀऀऀ       㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 
					   AND NOT(@tag_id਀ऀऀऀऀऀ           㴀 䀀渀攀眀琀愀最开椀搀 
						   AND      @tag_groupid  ਀ऀऀऀऀऀऀ       㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀ऀऀऀऀऀऀ       
						  ))਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀऀ 䔀一䐀 
		 ਀ऀ     
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀  
		    SET       tag_id਀ऀऀऀ    㴀 䀀渀攀眀琀愀最开椀搀Ⰰ 
				      tag_group_id਀ऀऀऀऀ㴀 䀀渀攀眀琀愀最开最爀漀甀瀀椀搀 
		  WHERE   tag_id ਀ऀऀ        㴀 䀀琀愀最开椀搀 
		    AND    tag_group_id਀ऀऀऀ    㴀 䀀琀愀最开最爀漀甀瀀椀搀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10), ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_tag_tree_node]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 琀愀最 爀攀氀愀琀椀漀渀猀栀椀瀀 琀爀攀攀 渀漀搀攀 琀漀 洀漀瘀攀 椀琀 琀漀 愀 搀椀昀昀攀爀攀渀琀 渀漀搀攀⸀ 
-- Authenticates for both controller and editor. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开琀爀攀攀开渀漀搀攀崀  
਀     䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
     @new_parentid bigint             = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀渀漀搀攀 渀瘀愀爀挀栀愀爀⠀㐀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@tag_treeid bigint,਀        䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
        @new_parent_hierarchyid hierarchyid,਀ऀऀ䀀渀攀眀开猀椀戀氀椀渀最开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@new_hierarchyid hierarchyid,	਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
	SET @tag_treeid = (SELECT tag_tree_id਀ऀ                     䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
	                    WHERE    tag_tree_node_id ਀ऀ                          㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀ 
਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 IF @tag_tree_node_id = 0਀    匀䔀吀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 一唀䰀䰀㬀 
 IF @tag_tree_node_id IS NULL਀ ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoNode');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
  ELSE -- A node ID has been supplied.  Check if it exists. ਀    䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT tag_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   tag_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TreeNodeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ 
                 ELSE -- A valid node id exists. ਀                   䈀䔀䜀䤀一         ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 琀愀最 琀爀攀攀 
						EXEC [internal].[usp_AUTHENTICATE_tag_tree]਀ऀऀऀऀऀऀ   䀀琀愀最开琀爀攀攀椀搀开攀瀀 㴀 䀀琀愀最开琀爀攀攀椀搀Ⰰ 
						   @user_authentication_result_tt = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						  BEGIN਀ऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
							SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'NoTagTreePerm', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
							ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀倀攀爀洀⸀✀⤀㬀 
						  END਀ऀऀऀऀऀ䔀一䐀 
	   END਀ 
IF @data_validation_status = 'Pass'਀  䈀䔀䜀䤀一 
  -- Validate the parent ID਀    䤀䘀 䀀渀攀眀开瀀愀爀攀渀琀椀搀 㴀 　 
	    SET @new_parentid = NULL;਀ऀ䤀䘀 䀀渀攀眀开瀀愀爀攀渀琀椀搀 䤀匀 一唀䰀䰀 
	   BEGIN਀ऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀漀漀琀 渀漀搀攀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 昀漀爀 琀栀椀猀 琀愀最 琀爀攀攀 
		  IF EXISTS(਀ऀऀ       匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
			     FROM tagging.tag_tree_nodes਀ऀऀऀऀ圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀 
				      = @tag_treeid਀ऀऀऀऀ  䄀一䐀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀ 
				  )਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀漀漀琀一漀搀攀䔀砀椀猀琀猀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RootNodeExists');		   ਀ऀऀऀऀऀ 䔀一䐀 
	   END਀ऀ䔀䰀匀䔀 ⴀⴀ 䄀 瀀愀爀攀渀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  一唀䰀䰀 椀猀 瀀攀爀洀椀琀琀攀搀 愀渀搀 眀椀氀氀 戀攀 猀琀漀爀攀搀 愀猀 爀漀漀琀 椀昀 愀 爀漀漀琀 搀漀攀猀 渀漀琀 愀氀爀攀愀搀礀 攀砀椀猀琀⸀ 
	     -- Check that the parent ID exists for that tree ID਀ऀ   䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT tag_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   tag_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀渀攀眀开瀀愀爀攀渀琀椀搀 
						  AND tag_tree_id ਀ऀऀऀऀऀऀ      㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
						           FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
								        = @tag_tree_node_id))਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀倀愀爀攀渀琀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ParentNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
਀ऀ   䔀一䐀 
	  ਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 渀攀眀 渀漀搀攀 椀猀 愀 搀攀猀挀攀渀搀愀渀琀 漀昀 琀栀攀 攀砀椀猀琀椀渀最 
		SELECT @current_hierarchyid = tag_tree_hierarchyid਀ऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
		 WHERE tag_tree_node_id = @tag_tree_node_id;਀ 
		SELECT @new_parent_hierarchyid = tag_tree_hierarchyid਀ऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
		 WHERE tag_tree_node_id = @new_parentid;਀ 
             IF @new_parent_hierarchyid.IsDescendantOf(@current_hierarchyid) = 1 ਀             䈀䔀䜀䤀一  
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀搀攀䤀猀䐀攀猀挀攀渀搀愀渀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NodeIsDescendant.');਀             䔀一䐀 
਀  
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ 
   END -- IF @data_validation_status = 'Pass'਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  END -- END IF @userauthentication_status = 'Pass'਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY਀       䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    SELECT @current_hierarchyid = tag_tree_hierarchyid਀ऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
		 WHERE tag_tree_node_id਀ऀऀ       㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀㬀 
਀             䤀䘀 䀀渀攀眀开瀀愀爀攀渀琀椀搀 䤀匀 一唀䰀䰀 
             BEGIN਀                 ⴀⴀ 䴀漀瘀攀 琀漀 爀漀漀琀 氀攀瘀攀氀 
                 SET @new_hierarchyid = hierarchyid::GetRoot();਀             䔀一䐀 
             ELSE਀             䈀䔀䜀䤀一 
				 SELECT @new_parent_hierarchyid = tag_tree_hierarchyid ਀ऀऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
				  WHERE tag_tree_node_id = @new_parentid; ਀                 ⴀⴀ 䜀攀渀攀爀愀琀攀 渀攀眀 栀椀攀爀愀爀挀栀礀 椀搀 愀猀 挀栀椀氀搀 漀昀 渀攀眀 瀀愀爀攀渀琀 
                 SELECT @new_sibling_hierarchyid = MAX(tag_tree_hierarchyid)  ਀                   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
                  WHERE tag_tree_hierarchyid.IsDescendantOf(@new_parent_hierarchyid) = 1਀                    䄀一䐀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䰀攀瘀攀氀⠀⤀ 㴀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䰀攀瘀攀氀⠀⤀ ⬀ ㄀㬀 
਀                 匀䔀吀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 㴀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䐀攀猀挀攀渀搀愀渀琀⠀䀀渀攀眀开猀椀戀氀椀渀最开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 一唀䰀䰀⤀㬀 
਀             䔀一䐀 
਀ऀऀऀ  䤀䘀 一伀吀⠀ 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䄀渀挀攀猀琀漀爀⠀㄀⤀ 㴀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⤀ ⴀⴀ 䤀昀 琀栀攀 渀攀眀 瀀愀爀攀渀琀 椀猀 猀愀洀攀 愀猀 攀砀椀猀琀椀渀最 瀀愀爀攀渀琀 搀漀 渀漀琀栀椀渀最⸀  
			    BEGIN਀ऀऀऀऀऀⴀⴀ 䌀愀氀挀甀氀愀琀攀 琀栀攀 渀攀眀 栀椀攀爀愀爀挀栀礀 䤀䐀 昀漀爀 琀栀攀 渀漀搀攀 戀攀椀渀最 洀漀瘀攀搀 
					SELECT @new_hierarchyid = @new_parent_hierarchyid.GetDescendant(MAX(tag_tree_hierarchyid), NULL)਀ऀऀऀऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
					WHERE tag_tree_hierarchyid.GetAncestor(1) = @new_parent_hierarchyid;਀ 
					-- If it's the first child, @new_hierarchyid will be NULL from the above, ਀ऀऀऀऀऀⴀⴀ 猀漀 栀愀渀搀氀攀 琀栀愀琀㨀 
					IF @new_hierarchyid IS NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 㴀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䐀攀猀挀攀渀搀愀渀琀⠀一唀䰀䰀Ⰰ 一唀䰀䰀⤀㬀 
਀ऀऀऀऀऀⴀⴀ 䄀瀀瀀氀礀 琀栀攀 洀漀瘀攀 琀漀 琀栀攀 攀渀琀椀爀攀 猀甀戀琀爀攀攀 
					UPDATE tagging.tag_tree_nodes਀ऀऀऀऀऀ匀䔀吀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀刀攀瀀愀爀攀渀琀攀搀嘀愀氀甀攀⠀䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀⤀ 
					WHERE tag_tree_hierarchyid.IsDescendantOf(@current_hierarchyid) = 1;਀ऀऀ        䔀一䐀 
			ELSE਀ऀऀऀ   匀䔀吀 䀀渀攀眀渀漀搀攀 㴀 䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀吀漀匀琀爀椀渀最⠀⤀㬀 
         COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_tag_tree_tag]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 刀攀瀀氀愀挀攀猀 琀栀攀 琀愀最 愀琀 愀 最椀瘀攀渀 琀愀最 爀攀氀愀琀椀漀渀猀栀椀瀀 琀爀攀攀 渀漀搀攀⸀ 
-- Authenticates for both controller and editor. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀攀搀椀琀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开琀爀攀攀开琀愀最崀  
਀     䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
     @new_tagid bigint                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀琀愀最开琀爀攀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ऀ匀䔀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
	                     FROM tagging.tag_tree_nodes਀ऀ                    圀䠀䔀刀䔀    琀愀最开琀爀攀攀开渀漀搀攀开椀搀  
	                          = @tag_tree_node_id)਀ 
	  -- Data validation਀ 
 -- Check the tag tree node ID਀ 䤀䘀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 　 
    SET @tag_tree_node_id = NULL;਀ 䤀䘀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 䤀匀 一唀䰀䰀 
 	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一漀搀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀  䔀䰀匀䔀 ⴀⴀ 䄀 渀漀搀攀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
    BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		                 FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @tag_tree_node_id)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TreeNodeNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
਀                 䔀䰀匀䔀 ⴀⴀ 䄀 瘀愀氀椀搀 渀漀搀攀 椀搀 攀砀椀猀琀猀⸀  
                   BEGIN         -- Check if the user has edit permission for the tag tree਀ऀऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开琀爀攀攀崀 
						   @tag_treeid_ep = @tag_treeid,਀ऀऀऀऀऀऀ   䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @temp_userauth_status = 'Fail'਀ऀऀऀऀऀऀ  䈀䔀䜀䤀一 
							SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀倀攀爀洀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTreePerm.');਀ऀऀऀऀऀऀ  䔀一䐀 
					END਀ऀ   䔀一䐀 
਀   ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 渀攀眀 琀愀最 椀搀 
਀   ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @new_tagid = 0 ਀ऀ    匀䔀吀 䀀渀攀眀开琀愀最椀搀 㴀 一唀䰀䰀㬀 
	  IF @new_tagid IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @new_tagid)਀ऀऀ 䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @new_tagid), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ऀऀ 䔀䰀匀䔀  ⴀⴀ 吀愀最 攀砀椀猀琀猀⸀  䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 攀搀椀琀 琀栀攀 琀愀最 
               -- Adding a tag to a relationship tree changes the tag function਀ऀ           ⴀⴀ 䠀攀渀挀攀 琀栀攀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 攀搀椀琀 爀椀最栀琀猀 昀漀爀 琀栀攀 琀愀最 椀渀 漀爀搀攀爀 琀漀 愀搀搀 椀琀 琀漀 愀 琀爀攀攀⸀ 
			  BEGIN਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开攀搀椀琀崀 
					 @tag_id_ep = @new_tagid,਀ऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				  IF @temp_userauth_status = 'Fail'਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 						   SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagPermission');		   ਀ऀऀऀऀऀ 䔀一䐀 
			  END਀  
 ਀  
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  END -- END IF @userauthentication_status = 'Pass'਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY    ਀ऀऀऀ䈀䔀䜀䤀一 
			  UPDATE tagging.tag_tree_nodes਀ऀऀऀऀ 匀䔀吀   琀愀最开椀搀 
				     = @new_tagid਀ऀऀऀ   圀䠀䔀刀䔀   琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
			         = @tag_tree_node_id਀ऀऀ    䔀一䐀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [editing].[usp_UPD_wf_input_step_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀⸀   
-- All old and new parameters must be sent.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [editing].[usp_UPD_wf_input_step_file] ਀ 
     @fileid bigint,    ਀ऀ 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 戀椀最椀渀琀Ⰰ 
	 @new_fileid bigint,    ਀ऀ 䀀渀攀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀 戀椀最椀渀琀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@docauthenticationstatus nchar(10)   = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @userauthentication_status OUTPUT;਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 漀氀搀 昀椀氀攀 䤀䐀 
			EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀渀攀眀开昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀渀攀眀开昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀渀攀眀开昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀渀攀眀开昀椀氀攀椀搀Ⰰ 
						@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀渀攀眀开昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
		 -- End checking the file id਀ 
		 -- Check the instance step id਀ 
	  IF @input_step_id = 0਀ऀऀ 匀䔀吀 䀀椀渀瀀甀琀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀऀⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
				BEGIN਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
					@instance_step_to_check = @input_step_id,਀ऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
				 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 
		 				SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀ䔀一䐀 
				END਀ 
		 -- End checking the instance step id਀ 
		-- Check the new input step id. ਀ 
	  IF @new_input_step_id = 0਀ऀऀ 匀䔀吀 䀀渀攀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an instance input step id was supplied.਀ऀ  䤀䘀 䀀渀攀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 椀渀瀀甀琀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the input step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
							  FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀渀攀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀 ⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
				BEGIN਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
					@instance_step_to_check = @new_input_step_id,਀ऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
				 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 
		 				SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ 䔀一䐀 
਀ऀ  
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
	 IF NOT EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_step_input_files਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀  
		        =       @input_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀ䔀一䐀 
  END਀ 
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT workflow_input_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 
		  WHERE        file_id਀ऀऀ        㴀 䀀渀攀眀开昀椀氀攀椀搀ऀऀ   
		    AND workflow_input_step_id ਀ऀऀ        㴀   䀀渀攀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
	    END਀ 
਀   䔀一䐀  ⴀⴀ䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE workflow_instances.workflow_step_input_files਀ऀऀ    匀䔀吀 昀椀氀攀开椀搀                   㴀 䀀渀攀眀开昀椀氀攀椀搀Ⰰ 
			    workflow_input_step_id    = @new_input_step_id਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀  
		        =       @input_step_id;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_authoriser]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀⸀  
-- Output is a status string of 'Pass' or 'Fail'.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开愀甀琀栀漀爀椀猀攀爀崀  
਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
		SET @user_authentication_result = 'Fail';਀ 
 -- Check if the user  has permission਀ 
  IF EXISTS (SELECT authoriser_sid_id AS asi  ਀                   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀猀 䄀匀 愀 
	     INNER JOIN user_restr.sid_list AS sl਀ऀऀ            伀一 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
					= sl.sid_id਀ऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 
    -- The user has permission for this action਀ऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
  ELSE਀ऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀㬀  
਀䔀一䐀 
਀ 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开挀漀渀琀开搀漀挀开最爀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 
-- of a given controller document edit group. ਀ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
-- Input is a the id of the document group to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
਀ⴀⴀ 䤀昀 愀 搀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 琀栀攀渀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 渀漀琀 瀀愀爀琀 漀昀 琀栀愀琀 最爀漀甀瀀 
-- then the user is excluded from editing rights.਀ⴀⴀ 吀栀攀爀攀 愀爀攀 琀眀漀 氀愀礀攀爀猀 漀昀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀⸀  䄀琀 漀渀攀 氀攀瘀攀氀Ⰰ 挀漀渀琀爀漀氀氀攀爀猀 愀爀攀 最爀愀渀琀攀搀 攀砀挀氀甀猀椀瘀攀 攀搀椀琀椀渀最 
-- permissions by an authoriser, referred to as controller level permission. Other controllers cannot alter those permissions.਀ⴀⴀ 䄀琀 琀栀攀 漀琀栀攀爀 氀攀瘀攀氀 挀漀渀琀爀漀氀氀攀爀猀 最爀愀渀琀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀 琀漀 攀搀椀琀漀爀猀Ⰰ 爀攀昀攀爀爀攀搀 琀漀 愀猀 攀搀椀琀漀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  䌀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀猀 
-- exclude and override any editor level permission.  A controller cannot delegate permission for a controller level permission. ਀ 
਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开挀漀渀琀开搀漀挀开最爀瀀崀  
਀ऀ䀀挀漀渀琀爀开搀漀挀开最爀瀀开琀漀开挀栀攀挀欀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ 
	@user_authentication_result_cep nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL, -- The SID of the connected user਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @user_authentication_result_cep  = 'Fail'਀ 
  SET @usersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀ 
਀ऀऀऀ   
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;			  ਀ 
਀ऀऀ䤀䘀 䔀堀䤀匀吀匀  
			  (SELECT sl.sid_id਀ऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		   INNER JOIN user_restr.controller_doc_group_sid_links AS cdgsl਀ऀऀऀऀ   伀一      猀氀⸀猀椀搀开椀搀 
					  = cdgsl.sid_id਀ऀऀ   䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 挀搀最渀  
				   ON  cdgsl.controller_doc_group_name_id਀ऀऀऀऀऀ  㴀 挀搀最渀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
	 			WHERE cdgsl.controller_doc_group_name_id = @contr_doc_grp_to_check਀ऀऀऀऀ  䄀一䐀  猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀  
  			           )਀ऀऀ    䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 
		 SET @user_authentication_result_cep = 'Pass';਀ऀऀ 䔀䰀匀䔀 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀 㴀 ✀䘀愀椀氀✀㬀 
਀    
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_cont_file_grp]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Checks whether the connected user is a member਀ⴀⴀ 漀昀 愀 最椀瘀攀渀 挀漀渀琀爀漀氀氀攀爀 昀椀氀攀 攀搀椀琀 最爀漀甀瀀⸀  
-- Also returns fail if the id does not exist.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀栀攀 椀搀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀ 
-- If a file is linked to a controller group then if the connected user is not part of that group਀ⴀⴀ 琀栀攀渀 琀栀攀 甀猀攀爀 椀猀 攀砀挀氀甀搀攀搀 昀爀漀洀 攀搀椀琀椀渀最 爀椀最栀琀猀⸀ 
-- There are two layers of editing permissions.  At one level, controllers are granted exclusive editing਀ⴀⴀ 瀀攀爀洀椀猀猀椀漀渀猀 戀礀 愀渀 愀甀琀栀漀爀椀猀攀爀Ⰰ 爀攀昀攀爀爀攀搀 琀漀 愀猀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀ 伀琀栀攀爀 挀漀渀琀爀漀氀氀攀爀猀 挀愀渀渀漀琀 愀氀琀攀爀 琀栀漀猀攀 瀀攀爀洀椀猀猀椀漀渀猀⸀ 
-- At the other level controllers grant editing permissions to editors, referred to as editor level permission.  Controller level permissions਀ⴀⴀ 攀砀挀氀甀搀攀 愀渀搀 漀瘀攀爀爀椀搀攀 愀渀礀 攀搀椀琀漀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  䄀 挀漀渀琀爀漀氀氀攀爀 挀愀渀渀漀琀 搀攀氀攀最愀琀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  
਀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_cont_file_grp] ਀ 
	@contr_file_grp_to_check bigint               = NULL,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@view_permission  nvarchar(10)     = NULL,਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @user_authentication_result_cep  = 'Fail'਀ 
  SET @usersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀ 
			  ਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀ऀऀऀ   
਀ 
		IF EXISTS ਀ऀऀऀ  ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
				 FROM user_restr.sid_list AS sl਀ऀऀ   䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀搀最猀氀 
				   ON      sl.sid_id਀ऀऀऀऀऀ  㴀 挀搀最猀氀⸀猀椀搀开椀搀 
		   INNER JOIN xref.controller_file_group_names AS cdgn ਀ऀऀऀऀ   伀一  挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
					  = cdgn.controller_file_group_name_id਀ऀ ऀऀऀ圀䠀䔀刀䔀 挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 㴀 䀀挀漀渀琀爀开昀椀氀攀开最爀瀀开琀漀开挀栀攀挀欀 
				  AND  sl.sid = @usersid ਀  ऀऀऀ           ⤀ 
		     AND @iscontroller = 'Pass'਀ऀऀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开挀攀瀀 㴀 ✀倀愀猀猀✀㬀 
		 ELSE SET @user_authentication_result_cep = 'Fail';਀ 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to edit the metadata of a given document. ਀ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
-- Input is a the id of the document group to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 吀漀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 搀漀挀甀洀攀渀琀 琀栀攀 甀猀攀爀 洀甀猀琀 昀椀爀猀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀愀琀 搀漀挀甀洀攀渀琀⸀ 
  -- Viewing restrictions override editing permissions.  ਀  ⴀⴀ 䔀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 眀漀爀欀 搀椀昀昀攀爀攀渀琀氀礀 昀爀漀洀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀⸀  圀椀琀栀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀 愀 搀漀挀甀洀攀渀琀 
  -- is viewable by default.  With edit permissions the document is restricted by default. ਀  ⴀⴀ 䄀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 搀漀挀甀洀攀渀琀 椀昀 琀栀攀爀攀 椀猀 愀 挀栀愀椀渀 昀爀漀洀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 琀栀爀漀甀最栀 
  -- either a function list or a people list to a sid in the sid list which is the sid for the user or a sid the user is a member of.਀  ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 搀漀挀甀洀攀渀琀 琀栀攀礀 栀愀瘀攀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
  -- except if the document is linked to a controller document group which is not linked to the connected user. ਀  ⴀⴀ 䤀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 琀栀攀渀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 渀漀琀 瀀愀爀琀 漀昀 琀栀愀琀 最爀漀甀瀀 
  -- then the user is excluded from editing rights.਀  ⴀⴀ 吀栀攀爀攀 愀爀攀 琀眀漀 氀愀礀攀爀猀 漀昀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀⸀  䄀琀 漀渀攀 氀攀瘀攀氀Ⰰ 挀漀渀琀爀漀氀氀攀爀猀 愀爀攀 最爀愀渀琀攀搀 攀砀挀氀甀猀椀瘀攀 攀搀椀琀椀渀最 
  -- permissions by an authoriser, referred to as controller level permission. Other controllers cannot alter those permissions.਀  ⴀⴀ 䄀琀 琀栀攀 漀琀栀攀爀 氀攀瘀攀氀 挀漀渀琀爀漀氀氀攀爀猀 最爀愀渀琀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀 琀漀 攀搀椀琀漀爀猀Ⰰ 爀攀昀攀爀爀攀搀 琀漀 愀猀 攀搀椀琀漀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  䌀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀猀 
  -- exclude and override any editor level permission.  A controller cannot delegate permission for a controller level permission. ਀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_doc_ed_perm] ਀ 
	@doc_id_to_check_ep nvarchar(50) = NULL,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@view_permission  nvarchar(10)     = NULL,਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀Ⰰ 
		@dociscontrollergroup nvarchar(5)  = NULL;਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀  㴀 ✀䘀愀椀氀✀ 
਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀⸀ 
  EXEC [internal].[usp_AUTHENTICATE_user_doc_id]਀         䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀 䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀Ⰰ 
		 @user_authentication_result = @view_permission OUTPUT;਀ 
  IF @view_permission = 'Pass' -- The user has viewing permission for the document਀    䈀䔀䜀䤀一  
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;਀      ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 搀漀挀甀洀攀渀琀 琀栀攀礀 栀愀瘀攀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
	  -- except if the document is linked to a controller document group which is not linked to the connected user. ਀ 
	  IF EXISTS -- Is the doc id linked to a controller group?਀ऀ    ⠀匀䔀䰀䔀䌀吀 挀搀最氀⸀搀漀挀开椀搀  
		   FROM xref.controller_doc_group_links AS cdgl਀ऀऀ  圀䠀䔀刀䔀 挀搀最氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀⤀ 
	  SET @dociscontrollergroup = 'Yes'਀ऀ  䔀䰀匀䔀 匀䔀吀 䀀搀漀挀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀㬀 
਀ 
	  IF @dociscontrollergroup = 'Yes' -- If the document is linked to a controller group, test if the user is a member of that group and is also a controller਀ऀ  䈀䔀䜀䤀一  
		IF (EXISTS ਀ऀऀऀ  ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
				 FROM user_restr.sid_list AS sl਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀搀最猀氀 
				   ON      sl.sid_id਀ऀऀऀऀऀ  㴀 挀搀最猀氀⸀猀椀搀开椀搀 
			LEFT JOIN xref.controller_doc_group_names AS cdgn ਀ऀऀऀऀ   伀一  挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
					  = cdgn.controller_doc_group_name_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 挀搀最氀 
				   ON   cdgn.controller_doc_group_name_id਀ऀऀऀऀऀ  㴀 挀搀最氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
	 			WHERE sl.sid = @usersid   			      ਀ऀऀऀऀ  䄀一䐀 挀搀最氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀⤀⤀ 
		 AND @iscontroller = 'Pass'਀ऀऀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀倀愀猀猀✀㬀 
		 ELSE SET @user_authentication_result_dep = 'Fail';਀ऀ 䔀一䐀 
	 ELSE SET @user_authentication_result_dep = 'Pass';਀ऀऀ 
	  -- If the document is not linked to a controller group then if the user is a controller then they have editing਀ऀ  ⴀⴀ 爀椀最栀琀猀 琀漀 愀渀礀 搀漀挀甀洀攀渀琀 琀栀攀礀 栀愀瘀攀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
਀ 
	  IF @dociscontrollergroup = 'No' AND @user_authentication_result_dep = 'Pass' -- The user is not excluded by controller level restrictions਀ऀ  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 攀砀挀氀甀搀攀搀 戀礀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀猀 戀甀琀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 渀漀琀 瀀愀爀琀 漀昀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 琀栀攀渀 瀀攀爀洀椀猀猀椀漀渀 眀椀氀氀 戀攀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀椀猀 猀攀最洀攀渀琀⸀ 
		 BEGIN -- Check if the user is linked to the document group through either a function list or a people list਀ऀऀ   䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀倀愀猀猀✀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 愀琀 琀栀椀猀 猀琀攀瀀 琀栀攀渀 琀栀攀礀 愀爀攀 最爀愀渀琀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		   ELSE -- User is not a controller and is not excluded by controller level permissions਀ऀऀ    䈀䔀䜀䤀一 
			  IF  ਀ऀऀऀ        ⠀䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 䄀匀 搀昀椀搀 
					           FROM base.document_id_list AS dil਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
						            ON   dil.doc_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀最氀⸀搀漀挀开椀搀 
						  LEFT JOIN xref.doc_group_names AS dgn਀ऀऀऀऀऀऀ            伀一   搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 
									   = dgn.doc_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 搀最攀瀀昀氀 ⴀⴀ 䌀栀攀挀欀 昀漀爀 洀攀洀戀攀爀猀栀椀瀀 漀昀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 
						            ON      dgn.doc_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀最攀瀀昀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
						  LEFT JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ            伀一 搀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   =  fln.function_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						            ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						  LEFT JOIN people.duty_functions AS df਀ऀऀऀऀऀऀ            伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   = df.function_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						            ON  dfsl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						  LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一 搀昀猀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 ⠀搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀开攀瀀 
									 AND sl.sid = @usersid)਀  ऀऀऀऀऀऀऀ          
                     UNION ALL਀ 
					        (SELECT pl.sid_id AS sid਀ऀऀऀऀऀ           䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
						  LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀऀऀऀ            伀一   搀椀氀⸀搀漀挀开椀搀 
									   = dgl.doc_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
						            ON   dgl.doc_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
						  LEFT JOIN user_restr.doc_group_edit_perm_people_lst AS dgeppl -- Check for membership of a people list਀ऀऀऀऀऀऀ            伀一      搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
									   = dgeppl.doc_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
						            ON dgeppl.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						  LEFT JOIN people.people_lists AS pl਀ऀऀऀऀऀऀ            伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   = pl.people_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON   pl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE dil.doc_id = @doc_id_to_check_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ))) ਀ 
					BEGIN  -- The user has permission for this action਀ऀऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀倀愀猀猀✀㬀 
					END਀ऀऀऀऀ䔀䰀匀䔀 
				  SET @user_authentication_result_dep = 'Fail'; -- The user is not a Controller and does not have edit permission.਀ऀऀ䔀一䐀 ⴀⴀ 䔀一䐀 䔀䰀匀䔀 䤀䘀 䀀搀漀挀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀夀攀猀✀ 
	 END -- END IF @dociscontrollergroup = 'No' AND @user_authentication_result_dep = 'Pass' ਀  䔀一䐀  ⴀⴀ䤀䘀 䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀 㴀 ✀倀愀猀猀✀ ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开最爀瀀开攀搀开瀀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 
-- for a given document group. ਀ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
-- Input is a the id of the document group to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开最爀瀀开攀搀开瀀洀崀  
਀ऀ䀀搀漀挀开最爀瀀开琀漀开挀栀攀挀欀开攀瀀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ 
	@user_authentication_reslt_dgep nvarchar(10) OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL; -- The SID of the connected user਀  
਀ 
  SET @usersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀ 
  -- To have edit permission for a document the user must first have view permission for that document਀  ⴀⴀ 䔀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 眀漀爀欀 搀椀昀昀攀爀攀渀琀氀礀 昀爀漀洀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀⸀  圀椀琀栀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀 愀 搀漀挀甀洀攀渀琀 
  -- is viewable by default.  With edit permissions the document is restricted by default. ਀  ⴀⴀ 䄀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 搀漀挀甀洀攀渀琀 椀昀 琀栀攀爀攀 椀猀 愀 挀栀愀椀渀 昀爀漀洀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 琀栀爀漀甀最栀 
  -- either a function list or a people list to a sid in the sid list which is the sid for the user or a sid the user is a member of.਀ 
  -- Check if the user has view permission for the document group.਀ 
	  EXEC [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ऀऀ䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 㴀 䀀搀漀挀开最爀瀀开琀漀开挀栀攀挀欀开攀瀀Ⰰ 
		@user_authentication_result = @user_authentication_reslt_dgep OUTPUT਀ 
਀ 
      -- Check if the user is linked to the document group through either a function list or a people list਀ऀऀऀ  䤀䘀  䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开搀最攀瀀 㴀 ✀倀愀猀猀✀ 
			      AND਀ 
			        (EXISTS (SELECT df.function_id AS dfid਀ऀऀऀऀऀ           䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
						  LEFT JOIN user_restr.doc_group_edit_perm_funct_lst AS dgepfl -- Check for membership of a duty function list਀ऀऀऀऀऀऀ            伀一      搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
									   = dgepfl.doc_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						            ON dgepfl.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						  LEFT JOIN people.function_lists AS fl਀ऀऀऀऀऀऀ            伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   = fl.function_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
						            ON   fl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						  LEFT JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀऀ            伀一  搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   =  df.function_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON dfsl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE dgn.doc_group_id = @doc_grp_to_check_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							          ਀                     唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀऀऀ        ⠀匀䔀䰀䔀䌀吀 瀀氀⸀猀椀搀开椀搀 䄀匀 猀椀搀 
					           FROM xref.doc_group_names AS dgn						            ਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀攀漀瀀氀攀开氀猀琀 䄀匀 搀最攀瀀瀀氀 ⴀⴀ 䌀栀攀挀欀 昀漀爀 洀攀洀戀攀爀猀栀椀瀀 漀昀 愀 瀀攀漀瀀氀攀 氀椀猀琀 
						            ON      dgn.doc_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀最攀瀀瀀氀⸀搀漀挀开最爀漀甀瀀开椀搀 
						  LEFT JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ            伀一 搀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   =  pln.people_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						            ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						  LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一   瀀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀开最爀瀀开琀漀开挀栀攀挀欀开攀瀀 
									 AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀ         ⤀⤀⤀  
਀ऀऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					  SET @user_authentication_reslt_dgep = 'Pass';਀ऀऀऀऀऀ䔀一䐀 
				ELSE -- The user does not have permission for this action. ਀ऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开搀最攀瀀 㴀 ✀䘀愀椀氀✀㬀 
	 ਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开昀爀攀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:      Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
/*਀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀猀 昀爀攀攀 昀爀漀洀 攀搀椀琀 爀攀猀琀爀椀挀琀椀漀渀猀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
 This is not the same as checking if the user has edit permission for the file.਀ 䈀礀 搀攀昀愀甀氀琀 愀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 昀椀氀攀 甀渀氀攀猀猀 椀琀 椀猀 攀砀瀀氀椀挀椀琀氀礀 最爀愀渀琀攀搀 
 This check establishes if either the file is free from any edit permission restrictions਀ 漀爀 琀栀攀 甀猀攀爀 愀氀爀攀愀搀礀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀  吀栀攀 瀀爀漀挀攀搀甀爀攀 椀猀 甀猀攀搀 琀漀 挀栀攀挀欀 椀昀 椀琀 椀猀 漀欀  
 for a user to grant theselves edit permission for the given file. ਀ 伀琀栀攀爀眀椀猀攀 瀀攀爀洀椀猀猀椀漀渀 洀甀猀琀 戀攀 最爀愀渀琀攀搀 戀礀 愀 挀漀渀琀爀漀氀攀爀 
 If the connected user SID exists in any pathway then the check passes਀ 䤀昀 琀栀攀爀攀 愀爀攀 渀漀 匀䤀䐀猀 昀漀爀 愀渀礀 甀猀攀爀 氀椀渀欀攀搀 椀渀 愀渀礀 瀀愀琀栀眀愀礀 琀栀攀 琀栀攀 挀栀攀挀欀 瀀愀猀猀攀猀 
 In all other cases the check fails. ਀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 䤀䐀 琀漀 挀栀攀挀欀⸀ 
 Output is a user authentication status indicating 'Pass' or 'Fail'.਀⨀⼀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_file_ed_free] ਀ 
    @fileid_tocheck                         bigint,਀    䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀昀  渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
    SET NOCOUNT ON;਀ 
    -- Declare variables਀    䐀䔀䌀䰀䄀刀䔀 
	    @usersid  varbinary(100)           = NULL, -- The SID of the connected user਀ऀऀ䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 渀瘀愀爀挀栀愀爀⠀㔀⤀ 㴀 一唀䰀䰀㬀 
਀ऀ匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀    ⴀⴀ 䐀攀昀愀甀氀琀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 爀攀猀甀氀琀 琀漀 䘀愀椀氀 
    SET @user_authentication_reslt_fgef = 'Fail';਀ 
	-- Fail if the file is linked to any controller edit group.਀ऀⴀⴀ 伀琀栀攀爀眀椀猀攀㨀 
	-- Pass if the file is linked to a SID that includes the connected user.਀ऀⴀⴀ 倀愀猀猀 椀昀 琀栀攀 昀椀氀攀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 愀渀礀 匀䤀䐀猀 
	-- Fail otherwise਀ 
	  IF EXISTS -- Is the file id linked to a controller group?਀ऀ    ⠀匀䔀䰀䔀䌀吀 挀昀最氀⸀昀椀氀攀开椀搀  
		   FROM xref.controller_file_group_links AS cfgl਀ऀऀ  圀䠀䔀刀䔀 挀昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀开琀漀挀栀攀挀欀⤀ 
		BEGIN਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀夀攀猀✀㬀 
		 SET @user_authentication_reslt_fgef = 'Fail';਀ऀ    䔀一䐀 
	  ELSE  SET @fileiscontrollergroup = 'No';਀ 
਀ 䤀䘀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀  ⴀⴀ 䘀椀氀攀 氀椀猀琀攀搀 椀渀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 漀瘀攀爀爀椀搀攀猀 漀琀栀攀爀 瀀攀爀洀椀猀猀椀漀渀猀 
   BEGIN਀ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀  挀漀渀渀攀挀琀攀搀 甀猀攀爀 匀䤀䐀 椀猀 氀椀渀欀攀搀 琀栀爀漀甀最栀 攀椀琀栀攀爀 瀀愀琀栀眀愀礀 
    IF EXISTS (਀            匀䔀䰀䔀䌀吀 昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀    ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 
              FROM xref.file_group_links AS fgl਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
                ON      fgl.file_group_id ਀ऀऀऀ       㴀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
        INNER JOIN people.function_lists AS fl਀                伀一 昀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
				     = fl.function_list_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
                ON   fl.function_id ਀ऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
        INNER JOIN people.duty_function_sid_links AS dfsl਀                伀一     搀昀⸀昀甀渀挀琀椀漀渀开椀搀  
				   = dfsl.function_id਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                ON dfsl.sid_id ਀ऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
        WHERE fgl.file_id = @fileid_tocheck਀              䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀  
  			      ਀        唀一䤀伀一 
            SELECT fgl.file_group_id  -- Check through people lists਀              䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        INNER JOIN user_restr.file_group_edit_perm_ppl_lst AS fgeppl਀                伀一      昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
				   = fgeppl.file_group_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
                ON  fgeppl.people_list_id ਀ऀऀऀऀ   㴀    瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
        INNER JOIN user_restr.sid_list AS sl਀                伀一   瀀氀⸀猀椀搀开椀搀  
				   = sl.sid_id਀             圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀开琀漀挀栀攀挀欀 
                   AND sl.sid = @usersid਀  ऀऀऀ            
    )਀    䈀䔀䜀䤀一 
        -- If the file is linked to SIDs that include the connected user, set result to Pass਀        匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀昀 㴀 ✀倀愀猀猀✀㬀 
    END਀ 
	-- Check if the file is not linked to any SID਀    䤀䘀  䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀昀 㴀 ✀䘀愀椀氀✀ ⴀⴀ 吀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 匀䤀䐀 栀愀猀 渀漀琀 戀攀攀渀 愀氀爀攀愀搀礀 昀漀甀渀搀 琀漀 戀攀 氀椀渀欀攀搀 
	   AND NOT EXISTS (਀            匀䔀䰀䔀䌀吀 昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀    ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 
              FROM xref.file_group_links AS fgl਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
                ON      fgl.file_group_id ਀ऀऀऀ       㴀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
        INNER JOIN people.function_lists AS fl਀                伀一 昀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
				     = fl.function_list_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
                ON   fl.function_id ਀ऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
        INNER JOIN people.duty_function_sid_links AS dfsl਀                伀一     搀昀⸀昀甀渀挀琀椀漀渀开椀搀  
				   = dfsl.function_id਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                ON dfsl.sid_id ਀ऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
        WHERE fgl.file_id = @fileid_tocheck਀ 
        UNION਀            匀䔀䰀䔀䌀吀 昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 瀀攀漀瀀氀攀 氀椀猀琀猀 
              FROM xref.file_group_links AS fgl਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 
                ON      fgl.file_group_id ਀ऀऀऀऀ   㴀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
        INNER JOIN people.people_lists AS pl਀                伀一  昀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
				   =    pl.people_list_id਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                ON   pl.sid_id ਀ऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
             WHERE fgl.file_id = @fileid_tocheck਀    ⤀ 
    BEGIN਀        ⴀⴀ 䤀昀 琀栀攀 昀椀氀攀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 愀渀礀 甀猀攀爀猀Ⰰ 猀攀琀 爀攀猀甀氀琀 琀漀 倀愀猀猀 
        SET @user_authentication_reslt_fgef = 'Pass';਀    䔀一䐀 
਀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀  ⴀⴀ 䘀椀氀攀 氀椀猀琀攀搀 椀渀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 漀瘀攀爀爀椀搀攀猀 漀琀栀攀爀 瀀攀爀洀椀猀猀椀漀渀猀 
    -- The result is returned via the OUTPUT parameter਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to edit the metadata of a given file. ਀ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
-- Input is a the id of the file to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
਀  ⴀⴀ 䄀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 昀椀氀攀 椀昀 琀栀攀爀攀 椀猀 愀 挀栀愀椀渀 昀爀漀洀 琀栀攀 昀椀氀攀 䤀䐀 琀栀爀漀甀最栀 
  -- either a function list or a people list to a sid in the sid list which is the sid for the user or a sid the user is a member of.਀  ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 昀椀氀攀 琀栀攀礀 栀愀瘀攀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
  -- except if the file is linked to a controller group, then if the connected user is not part of that group਀  ⴀⴀ 琀栀攀渀 琀栀攀 甀猀攀爀 椀猀 攀砀挀氀甀搀攀搀 昀爀漀洀 攀搀椀琀椀渀最 爀椀最栀琀猀⸀ 
  -- There are two layers of editing permissions.  At one level, controllers are granted exclusive editing਀  ⴀⴀ 瀀攀爀洀椀猀猀椀漀渀猀 戀礀 愀渀 愀甀琀栀漀爀椀猀攀爀Ⰰ 爀攀昀攀爀爀攀搀 琀漀 愀猀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀ 伀琀栀攀爀 挀漀渀琀爀漀氀氀攀爀猀 挀愀渀渀漀琀 愀氀琀攀爀 琀栀漀猀攀 瀀攀爀洀椀猀猀椀漀渀猀⸀ 
  -- At the other level controllers grant editing permissions to editors, referred to as editor level permission.  Controller level permissions਀  ⴀⴀ 攀砀挀氀甀搀攀 愀渀搀 漀瘀攀爀爀椀搀攀 愀渀礀 攀搀椀琀漀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  䄀 挀漀渀琀爀漀氀氀攀爀 挀愀渀渀漀琀 搀攀氀攀最愀琀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ 
	@file_id_to_check_ep bigint = NULL,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@view_permission  nvarchar(10)     = NULL,਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀Ⰰ 
		@fileiscontrollergroup nvarchar(5) = NULL;		; ਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀  㴀 ✀䘀愀椀氀✀ 
਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
  -- Check if the user has viewing permission for the file.਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀 
         @file_id_to_check = @file_id_to_check_ep,਀ऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀 伀唀吀倀唀吀㬀 
਀   䤀䘀 䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀 㴀 ✀倀愀猀猀✀ ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
    BEGIN ਀       
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;਀ 
਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⴀⴀ 䤀猀 琀栀攀 昀椀氀攀 椀搀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀㼀 
	    (SELECT cfgl.file_id ਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 挀昀最氀 
		  WHERE cfgl.file_id = @file_id_to_check_ep)਀ऀ  匀䔀吀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀夀攀猀✀ 
	  ELSE SET @fileiscontrollergroup = 'No';਀ 
਀ऀ  䤀䘀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀夀攀猀✀ ⴀⴀ 䤀昀 琀栀攀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀Ⰰ 琀攀猀琀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀 琀栀愀琀 最爀漀甀瀀 愀渀搀 椀猀 愀氀猀漀 愀 挀漀渀琀爀漀氀氀攀爀 
	  BEGIN ਀ऀऀ䤀䘀 ⠀䔀堀䤀匀吀匀  
			  (SELECT sl.sid_id਀ऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			LEFT JOIN user_restr.controller_file_grp_sid_links AS cfgsl਀ऀऀऀऀ   伀一      猀氀⸀猀椀搀开椀搀 
					  = cfgsl.sid_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 挀昀最渀  
				   ON  cfgsl.controller_file_group_name_id਀ऀऀऀऀऀ  㴀 挀昀最渀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
			LEFT JOIN xref.controller_file_group_links AS cfgl਀ऀऀऀऀ   伀一   挀昀最渀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
					  = cfgl.controller_file_group_name_id਀ऀ ऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀   ऀऀऀ       
				  AND cfgl.file_id = @file_id_to_check_ep))਀ऀऀ    䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 
		 SET @user_authentication_result_fep = 'Pass';਀ऀऀ 䔀䰀匀䔀 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 ✀䘀愀椀氀✀㬀 
	 END਀ऀ 䔀䰀匀䔀 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 ✀倀愀猀猀✀㬀 
਀ऀ  ⴀⴀ 䤀昀 琀栀攀 昀椀氀攀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 琀栀攀渀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 
	  -- rights to any file they have viewing rights to. ਀ 
	  IF @fileiscontrollergroup = 'No' AND @user_authentication_result_fep = 'Pass' -- The user is not excluded by controller level restrictions਀ऀ  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 攀砀挀氀甀搀攀搀 戀礀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀猀 戀甀琀 琀栀攀 昀椀氀攀 椀猀 渀漀琀 瀀愀爀琀 漀昀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 琀栀攀渀 瀀攀爀洀椀猀猀椀漀渀 眀椀氀氀 戀攀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀椀猀 猀攀最洀攀渀琀⸀ 
		 BEGIN -- Check if the user is linked to the file group through either a function list or a people list਀ऀऀ   䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 ✀倀愀猀猀✀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 愀琀 琀栀椀猀 猀琀攀瀀 琀栀攀渀 琀栀攀礀 愀爀攀 最爀愀渀琀攀搀 瀀攀爀洀椀猀猀椀漀渀 
		   ELSE -- User is not a controller and is not excluded by controller level permissions਀ऀऀ    䈀䔀䜀䤀一 
			  IF  ਀ऀऀऀऀ     ⠀䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀    ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 
					           FROM base.file_metadata AS fm਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
						            ON    fm.file_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀最氀⸀昀椀氀攀开椀搀 
						  LEFT JOIN xref.file_group_names AS fgn਀ऀऀऀऀऀऀ            伀一   昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
									   = fgn.file_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 
						            ON      fgn.file_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
						  LEFT JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ            伀一 昀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   =  fln.function_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						            ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						  LEFT JOIN people.duty_functions AS df਀ऀऀऀऀऀऀ            伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   = df.function_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						            ON     df.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一 搀昀猀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 
									AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀ           
                    UNION ALL਀ऀऀऀऀ            ⠀匀䔀䰀䔀䌀吀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀  ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 瀀攀漀瀀氀攀 氀椀猀琀猀 
					           FROM base.file_metadata AS fm਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
						            ON    fm.file_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀最氀⸀昀椀氀攀开椀搀 
						  LEFT JOIN xref.file_group_names AS fgn਀ऀऀऀऀऀऀ            伀一   昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
									   = fgn.file_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 
						            ON      fgn.file_group_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
						  LEFT JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ            伀一 昀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   =  pln.people_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						            ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一   瀀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 
									 AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀ         ⤀⤀⤀  
					਀ऀऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					  SET @user_authentication_result_fep = 'Pass';਀ऀऀऀऀऀ䔀一䐀 
				ELSE਀ऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 ✀䘀愀椀氀✀㬀 ⴀⴀ 吀栀攀 甀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀ 
		END -- END ELSE IF @fileiscontrollergroup = 'Yes'਀ऀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀昀椀氀攀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 㴀 ✀一漀✀ 䄀一䐀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 ✀倀愀猀猀✀  
  END  --IF @view_permission = 'Pass' -- The user has viewing permission for the file਀   
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_fl_grp_ed_pm]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀      匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-01-2024਀⼀⨀ 
 Description: Check if the connected user has edit permission for a given file group.਀ 䌀栀攀挀欀猀 椀昀 琀栀攀爀攀 椀猀 愀渀礀 氀椀渀欀 昀爀漀洀 琀栀攀 昀椀氀攀 最爀漀甀瀀 琀栀爀漀甀最栀 琀漀 琀栀攀 匀䤀䐀 氀椀猀琀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ 
 Output is a user authentication status indicating 'Pass' or 'Fail'.਀⨀⼀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䌀栀攀挀欀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀开琀漀挀栀攀挀欀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀瀀  渀挀栀愀爀⠀㄀　⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀⸀  吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀氀椀攀猀 漀渀 琀栀攀 挀愀氀氀椀渀最 瀀爀漀挀攀搀甀爀攀 琀漀 瘀愀氀椀搀愀琀攀 琀栀攀 椀渀瀀甀琀 搀愀琀愀 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 吀栀攀爀攀 洀甀猀琀 戀攀 愀渀 攀砀椀猀琀椀渀最 爀攀挀漀爀搀 眀椀琀栀 愀 洀愀琀挀栀椀渀最 䀀昀椀氀攀最爀漀甀瀀椀搀开琀漀挀栀攀挀欀⸀ 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns an output value.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_fl_grp_ed_pm] ਀ 
    @filegroupid_tocheck                     bigint,਀    䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀瀀  渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
    SET NOCOUNT ON;਀ 
    -- Declare variables਀    䐀䔀䌀䰀䄀刀䔀 䀀甀猀攀爀猀椀搀  瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀ 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀    ⴀⴀ 䐀攀昀愀甀氀琀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 爀攀猀甀氀琀 琀漀 倀愀猀猀 
    SET @user_authentication_reslt_fgep = 'Fail';਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀  挀漀渀渀攀挀琀攀搀 甀猀攀爀 匀䤀䐀 椀猀 氀椀渀欀攀搀 琀栀爀漀甀最栀 攀椀琀栀攀爀 瀀愀琀栀眀愀礀 
    IF EXISTS (਀            匀䔀䰀䔀䌀吀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀    ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 
              FROM user_restr.file_group_edit_perm_funct_lst AS fgepfl਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
                ON fgepfl.function_list_id ਀ऀऀऀऀ     㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
        INNER JOIN people.duty_functions AS df਀                伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀  
				   = df.function_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
                ON     df.function_id ਀ऀऀऀऀ   㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
        INNER JOIN user_restr.sid_list AS sl਀                伀一 搀昀猀氀⸀猀椀搀开椀搀  
				   = sl.sid_id਀             圀䠀䔀刀䔀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀㴀 䀀昀椀氀攀最爀漀甀瀀椀搀开琀漀挀栀攀挀欀 
		           AND sl.sid = @usersid ਀  ऀऀऀ             
        UNION਀            匀䔀䰀䔀䌀吀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 瀀攀漀瀀氀攀 氀椀猀琀猀 
              FROM user_restr.file_group_edit_perm_ppl_lst AS fgeppl਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
                ON  fgeppl.people_list_id ਀ऀऀऀऀ   㴀    瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
        INNER JOIN user_restr.sid_list AS sl਀                伀一   瀀氀⸀猀椀搀开椀搀  
				   = sl.sid_id਀             圀䠀䔀刀䔀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀㴀 䀀昀椀氀攀最爀漀甀瀀椀搀开琀漀挀栀攀挀欀 
		           AND sl.sid = @usersid਀  ऀऀऀ         
    )਀    䈀䔀䜀䤀一 
        -- If the file is linked to SIDs that include the connected user, set result to Pass਀        匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀氀琀开昀最攀瀀 㴀 ✀倀愀猀猀✀㬀 
    END਀ 
਀ 
    -- The result is returned via the OUTPUT parameter਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开戀爀开琀爀攀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to edit a given tag browsing tree. ਀ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
-- Input is a the id of the tag tree to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
਀ 
  -- A user has permission to edit a tag browsing tree if there is a chain from the tag browsing tree ID through਀  ⴀⴀ 攀椀琀栀攀爀 愀 昀甀渀挀琀椀漀渀 氀椀猀琀 漀爀 愀 瀀攀漀瀀氀攀 氀椀猀琀 琀漀 愀 猀椀搀 椀渀 琀栀攀 猀椀搀 氀椀猀琀 眀栀椀挀栀 椀猀 琀栀攀 猀椀搀 昀漀爀 琀栀攀 甀猀攀爀 漀爀 愀 猀椀搀 琀栀攀 甀猀攀爀 椀猀 愀 洀攀洀戀攀爀 漀昀⸀ 
  -- If the user is a controller then they have rights to any tag tree by default. ਀  ⴀⴀ 吀栀攀 甀猀攀爀 愀氀猀漀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 椀昀 琀栀攀 琀爀攀攀 椀猀 氀椀渀欀攀搀 搀椀爀攀挀琀氀礀 琀漀 琀栀攀 匀䤀䐀开䤀䐀 瘀椀愀 琀栀攀 猀椀搀开椀搀 挀漀氀甀洀渀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_tag_br_tree] ਀ 
	@tag_brtreeid_ep bigint = NULL,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@iscontroller nvarchar(5)          = NULL;਀ 
  -- Parameters which have been initialised at declaration but not explicitly set will be output as null to calling functions.਀  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀  㴀 ✀䘀愀椀氀✀ 
਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;਀      ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 琀愀最 最爀漀甀瀀  
਀ 
		 IF @iscontroller = 'Pass' SET @user_authentication_result_bt = 'Pass'  -- If the user is a controller at this step then they are granted permission਀ 
         IF @user_authentication_result_bt <> 'Pass'   -- User is not a controller           ਀ऀऀ    䈀䔀䜀䤀一 
			  IF  ਀ऀऀऀ        ⠀䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 䄀匀 猀椀搀 
					           FROM tagging.tag_browsing_tree_names AS tbtn਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀戀琀瀀昀 
						         ON    tbtn.tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ    㴀 琀戀琀瀀昀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
						 INNER JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ            伀一   琀戀琀瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   =   fln.function_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						            ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 INNER JOIN people.duty_functions AS df਀ऀऀऀऀऀऀ            伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   = df.function_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						            ON  dfsl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一 搀昀猀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开戀爀琀爀攀攀椀搀开攀瀀 
									AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀ          
                     UNION ALL਀ 
					        (SELECT sl.sid_id AS sid਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀㈀ 
						 INNER JOIN user_restr.tag_br_tree_permissions_plist AS tbtpp਀ऀऀऀऀऀऀ         伀一   琀戀琀渀㈀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
								    = tbtpp.tag_browsing_tree_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
						            ON   tbtpp.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN people.people_lists AS pl਀ऀऀऀऀऀऀ            伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   = pl.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON   pl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE tbtn2.tag_browsing_tree_id = @tag_brtreeid_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ))) ਀ 
					BEGIN  -- The user has permission for this action਀ऀऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 㴀 ✀倀愀猀猀✀㬀 
					END਀ऀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 㰀㸀 ✀倀愀猀猀✀ 
਀ 
     -- Check if the user is linked directly to the given browsing tree ID.਀     䤀䘀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 㰀㸀 ✀倀愀猀猀✀   
	 AND EXISTS ( SELECT tbtn.tag_browsing_tree_id   ਀ऀऀऀऀ    䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
			  INNER JOIN user_restr.sid_list AS sl਀ऀऀऀ  ऀ      伀一  琀戀琀渀⸀猀椀搀开椀搀 
						  =  sl.sid_id਀ऀऀऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
				     AND tbtn.tag_browsing_tree_id਀ऀऀऀऀऀ     㴀 䀀琀愀最开戀爀琀爀攀攀椀搀开攀瀀 
  				         )਀ऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
				SET @user_authentication_result_bt = 'Pass';਀ऀऀऀ䔀一䐀 
਀ 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开攀搀椀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to edit a given tag. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀栀攀 椀搀 漀昀 琀栀攀 琀愀最 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀ 
  -- A user has permission for a tag if either there are no chain from the tag group ID through to any user, ਀  ⴀⴀ 漀爀 椀昀 琀栀攀 琀愀最 椀猀 氀椀渀欀攀搀 琀漀 愀 琀愀最 最爀漀甀瀀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
  -- If the user is a controller then they have rights to edit any tag by default. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开攀搀椀琀崀  
਀ऀ䀀琀愀最开椀搀开攀瀀 戀椀最椀渀琀 㴀 一唀䰀䰀Ⰰ 
	@user_authentication_result_tag nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL, -- The SID of the connected user਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 眀椀氀氀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @user_authentication_result_tag  = 'Fail'਀ 
  SET @usersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀ 
਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
      -- If user is a controller then they have editing rights to any tag group ਀ 
		 IF @iscontroller = 'Pass' SET @user_authentication_result_tag = 'Pass'  -- If the user is a controller at this step then they are granted permission਀ 
		 IF @user_authentication_result_tag <> 'Pass' AND  -- User is not a controller.  If there are no tag groups linked then pass.਀              一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
		                    FROM tagging.tag_to_tag_group_links AS tttgl਀ऀऀऀऀ  ऀऀ   圀䠀䔀刀䔀 琀琀琀最氀⸀琀愀最开椀搀 
						         =    @tag_id_ep)਀ऀऀऀ  䈀䔀䜀䤀一 
			    SET @user_authentication_result_tag = 'Pass'਀ऀऀऀ  䔀一䐀 
਀ऀ ⴀⴀ 䤀昀 琀栀攀爀攀 愀爀攀 渀漀 甀猀攀爀猀 氀椀渀欀攀搀 琀漀 琀栀攀 琀愀最 琀栀爀漀甀最栀 愀 琀愀最 最爀漀甀瀀 琀栀攀渀 瀀愀猀猀 
		 IF @user_authentication_result_tag <> 'Pass' AND਀ऀऀ   一伀吀 䔀堀䤀匀吀匀 ⠀ ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀  
		                   FROM tagging.doc_tags AS dt਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 䄀匀 琀琀琀最氀 
					         ON      dt.tag_id਀ऀऀऀऀऀऀऀ    㴀 琀琀琀最氀⸀琀愀最开椀搀 
					 INNER JOIN tagging.tag_group_identifier_names AS tgin਀ऀऀऀऀऀ         伀一    琀琀琀最氀⸀琀愀最开最爀漀甀瀀开椀搀 
							    = tgin.tag_group_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀最瀀昀 
					 		 ON   tgin.tag_group_id਀ऀऀऀऀऀऀऀ    㴀 琀最瀀昀⸀琀愀最开最爀漀甀瀀开椀搀 
					 INNER JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀऀ 伀一   琀最瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
								=  fln.function_list_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
							 ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀ㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					 INNER JOIN people.duty_functions AS df਀ऀऀऀऀऀऀऀ 伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
								= df.function_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
							 ON  dfsl.function_id਀ऀऀऀऀऀऀऀऀ㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
					 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀ 伀一 搀昀猀氀⸀猀椀搀开椀搀 
								= sl.sid_id ਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀琀⸀琀愀最开椀搀 㴀 䀀琀愀最开椀搀开攀瀀 
਀ऀऀऀऀऀ唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀  
		                   FROM tagging.doc_tags AS dt2਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 䄀匀 琀琀琀最氀㈀ 
					         ON      dt2.tag_id਀ऀऀऀऀऀऀऀ    㴀 琀琀琀最氀㈀⸀琀愀最开椀搀 
					 INNER JOIN tagging.tag_group_identifier_names AS tgin2਀ऀऀऀऀऀ         伀一    琀琀琀最氀㈀⸀琀愀最开最爀漀甀瀀开椀搀 
							    = tgin2.tag_group_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀最瀀瀀 
					 		 ON   tgin2.tag_group_id਀ऀऀऀऀऀऀऀऀ㴀 琀最瀀瀀⸀琀愀最开最爀漀甀瀀开椀搀 
					 INNER JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀऀ 伀一   琀最瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
								=  pln.people_list_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
							 ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀ㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀ 伀一   瀀氀⸀猀椀搀开椀搀 
								= sl.sid_id਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 搀琀㈀⸀琀愀最开椀搀 㴀 䀀琀愀最开椀搀开攀瀀ऀऀऀऀऀऀऀऀऀ 
								))) ਀ ऀऀऀऀ  䈀䔀䜀䤀一 
					SET @user_authentication_result_tag = 'Pass'਀ऀऀऀऀ  䔀一䐀           
਀ 
    -- If the user is linked through to the tag through a tag group then pass਀ऀ䤀䘀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㰀㸀 ✀倀愀猀猀✀ 䄀一䐀 
              EXISTS ( (SELECT sl.sid_id ਀ऀऀ                   䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
					 INNER JOIN tagging.tag_to_tag_group_links AS tttgl਀ऀऀऀऀऀ         伀一      搀琀⸀琀愀最开椀搀 
							    = tttgl.tag_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最椀渀 
					         ON    tttgl.tag_group_id਀ऀऀऀऀऀऀऀ    㴀 琀最椀渀⸀琀愀最开最爀漀甀瀀开椀搀 
					 INNER JOIN user_restr.tag_group_permissions_flist AS tgpf਀ऀऀऀऀऀ ऀऀ 伀一   琀最椀渀⸀琀愀最开最爀漀甀瀀开椀搀 
							    = tgpf.tag_group_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
							 ON   tgpf.function_list_id਀ऀऀऀऀऀऀऀऀ㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
					 INNER JOIN people.function_lists AS fl਀ऀऀऀऀऀऀऀ 伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
								= fl.function_list_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
							 ON   fl.function_id਀ऀऀऀऀऀऀऀऀ㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
					 INNER JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀऀऀ 伀一  搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
								=  df.function_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
							 ON dfsl.sid_id਀ऀऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
						WHERE dt.tag_id = @tag_id_ep਀ऀऀऀऀऀऀऀ  䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  								਀ऀऀऀऀऀ唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀  
		                   FROM tagging.doc_tags AS dt2਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 䄀匀 琀琀琀最氀㈀ 
					         ON      dt2.tag_id਀ऀऀऀऀऀऀऀ    㴀 琀琀琀最氀㈀⸀琀愀最开椀搀 
					 INNER JOIN tagging.tag_group_identifier_names AS tgin2਀ऀऀऀऀऀ         伀一    琀琀琀最氀㈀⸀琀愀最开最爀漀甀瀀开椀搀 
							    = tgin2.tag_group_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀最瀀瀀 
					 		 ON   tgin2.tag_group_id਀ऀऀऀऀऀऀऀऀ㴀 琀最瀀瀀⸀琀愀最开最爀漀甀瀀开椀搀 
					 INNER JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀऀ 伀一   琀最瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
								=  pln.people_list_id਀ऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
							 ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀ㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
					 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀ 伀一   瀀氀⸀猀椀搀开椀搀 
								= sl.sid_id਀ऀऀऀऀऀऀ圀䠀䔀刀䔀 搀琀㈀⸀琀愀最开椀搀 㴀 䀀琀愀最开椀搀开攀瀀 
									AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀऀऀ⤀⤀⤀  
 				  ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					SET @user_authentication_result_tag = 'Pass';਀ऀऀऀऀ䔀一䐀 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to link tags to a given tag group. ਀ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀猀 昀愀椀氀 椀昀 琀栀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀ 
-- Input is a the id of the tag group to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
਀ⴀⴀ 吀栀椀猀 椀猀 甀猀攀搀 琀漀 愀甀琀栀攀渀琀椀挀愀琀攀 愀 甀猀攀爀 昀漀爀 氀椀渀欀椀渀最 琀愀最猀 琀漀 愀 琀愀最 最爀漀甀瀀⸀  
਀  ⴀⴀ 䄀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 琀愀最 最爀漀甀瀀 椀昀 琀栀攀爀攀 椀猀 愀 挀栀愀椀渀 昀爀漀洀 琀栀攀 琀愀最 最爀漀甀瀀 䤀䐀 琀栀爀漀甀最栀 
  -- either a function list or a people list to a sid in the sid list which is the sid for the user or a sid the user is a member of.਀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 爀椀最栀琀猀 琀漀 愀渀礀 琀愀最 最爀漀甀瀀 戀礀 搀攀昀愀甀氀琀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_tag_group] ਀ 
	@tag_groupid_ep bigint = NULL,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀最 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@iscontroller nvarchar(5)          = NULL;਀ 
  -- Parameters which have been initialised at declaration but not explicitly set will be output as null to calling functions.਀  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀最  㴀 ✀䘀愀椀氀✀ 
਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;਀      ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 琀愀最 最爀漀甀瀀  
਀ 
		 IF @iscontroller = 'Pass' SET @user_authentication_result_tg = 'Pass'  -- If the user is a controller at this step then they are granted permission਀ऀऀ   䔀䰀匀䔀 ⴀⴀ 唀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀  
		    BEGIN਀ऀऀऀ  䤀䘀   
			        (EXISTS (SELECT sl.sid_id AS sid਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最椀渀 
						 INNER JOIN user_restr.tag_group_permissions_flist AS tgpf਀ऀऀऀऀऀऀ         伀一   琀最椀渀⸀琀愀最开最爀漀甀瀀开椀搀 
								    = tgpf.tag_group_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						            ON   tgpf.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 INNER JOIN people.function_lists AS fl਀ऀऀऀऀऀऀ            伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   = fl.function_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
						            ON   fl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀऀ            伀一  搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   =  df.function_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON dfsl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE tgin.tag_group_id = @tag_groupid_ep਀ऀऀऀऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ਀                     唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀऀऀ        ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 䄀匀 猀椀搀 
					           FROM tagging.tag_group_identifier_names AS tgin2਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀最瀀瀀 
						         ON   tgin2.tag_group_id਀ऀऀऀऀऀऀऀऀ    㴀 琀最瀀瀀⸀琀愀最开最爀漀甀瀀开椀搀 
						 INNER JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ            伀一   琀最瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   =  pln.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						            ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一   瀀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀 㴀 䀀琀愀最开最爀漀甀瀀椀搀开攀瀀 
									 AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀ         ⤀⤀⤀  
਀ऀऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					  SET @user_authentication_result_tg = 'Pass';਀ऀऀऀऀऀ䔀一䐀 
				ELSE਀ऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀最 㴀 ✀䘀愀椀氀✀㬀 ⴀⴀ 吀栀攀 甀猀攀爀 椀猀 渀漀琀 愀 䌀漀渀琀爀漀氀氀攀爀 愀渀搀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀ 
਀ऀ 䔀一䐀 ⴀⴀ 䔀一䐀 䔀䰀匀䔀 䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀最 㴀 ✀倀愀猀猀✀ 
਀    
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_tag_tree]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 琀漀 攀搀椀琀 愀 最椀瘀攀渀 琀愀最 琀爀攀攀⸀  
-- Also returns fail if the id does not exist.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀栀攀 椀搀 漀昀 琀栀攀 琀愀最 琀爀攀攀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀ 
਀  ⴀⴀ 䄀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 琀愀最 琀爀攀攀 椀昀 琀栀攀爀攀 椀猀 愀 挀栀愀椀渀 昀爀漀洀 琀栀攀 琀愀最 琀爀攀攀 䤀䐀 琀栀爀漀甀最栀 
  -- either a function list or a people list to a sid in the sid list which is the sid for the user or a sid the user is a member of.਀  ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 爀椀最栀琀猀 琀漀 愀渀礀 琀愀最 琀爀攀攀 戀礀 搀攀昀愀甀氀琀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_tag_tree] ਀ 
	@tag_treeid_ep bigint = NULL,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@iscontroller nvarchar(5)          = NULL;਀ 
  -- Parameters which have been initialised at declaration but not explicitly set will be output as null to calling functions.਀  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀琀  㴀 ✀䘀愀椀氀✀ 
਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;਀      ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 琀愀最 最爀漀甀瀀  
਀ 
		 IF @iscontroller = 'Pass' SET @user_authentication_result_tt = 'Pass'  -- If the user is a controller at this step then they are granted permission਀ऀऀ   䔀䰀匀䔀 ⴀⴀ 唀猀攀爀 椀猀 渀漀琀 愀 挀漀渀琀爀漀氀氀攀爀  
		    BEGIN਀ऀऀऀ  䤀䘀   
			        (EXISTS (SELECT sl.sid_id AS sid਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀 
						 INNER JOIN user_restr.tag_tree_permissions_flist AS ttpf਀ऀऀऀऀऀऀ         伀一    琀琀渀⸀琀愀最开琀爀攀攀开椀搀 
								    = ttpf.tag_tree_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						            ON   ttpf.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 INNER JOIN people.function_lists AS fl਀ऀऀऀऀऀऀ            伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   = fl.function_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
						            ON   fl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀऀ            伀一  搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   =  df.function_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON dfsl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE ttn.tag_tree_id = @tag_treeid_ep਀ऀऀऀऀऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀 
  							         ਀                     唀一䤀伀一 䄀䰀䰀 
਀ऀऀऀऀऀ        ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 䄀匀 猀椀搀 
					           FROM tagging.tag_tree_names AS ttn2਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀琀瀀瀀 
						         ON   ttn2.tag_tree_id਀ऀऀऀऀऀऀऀऀ    㴀 琀琀瀀瀀⸀琀愀最开琀爀攀攀开椀搀 
						 INNER JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ            伀一   琀琀瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   =  pln.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						            ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一   瀀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 琀琀渀㈀⸀琀愀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀椀搀开攀瀀 
									 AND sl.sid = @usersid਀  ऀऀऀऀऀऀऀ         ⤀⤀⤀  
਀ऀऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
					  SET @user_authentication_result_tt = 'Pass';਀ऀऀऀऀऀ䔀一䐀 
				ELSE਀ऀऀऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀琀 㴀 ✀䘀愀椀氀✀㬀 ⴀⴀ 吀栀攀 甀猀攀爀 椀猀 渀漀琀 愀 䌀漀渀琀爀漀氀氀攀爀 愀渀搀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀⸀ 
਀ऀ 䔀一䐀 ⴀⴀ 䔀一䐀 䔀䰀匀䔀 䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀琀 㴀 ✀倀愀猀猀✀ 
਀    
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_user_doc_grp]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 琀漀 瘀椀攀眀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀     
-- Also returns fail if the id does not exist.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀栀攀 椀搀 漀昀 琀栀攀 昀漀爀洀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_user_doc_grp] ਀ 
	@docgroupid_to_check_vp bigint,਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 渀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀㬀 ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
 -- Check if the user does not have permission਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀  ⴀⴀ 唀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀昀 攀椀琀栀攀爀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀 
  -- the document group via doc_group_view_permissions or the document group exists but is not਀  ⴀⴀ 氀椀渀欀攀搀 琀漀 愀渀礀 甀猀攀爀猀 瘀椀愀 搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀⸀ 
      ਀  䤀䘀 一伀吀  
		 (EXISTS (SELECT dgvp.sid_id AS dgvpsid  -- Check if the user is linked to the document group਀ऀऀऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
			 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀ伀一 搀最瘀瀀⸀猀椀搀开椀搀 
						   = sl.sid_id਀ऀऀऀऀ  圀䠀䔀刀䔀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀 
						 AND sl.sid = @usersid਀ऀऀऀऀऀऀ ⤀  
					 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 愀渀礀 甀猀攀爀 
		  OR NOT EXISTS (SELECT dgvp.sid_id AS dgvpsid  ਀ऀऀऀऀऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
				  WHERE dgvp.doc_group_id = @docgroupid_to_check_vp))਀ऀ 
	  -- Fail if the id does not exist		  ਀ऀ  伀刀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 䄀匀 搀最椀 
	                   FROM xref.doc_group_names AS dgn਀ऀऀऀऀऀ圀䠀䔀刀䔀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 䀀搀漀挀最爀漀甀瀀椀搀开琀漀开挀栀攀挀欀开瘀瀀⤀ 
					     ਀ 
		BEGIN  -- The user does not have permission for this action਀ऀऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀㬀 
		END਀ऀ䔀䰀匀䔀 
	  SET @user_authentication_result = 'Pass';਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to access a given document. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀栀攀 椀搀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_user_doc_id] ਀ 
	@doc_id_to_check nvarchar(50),਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀㬀 ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
 -- Check if the user does not have permission਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
     -- Check if the connected user has permission to access the document ਀ 
		IF EXISTS (਀ऀऀऀ匀䔀䰀䔀䌀吀 搀椀氀⸀搀漀挀开椀搀 
			FROM base.document_id_list AS dil਀ऀऀऀ圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 
			  AND (਀ऀऀऀऀ  ⴀⴀ 䌀愀猀攀 ㄀㨀 一漀 最爀漀甀瀀 氀椀渀欀猀 
				  NOT EXISTS (਀ऀऀऀऀऀ  匀䔀䰀䔀䌀吀 搀最氀⸀搀漀挀开椀搀 
					  FROM xref.doc_group_links AS dgl਀ऀऀऀऀऀ  圀䠀䔀刀䔀 搀最氀⸀搀漀挀开椀搀 㴀 搀椀氀⸀搀漀挀开椀搀 
				  )਀           
				  -- Case 2: Group links exist, but no SIDs਀ऀऀऀऀ  伀刀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
					  SELECT dgvp.doc_group_id਀ऀऀऀऀऀ    䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
					  LEFT JOIN xref.doc_group_names AS dgn਀ऀऀऀऀऀऀ     伀一 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
					 INNER JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀऀऀऀ     伀一 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 㴀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
					      WHERE dgl.doc_id = dil.doc_id਀ऀऀऀऀ  ⤀ 
          ਀ऀऀऀऀ  ⴀⴀ 䌀愀猀攀 ㌀㨀 唀猀攀爀✀猀 匀䤀䐀 椀猀 攀砀瀀氀椀挀椀琀氀礀 瀀攀爀洀椀琀琀攀搀 
				  OR EXISTS (਀ऀऀऀऀऀ  匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
					  FROM xref.doc_group_links AS dgl਀ऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
						     ON dgl.doc_group_id = dgn.doc_group_id਀ऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
						     ON dgn.doc_group_id = dgvp.doc_group_id਀ऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						     ON dgvp.sid_id = sl.sid_id਀ऀऀऀऀऀ      圀䠀䔀刀䔀 搀最氀⸀搀漀挀开椀搀 㴀 搀椀氀⸀搀漀挀开椀搀 
						    AND sl.sid = @usersid਀ऀऀऀऀ  ⤀ 
			  )਀ऀऀ⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
			END਀ऀऀ䔀䰀匀䔀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
 ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_user_file_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀　ⴀ㈀　㈀㌀ 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 琀漀 愀挀挀攀猀猀 愀 最椀瘀攀渀 昀椀氀攀⸀  䘀椀氀攀 愀挀挀攀猀猀 椀猀 挀漀渀猀琀爀愀椀渀攀搀 瘀椀愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀⸀  
-- Input is a the id of the file to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
਀ऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 戀椀最椀渀琀Ⰰ 
	@user_authentication_result nvarchar(10) OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)            = NULL; -- The SID of the connected user਀ 
਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 
  SET @usersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀     ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀  
਀ऀऀ䤀䘀 ⠀ 
			EXISTS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 
				  FROM base.file_metadata AS fm਀ऀऀऀऀ 圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 
			)਀ऀऀऀ䄀一䐀 ⠀ 
				-- Case 1: File is not linked to any document਀ऀऀऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
					SELECT ftdl.file_id਀ऀऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 昀琀搀氀 
					 WHERE ftdl.file_id = @file_id_to_check਀ऀऀऀऀ⤀ 
਀ऀऀऀऀⴀⴀ 䌀愀猀攀 ㈀㨀 䰀椀渀欀攀搀 搀漀挀甀洀攀渀琀 栀愀猀 渀漀 最爀漀甀瀀 
				OR NOT EXISTS (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 搀最氀⸀搀漀挀开椀搀 
					FROM xref.file_to_document_links AS ftdl਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
						   ON ftdl.doc_id = dgl.doc_id਀ऀऀऀऀऀ    圀䠀䔀刀䔀 昀琀搀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 
					      AND dgl.doc_group_id IS NOT NULL਀ऀऀऀऀ⤀ 
਀ऀऀऀऀⴀⴀ 䌀愀猀攀 ㌀㨀 䜀爀漀甀瀀 攀砀椀猀琀猀Ⰰ 戀甀琀 栀愀猀 渀漀 瀀攀爀洀椀猀猀椀漀渀 匀䤀䐀猀 
				OR NOT EXISTS (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 搀最瘀瀀⸀猀椀搀开椀搀 
					FROM xref.file_to_document_links AS ftdl਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
						   ON ftdl.doc_id = dgl.doc_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
						   ON dgl.doc_group_id = dgn.doc_group_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
						   ON dgn.doc_group_id = dgvp.doc_group_id਀ऀऀऀऀऀ    圀䠀䔀刀䔀 昀琀搀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 
					     AND dgvp.sid_id IS NOT NULL਀ऀऀऀऀ⤀ 
਀ऀऀऀऀⴀⴀ 䌀愀猀攀 㐀㨀 唀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
				OR EXISTS (਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀 
					FROM xref.file_to_document_links AS ftdl਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
						   ON ftdl.doc_id = dgl.doc_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
						   ON dgl.doc_group_id = dgn.doc_group_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
						   ON dgn.doc_group_id = dgvp.doc_group_id਀ऀऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						   ON dgvp.sid_id = sl.sid_id਀ऀऀऀऀऀ    圀䠀䔀刀䔀 昀琀搀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 
					      AND sl.sid = @usersid਀ऀऀऀऀ⤀ 
			)਀ऀऀ⤀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
			END਀ऀऀ䔀䰀匀䔀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
  ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_user_form]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 琀漀 愀氀琀攀爀 愀 最椀瘀攀渀 昀漀爀洀⸀  
-- Input is a the id of the form to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀漀爀洀崀  
਀ऀ䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 戀椀最椀渀琀Ⰰ 
	@user_authentication_result nvarchar(10) OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀爀漀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Configurator',  -- Configurator has rights to all forms. ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀爀漀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
਀  䤀䘀 䀀爀漀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀  ⴀⴀ 唀猀攀爀 椀猀 渀漀琀 愀 䌀漀渀昀椀最甀爀愀琀漀爀 
    BEGIN਀ 
 -- Check if the user does not have permission਀     ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀漀爀洀 椀猀 氀椀渀欀攀搀 琀漀 愀 昀漀爀洀 漀眀渀攀爀  
	 -- and the form owner is the connected user. ਀  䤀䘀 一伀吀  
     (EXISTS (SELECT fo.sid_id AS fis  ਀               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 䄀匀 昀漀 
	     INNER JOIN forms.form_group_names AS fgn਀ऀऀ            伀一 昀漀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
			        = fgn.form_group_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
		            ON fo.form_group_id਀ऀऀऀऀऀ㴀 昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
		 INNER JOIN user_restr.sid_list AS sl਀ऀऀ            伀一 昀漀⸀猀椀搀开椀搀 
					   = sl.sid_id਀ऀऀऀ  圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀开椀搀开琀漀开挀栀攀挀欀 
			         AND sl.sid = @connectedusersid਀ऀऀऀ         ⤀  
					 ਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀漀爀洀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 愀渀礀 昀漀爀洀 漀眀渀攀爀 
      OR NOT EXISTS (SELECT fo.sid_id AS fis  ਀                       䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 䄀匀 昀漀 
	             INNER JOIN forms.form_group_names AS fgn਀ऀऀ                 伀一  昀漀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
			              = fgn.form_group_id਀ऀऀ         䤀一一䔀刀 䨀伀䤀一 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
		                 ON  fo.form_group_id ਀ऀऀऀऀऀऀ  㴀 昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
			          WHERE fin.form_id = @form_id_to_check))਀ऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		  SET @user_authentication_result = 'Fail';਀ऀऀ䔀一䐀 
	ELSE਀ऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
   END -- END IF @roleauthenticationresult = 'Fail'਀  䔀䰀匀䔀 ⴀⴀ 唀猀攀爀 椀猀 愀 䌀漀渀昀椀最甀爀愀琀漀爀 
    SET @user_authentication_result = 'Pass';਀   
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- for a given role. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 爀漀氀攀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_user_role] ਀ 
	@role_to_check nvarchar(50) = '',਀ऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀            㴀 一唀䰀䰀㬀 ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
 -- Check if the user has permission਀  匀䔀吀 䀀甀猀攀爀猀椀搀 㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀 ⴀⴀ 刀攀愀搀 琀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
  IF EXISTS (SELECT sl.sid_id AS si  ਀               䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	     INNER JOIN user_restr.user_role_link AS urlk਀ऀऀ         伀一 甀爀氀欀⸀猀椀搀开椀搀 
			        = sl.sid_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀爀漀氀攀开氀椀猀琀 䄀匀 爀氀 
		         ON urlk.role_name਀ऀऀऀ        㴀 爀氀⸀爀漀氀攀开渀愀洀攀 
			  WHERE rl.role_name  = @role_to_check਀ऀऀऀ   䄀一䐀  猀氀⸀猀椀搀 㴀 䀀甀猀攀爀猀椀搀   
			   )  ਀ऀऀ          
      -- The user has permission for this action਀      匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
  ELSE਀ऀ  匀䔀吀 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀㬀  
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 
-- to access a given workflow instance step ID according to the associated document ID. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀栀攀 椀搀 漀昀 琀栀攀 猀琀攀瀀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Pass' or 'Fail'.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_AUTHENTICATE_wf_inst_step] ਀ 
	@instance_step_to_check bigint,਀ऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀  ऀऀ䀀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@documentid nvarchar(50);਀ 
਀ 
  -- Select the document ID associated with the step਀     匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 眀椀搀⸀搀漀挀开椀搀 
       FROM workflow_instances.workflow_instance_steps AS wis਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 愀猀 眀椀搀 
	     ON   wis.workflow_instance_id਀ऀऀ    㴀 眀椀搀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
	  WHERE wis.workflow_instance_step_id਀ऀ       㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀㬀 
਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
   SET @step_authentication_result = 'Pass';਀  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 攀砀椀猀琀猀 
     BEGIN   -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 				@doc_id_to_check =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
	 END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_AUTHENTICATE_wf_instance]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Checks whether the connected user has permission਀ⴀⴀ 琀漀 愀挀挀攀猀猀 愀 最椀瘀攀渀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀漀挀甀洀攀渀琀 䤀䐀⸀  
-- Input is a the id of the workflow instance to be checked.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 猀琀爀椀渀最 漀昀 ✀倀愀猀猀✀ 漀爀 ✀䘀愀椀氀✀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀愀渀挀攀崀  
਀ऀ䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀 戀椀最椀渀琀Ⰰ 
	@wf_instance_auth_result nvarchar(10) OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  		@usersid varbinary(100)   = NULL, -- The SID of the connected user਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		@docauthenticationstatus nvarchar(10);਀ 
਀ 
  -- Select the document ID associated with the step਀     匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 眀椀搀⸀搀漀挀开椀搀 
       FROM workflow_instances.workflow_instance_definitions as wid਀ऀ  圀䠀䔀刀䔀 眀椀搀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
	       = @wf_instance_to_check;਀ 
  IF @documentid IS NULL਀   匀䔀吀 䀀眀昀开椀渀猀琀愀渀挀攀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
  ELSE -- A doc id exists਀     䈀䔀䜀䤀一   ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
			EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
				@user_authentication_result = @wf_instance_auth_result OUTPUT;਀ऀ 䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开愀甀琀栀漀爀椀猀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀  
-- Date:        11-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Grants authoriser privileges on request from an authoriser pending grant request.   ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀伀刀䤀匀䔀开愀甀琀栀漀爀椀猀攀爀崀  
਀ऀ 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @request_result nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀऀ䀀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀  戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
		@authoriser_sid varbinary(100)       = NULL,਀ऀऀ䀀愀甀琀栀漀爀椀猀攀爀开渀漀琀攀猀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀      㴀 ✀✀㬀   
਀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check if a request_id has been supplied਀ऀऀ 䤀䘀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 㴀 　 
		    SET @grant_request_id = NULL;਀ 
		 IF @grant_request_id IS NULL਀ऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㄀✀㬀 
਀         䔀䰀匀䔀  
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀攀焀甀攀猀琀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀焀甀攀猀琀开椀搀 攀砀椀猀琀猀 愀渀搀 椀猀 愀瀀瀀爀漀瘀攀搀⸀ 
				  				  FROM user_restr.authoriser_privilege_requests ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 
								   AND type = 'Grant'਀ऀऀऀऀऀऀऀऀ   䄀一䐀 猀琀愀琀甀猀 㴀 ✀䄀瀀瀀爀漀瘀攀搀✀⤀  
						 SET @request_result         = 'Fail2';਀ऀऀ   䔀一䐀 
਀ऀऀ   䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
		      BEGIN਀ 
				 IF EXISTS (SELECT apr.sid_id 	     -- Check that the sid_id of the request is not already in the list of authorisers. ਀ऀऀऀऀ   ऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
						INNER JOIN user_restr.authorisers AS a਀ऀऀऀऀऀऀ        伀一            愀瀀爀⸀猀椀搀开椀搀  
								   = a.authoriser_sid_id਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀⤀  
						 SET @request_result         = 'Fail3';਀ऀऀऀ  䔀一䐀 
਀ऀऀ   䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
		     BEGIN਀ऀऀऀऀⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 戀漀琀栀 琀栀攀 愀甀琀栀漀爀椀猀攀爀猀 愀最愀椀渀猀琀 琀栀攀 氀椀猀琀 漀昀 愀甀琀栀漀爀椀猀攀爀猀 愀渀搀 挀栀攀挀欀 琀栀愀琀 琀栀攀礀 愀爀攀 渀漀琀 琀栀攀 猀愀洀攀⸀ 
                  IF NOT EXISTS (SELECT apr.request_id ਀ऀऀऀऀ                   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
							 INNER JOIN user_restr.authorisers AS a਀ऀऀऀऀऀऀ             伀一 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
								        = a.authoriser_sid_id਀                                  圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀⤀ 
					 OR NOT EXISTS (SELECT apr.request_id ਀ऀऀऀऀ                      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
							    INNER JOIN user_restr.authorisers AS a਀ऀऀऀऀऀऀ                伀一 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀ 
								           = a.authoriser_sid_id਀                                     圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀⤀ 
					OR EXISTS (SELECT apr.request_id -- Check that the approvers are not the same਀ऀऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
                                WHERE apr.request_id = @grant_request_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀   愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
								      = apr.approved_by_sid_id_2)								 ਀ 
						 SET @request_result         = 'Fail4';਀               䔀一䐀 
਀ऀऀ   䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
		     BEGIN  -- Re-validate the SID_ID਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
								 FROM user_restr.sid_list਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀 
								                  FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀⤀⤀ 
						 SET @request_result         = 'Fail5';			   ਀ऀऀ      䔀一䐀 
਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ   ⴀⴀ 䄀猀猀攀洀戀氀攀 琀栀攀 搀愀琀愀 
		   SET @authoriser_sid_id = (SELECT apr.sid_id਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
									  WHERE apr.request_id = @grant_request_id)਀ऀऀ   匀䔀䰀䔀䌀吀 䀀愀甀琀栀漀爀椀猀攀爀开猀椀搀 㴀 猀氀⸀猀椀搀 
			 FROM user_restr.sid_list AS sl਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
			   ON apr.approved_by_sid_id_1਀ऀऀऀऀ  㴀 猀氀⸀猀椀搀开椀搀 
			WHERE apr.request_id = @grant_request_id਀ऀऀऀऀऀऀऀऀऀऀऀ       
		   SET @authoriser_notes = ISNULL(SUSER_SNAME(@authoriser_sid), '');਀ 
		   SELECT @authoriser_sid = sl.sid਀ऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		LEFT JOIN user_restr.authoriser_privilege_requests AS apr਀ऀऀऀ   伀一 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀ 
				  = sl.sid_id਀ऀऀऀ圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀最爀愀渀琀开爀攀焀甀攀猀琀开椀搀 
਀ऀऀ   匀䔀吀 䀀愀甀琀栀漀爀椀猀攀爀开渀漀琀攀猀 㴀 䌀伀一䌀䄀吀⠀䀀愀甀琀栀漀爀椀猀攀爀开渀漀琀攀猀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀䀀愀甀琀栀漀爀椀猀攀爀开猀椀搀⤀Ⰰ ✀✀⤀⤀㬀 
਀ 
			 INSERT INTO user_restr.authorisers ਀ऀऀऀऀऀऀ ⠀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀Ⰰ 渀漀琀攀猀⤀ 
				  VALUES (@authoriser_sid_id, @authoriser_notes)਀ 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     SET @request_result = 'Fail6';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀    䔀一䐀 
਀䔀一䐀 
਀ 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䤀一匀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-06-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
/*਀ऀ䤀渀猀攀爀琀猀 昀椀氀攀猀 椀渀琀漀 琀栀攀 昀椀氀攀猀琀爀攀愀洀 挀漀渀琀愀椀渀攀爀 
	Input is a file, filename of the record to be ਀ऀ猀愀瘀攀搀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 椀搀 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 昀甀氀氀 琀攀砀琀 挀漀渀琀攀渀琀 猀琀爀椀渀最⸀⸀ 
	The content hash is stored as a hex string.  ਀ऀ䘀椀氀攀 猀椀稀攀 椀猀 搀攀琀攀爀洀椀渀攀搀 愀渀搀 猀愀瘀攀搀 愀氀猀漀⸀ 
	A hash of the file is stored for duplicate management purposes.  ਀ऀ吀栀攀 昀椀氀攀渀愀洀攀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀漀 戀攀 琀栀攀 猀愀洀攀 愀猀 琀栀攀 漀爀椀最椀渀愀氀 昀椀氀攀渀愀洀攀  
	of the record to be saved.  ਀ऀ吀栀攀 琀爀愀渀猀愀挀琀椀漀渀 椀搀 椀猀 爀攀琀爀椀攀瘀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀  
	from a different stored procedure and passed back to this one.਀ऀ䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 愀 最爀漀甀瀀 漀昀 昀椀氀攀猀 戀攀椀渀最 愀搀搀攀搀 愀琀 琀栀攀 猀愀洀攀 琀椀洀攀 
	can be grouped by the same transaction id. ਀ऀ伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀Ⰰ 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀Ⰰ 
	the id of the new record.਀ऀ䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 椀猀 挀愀爀爀椀攀搀 漀甀琀 戀礀 琀栀攀 挀愀氀氀椀渀最 瀀爀漀挀攀搀甀爀攀⸀ 
*/਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_INS_file] ਀ 
    @f_ins_file_content varbinary(MAX),਀ऀ䀀昀开椀渀猀开猀琀漀爀攀搀开昀椀氀攀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㈀㔀㔀⤀Ⰰ 
	@f_ins_plain_text_content nvarchar(max),਀ऀ䀀昀开椀渀猀开琀栀甀洀戀渀愀椀氀 瘀愀爀戀椀渀愀爀礀⠀洀愀砀⤀Ⰰ 
	@f_ins_transaction_group bigint       = NULL,਀ऀ䀀昀开椀渀猀开挀爀攀愀琀攀搀开戀礀开椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	@f_ins_retention_date datetime2(7)    = NULL,਀ऀ䀀昀开椀渀猀开洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀         㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	@f_ins_transaction_status nchar(50)   = 'Transaction not attempted' OUTPUT,਀    䀀昀开椀渀猀开昀椀氀攀开椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
  SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀 
	    @file_hash varbinary(MAX),਀ऀऀ䀀昀椀氀攀开猀椀稀攀 戀椀最椀渀琀Ⰰ 
		@tempmessage nvarchar(300)         = '',਀ऀ    䀀琀攀洀瀀琀爀愀渀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 渀瘀愀爀挀栀愀爀⠀㌀　　⤀ 㴀 ✀✀Ⰰ 
		@duplicatemessage nvarchar(200)     = '', -- Communicates that a duplicate file exists਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Create a file hash for duplicate management performed elsewhere.਀  匀䔀吀 䀀昀椀氀攀开栀愀猀栀 㴀 䠀䄀匀䠀䈀夀吀䔀匀⠀✀匀䠀䄀㈀开㈀㔀㘀✀Ⰰ 䀀昀开椀渀猀开昀椀氀攀开挀漀渀琀攀渀琀⤀㬀 
਀  ⴀⴀ 䐀攀琀攀爀洀椀渀攀 琀栀攀 猀椀稀攀 漀昀 琀栀攀 昀椀氀攀⸀ 
  SET @file_size = LEN(@f_ins_file_content);਀ 
/*਀ 唀猀椀渀最 伀倀䔀一刀伀圀匀䔀吀⠀䈀唀䰀䬀⸀⸀⸀ 椀猀 愀渀 甀渀猀甀椀琀愀戀氀攀 愀瀀瀀爀漀愀挀栀 椀渀 琀栀椀猀 挀漀渀琀攀砀琀 
 because it requires BULK ADMIN privileges, which introduces਀ 猀攀挀甀爀椀琀礀 椀猀猀甀攀猀⸀  䠀攀渀挀攀 琀栀攀 愀瀀瀀爀漀愀挀栀 甀猀攀搀 椀猀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
 must open the file and place it into an object which is passed਀ 琀漀 琀栀攀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀⸀ 
*/਀ 
-- Check if a duplicate file exists.਀  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀渀琀攀渀琀开栀愀猀栀 
               FROM base.file_metadata਀ऀऀऀ  圀䠀䔀刀䔀 挀漀渀琀攀渀琀开栀愀猀栀 㴀 䀀昀椀氀攀开栀愀猀栀⤀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀甀瀀氀椀挀愀琀攀䘀椀氀攀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @duplicatemessage = @tempmessage;਀ऀऀ 䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on DuplicateFile.';਀ 
 -- Execute the insert query਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         INSERT INTO base.file_storage (file_guid,  file_content)਀ऀ     嘀䄀䰀唀䔀匀 ⠀一䔀圀䤀䐀⠀⤀Ⰰ  䀀昀开椀渀猀开昀椀氀攀开挀漀渀琀攀渀琀⤀ 
਀ऀऀ ⴀⴀ 刀攀琀爀椀攀瘀攀 琀栀攀 渀攀眀 昀椀氀攀 椀搀⸀ 
		 SET @f_ins_file_id = SCOPE_IDENTITY();਀ 
         INSERT INTO base.file_metadata (file_id, filename, content_hash, transaction_group_id, ਀ऀऀ                                    昀椀氀攀开猀椀稀攀Ⰰ 挀爀攀愀琀攀搀开戀礀开猀椀搀开椀搀Ⰰ 爀攀琀攀渀琀椀漀渀开搀愀琀攀⤀ 
		 VALUES (@f_ins_file_id, @f_ins_stored_filename, @file_hash, @f_ins_transaction_group, ਀ऀऀ                                    䀀昀椀氀攀开猀椀稀攀Ⰰ 䀀昀开椀渀猀开挀爀攀愀琀攀搀开戀礀开椀搀Ⰰ  䀀昀开椀渀猀开爀攀琀攀渀琀椀漀渀开搀愀琀攀⤀ 
਀ऀऀ 䤀一匀䔀刀吀 䤀一吀伀 戀愀猀攀⸀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀 ⠀昀椀氀攀开椀搀Ⰰ 瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀⤀ 
		 VALUES (@f_ins_file_id, @f_ins_plain_text_content)਀ 
		 INSERT INTO base.file_thumbnails (file_id, thumbnail)਀ऀऀ 嘀䄀䰀唀䔀匀 ⠀䀀昀开椀渀猀开昀椀氀攀开椀搀Ⰰ 䀀昀开椀渀猀开琀栀甀洀戀渀愀椀氀⤀ 
         COMMIT TRANSACTION;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀椀氀攀䤀渀猀攀爀琀攀搀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀昀开椀渀猀开琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @f_ins_transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on InsertError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀    䤀䘀 ⠀䀀昀开椀渀猀开洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀昀开椀渀猀开洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀昀开椀渀猀开洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')     SET @f_ins_message = @transactionmessage;਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀ 㰀㸀 ✀✀⤀    匀䔀吀 䀀昀开椀渀猀开洀攀猀猀愀最攀 㴀 䀀昀开椀渀猀开洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㈀㬀 
    IF (@duplicatemessage <> '')       SET @f_ins_message = @f_ins_message + ' | ' + @duplicatemessage;਀ 
਀ⴀⴀ 吀栀椀猀 瀀爀漀挀攀搀甀爀攀 椀猀 椀渀琀攀爀渀愀氀 愀渀搀 搀漀攀猀 渀漀琀 甀猀攀 琀栀攀 挀甀爀猀漀爀 琀漀 爀攀琀甀爀渀 搀愀琀愀⸀  
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_INS_workflow_track_log]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Stores de-normalised data for a given instance step into the workflow track log. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_INS_workflow_track_log]਀ 
	  @instance_step_id bigint         = NULL,਀ऀ  䀀琀爀椀最最攀爀攀搀开戀礀 渀瘀愀爀挀栀愀爀⠀㔀　⤀       㴀 一唀䰀䰀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
਀        䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀 
਀ 
  INSERT INTO workflow_instances.workflow_track_log_index਀              ⠀搀漀挀开椀搀Ⰰ 琀爀椀最最攀爀攀搀开戀礀Ⰰ 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀Ⰰ 洀漀搀攀氀开渀愀洀攀Ⰰ 瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀⤀ 
       SELECT ਀ऀऀऀ  眀椀搀⸀搀漀挀开椀搀            䄀匀 搀漀挀开椀搀Ⰰ 
			  @triggered_by         AS triggered_by,਀ऀऀऀ  眀椀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 䄀匀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀Ⰰ 
			  wmn.attr_name         AS model_name,਀ऀऀऀ  眀椀搀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀   䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀 
	     FROM workflow_instances.workflow_instance_steps AS wis਀   䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀椀搀 
           ON   wis.workflow_instance_id਀ऀऀ      㴀 眀椀搀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
    LEFT JOIN workflow_models.workflow_model_names AS wmn਀ऀ       伀一   眀椀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
		      = wmn.workflow_model_id਀ऀ    圀䠀䔀刀䔀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		      = @instance_step_id਀ 
    SET @newrecordid = SCOPE_IDENTITY();਀ 
਀            䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最  
			            (wf_log_index_id, record_id, field_type, field_id, field_mnemonic, field_name, attr_id,਀ऀऀऀ               愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开渀愀洀攀Ⰰ 氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ 猀琀攀瀀开漀爀搀攀爀Ⰰ 攀搀最攀开椀搀Ⰰ 琀漀开渀漀搀攀开椀搀Ⰰ  
						   rule_val, date_val)਀             匀䔀䰀䔀䌀吀 
਀ऀऀऀ     䀀渀攀眀爀攀挀漀爀搀椀搀Ⰰ                                
                 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), ਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ ✀✀⤀Ⰰ                   
                 sd.field_id,                                ਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ               
                 ISNULL(sd.field_name, ''),                  ਀ऀऀऀऀ 猀搀⸀愀琀琀爀开椀搀Ⰰ                                  
				 ISNULL(sd.attr_mnemonic, ''),               ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀搀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ                    
                 ISNULL(sd.long_text_val, ''),਀ऀऀऀऀ 猀搀⸀猀琀攀瀀开漀爀搀攀爀Ⰰ 
				 sd.edge_id,਀ऀऀऀऀ 猀搀⸀琀漀开渀漀搀攀开椀搀Ⰰ 
				 sd.rule_val,਀ऀऀऀऀ 猀搀⸀搀愀琀攀开瘀愀氀 
             FROM workflow_instances.workflow_instance_steps AS wis਀      䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开眀昀开椀渀猀琀开猀琀攀瀀开搀愀琀愀开䤀吀嘀䘀崀⠀眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 䄀匀 猀搀 
            WHERE wis.workflow_instance_step_id = @instance_step_id;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开刀䔀嘀伀䬀䔀开愀甀琀栀漀爀椀猀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀  
-- Date:        11-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Revokes authoriser privileges on request from an authorised pending revoke request.   ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开刀䔀嘀伀䬀䔀开愀甀琀栀漀爀椀猀攀爀崀  
਀ऀ 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @request_result nvarchar(10) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
਀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀㬀 
਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Check if a request_id has been supplied਀ऀऀ 䤀䘀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀 㴀 　 
		    SET @revoke_request_id = NULL;਀ 
		 IF @revoke_request_id IS NULL਀ऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㄀✀㬀 
਀         䔀䰀匀䔀  
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 爀攀焀甀攀猀琀开椀搀 ऀ     ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀焀甀攀猀琀开椀搀 攀砀椀猀琀猀 愀渀搀 椀猀 愀瀀瀀爀漀瘀攀搀⸀ 
				  				  FROM user_restr.authoriser_privilege_requests ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀 
								   AND type = 'Revoke'਀ऀऀऀऀऀऀऀऀ   䄀一䐀 猀琀愀琀甀猀 㴀 ✀䄀瀀瀀爀漀瘀攀搀✀⤀  
						 SET @request_result         = 'Fail2';਀ऀऀ   䔀一䐀 
਀ऀऀ   䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
		      BEGIN਀ 
				 IF NOT EXISTS (SELECT apr.sid_id 	     -- Check that the sid_id of the request is already in the list of authorisers. ਀ऀऀऀऀ   ऀऀऀ      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
						    INNER JOIN user_restr.authorisers AS a਀ऀऀऀऀऀऀ            伀一            愀瀀爀⸀猀椀搀开椀搀  
								       = a.authoriser_sid_id਀ऀऀऀऀऀऀऀ     圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀⤀  
						 SET @request_result         = 'Fail3';਀ऀऀऀ  䔀一䐀 
਀ऀऀ   䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
		     BEGIN਀ऀऀऀऀⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 戀漀琀栀 琀栀攀 愀甀琀栀漀爀椀猀攀爀猀 愀最愀椀渀猀琀 琀栀攀 氀椀猀琀 漀昀 愀甀琀栀漀爀椀猀攀爀猀 愀渀搀 挀栀攀挀欀 琀栀愀琀 琀栀攀礀 愀爀攀 渀漀琀 琀栀攀 猀愀洀攀⸀ 
                  IF NOT EXISTS (SELECT apr.request_id ਀ऀऀऀऀ                   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
							 INNER JOIN user_restr.authorisers AS a਀ऀऀऀऀऀऀ             伀一 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
								        = a.authoriser_sid_id਀                                  圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀⤀ 
					 OR NOT EXISTS (SELECT apr.request_id ਀ऀऀऀऀ                      䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
							    INNER JOIN user_restr.authorisers AS a਀ऀऀऀऀऀऀ                伀一 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀ 
								           = a.authoriser_sid_id਀                                     圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀⤀ 
					OR EXISTS (SELECT apr.request_id -- Check that the approvers are not the same਀ऀऀऀऀ                 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀 䄀匀 愀瀀爀 
                                WHERE apr.request_id = @revoke_request_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀   愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
								      = apr.approved_by_sid_id_2)								 ਀ 
						 SET @request_result         = 'Fail4';਀               䔀一䐀 
਀ऀऀऀ   ⴀⴀ 倀爀攀瘀攀渀琀 愀甀琀栀漀爀椀猀攀爀猀 昀爀漀洀 椀渀愀搀瘀攀爀琀攀渀琀氀礀 爀攀瘀漀欀椀渀最 琀栀攀椀爀 漀眀渀 瀀爀椀瘀椀氀攀最攀猀⸀  吀栀椀猀 瀀爀攀瘀攀渀琀猀 琀栀攀 猀椀琀甀愀琀椀漀渀 眀栀攀爀攀 琀栀攀爀攀 愀爀攀 昀攀眀攀爀 琀栀愀渀 琀眀漀 
			   -- authorisers left and hence dba support is necessary to re-bootstrap the authorisers.਀ऀऀ   䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
		     BEGIN਀ऀऀऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
			               FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀ  圀䠀䔀刀䔀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀ 
						        = apr.sid_id਀ऀऀऀऀऀऀऀ 伀刀 愀瀀爀⸀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀ 
							    = apr.sid_id਀ऀऀऀऀऀऀऀ䄀一䐀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀⤀ 
਀ऀऀऀऀऀऀ 匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀         㴀 ✀䘀愀椀氀㔀✀㬀 
਀ऀऀऀ 䔀一䐀 
਀ऀऀ   䤀䘀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀倀愀猀猀✀ 
		     BEGIN  -- Re-validate the SID_ID਀ऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
								 FROM user_restr.sid_list਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 愀瀀爀⸀猀椀搀开椀搀 
								                  FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀⤀⤀ 
						 SET @request_result         = 'Fail6';			   ਀ऀऀ      䔀一䐀 
਀ 
-- Execute the update query਀ 
  IF @request_result = 'Pass'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	     DELETE FROM user_restr.authorisers ਀               圀䠀䔀刀䔀 愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀  
			                                FROM user_restr.authoriser_privilege_requests AS apr਀ऀऀऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 愀瀀爀⸀爀攀焀甀攀猀琀开椀搀 㴀 䀀爀攀瘀漀欀攀开爀攀焀甀攀猀琀开椀搀⤀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     匀䔀吀 䀀爀攀焀甀攀猀琀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀㜀✀㬀 
	  END CATCH਀ 
    END਀ 
END਀ 
਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_SEL_message]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation.਀ⴀⴀ 䘀攀琀挀栀攀猀 攀爀爀漀爀 洀攀猀猀愀最攀猀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 猀攀氀攀挀琀攀搀 氀愀渀最甀愀最攀⸀ 
-- Input is the message id.  Output is the message text.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_SEL_message] ਀ 
	@message_id nvarchar(20),਀ऀ䀀洀攀猀猀愀最攀开琀攀砀琀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ऀⴀⴀ 一漀琀攀 琀栀愀琀 琀栀攀 猀攀氀攀挀琀攀搀 爀漀眀 昀爀漀洀 琀栀攀 最氀漀戀愀氀开猀攀琀琀椀渀最开最爀漀甀瀀 琀愀戀氀攀 椀猀 栀愀爀搀 挀漀搀攀搀 栀攀爀攀 
	BEGIN TRY਀     匀䔀䰀䔀䌀吀 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀  
	        (SELECT message_text ਀ऀ           䘀刀伀䴀 洀攀猀猀愀最椀渀最⸀洀攀猀猀愀最攀开搀攀琀愀椀氀猀  
         INNER JOIN base.global_settings_groups ਀                 伀一 洀攀猀猀愀最椀渀最⸀洀攀猀猀愀最攀开搀攀琀愀椀氀猀⸀氀愀渀最甀愀最攀开椀搀  
		 	        = base.global_settings_groups.language_id ਀              圀䠀䔀刀䔀 洀攀猀猀愀最攀开椀搀  
			        = @message_id ਀ऀऀऀऀ    䄀一䐀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀  
    END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	   SET @message_text = 'A database message error occurred';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_SEL_random_doc_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㤀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Automatically generates a random doc id਀ⴀⴀ 一漀 椀渀瀀甀琀 
-- Output is a doc id.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_SEL_random_doc_id] ਀ 
		@randomdocumentid nvarchar(50)	= '' OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
		@letter char                = NULL,਀ऀऀ䀀椀搀氀攀渀最琀栀 椀渀琀               㴀 㐀Ⰰ 
		@charcount int	            = 0,਀ऀऀ䀀搀漀挀椀搀攀砀椀猀琀猀 渀瘀愀爀挀栀愀爀⠀㄀　⤀ऀ㴀 ✀夀攀猀✀Ⰰ 
		@prefix varchar(3)          = ''਀ 
  -- Select and validate the id length਀  ⼀⨀ 
  The rules encoded here are based on the premise that ਀  搀漀挀甀洀攀渀琀 䤀䐀猀 洀甀猀琀 戀攀 愀洀洀攀渀愀戀氀攀 琀漀 戀攀椀渀最  
    easily read਀ऀ攀愀猀椀氀礀 瘀攀爀戀愀氀氀礀 挀漀洀洀甀渀椀挀愀琀攀搀 愀渀搀 
	easily memorised. ਀  䤀渀昀漀爀洀愀琀椀漀渀 愀戀漀甀琀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 挀漀渀琀愀椀渀攀搀 
  within medatadata fields.਀  ⨀⼀ 
  SET @idlength = (SELECT auto_gen_doc_id_length਀                     䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
					WHERE setting_group_name = 'Master');਀  䤀䘀 䀀椀搀氀攀渀最琀栀 䤀匀 一唀䰀䰀 漀爀 䀀椀搀氀攀渀最琀栀 㴀 　 
     SET @idlength = 4;਀  䤀䘀 䀀椀搀氀攀渀最琀栀 㸀 㠀 
     SET @idlength = 8;਀  䤀䘀 䀀椀搀氀攀渀最琀栀 㴀 㜀 
     SET @idlength = 6;਀  䤀䘀 䀀椀搀氀攀渀最琀栀 㴀 㔀 
     SET @idlength = 4;਀  䤀䘀 䀀椀搀氀攀渀最琀栀 㰀 㐀 
     SET @idlength = 4;਀ 
  -- Add the register code prefix if applicable.਀  䤀䘀 ⠀匀䔀䰀䔀䌀吀 椀猀开爀攀最椀猀琀攀爀开挀漀搀攀开愀瀀瀀氀椀攀搀  
        FROM base.global_settings_groups) = 'Yes'਀ऀ䈀䔀䜀䤀一 
		SET @prefix = (SELECT register_code਀ऀऀऀऀऀ     䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
						WHERE setting_group_name = 'Master')਀ऀऀ䤀䘀 䀀瀀爀攀昀椀砀 䤀匀 一唀䰀䰀   
		   SET @prefix = ''਀ऀऀ䔀䰀匀䔀 
		   SET @prefix = @prefix + '-';਀ऀ䔀一䐀 
  SET @randomdocumentid = @prefix;਀ 
਀  ⴀⴀ 䜀攀渀攀爀愀琀攀 愀 爀愀渀搀漀洀 搀漀挀甀洀攀渀琀 椀搀 
  WHILE @idlength > 0 ਀    䈀䔀䜀䤀一 
	  SET @letter = NULL;਀ऀ  圀䠀䤀䰀䔀 ⠀䀀氀攀琀琀攀爀 䤀匀 一唀䰀䰀⤀ 
		  BEGIN਀ऀऀऀ匀䔀吀 䀀氀攀琀琀攀爀 㴀 䌀䠀䄀刀⠀䌀䔀䤀䰀䤀一䜀⠀刀䄀一䐀⠀䌀䠀䔀䌀䬀匀唀䴀⠀一䔀圀䤀䐀⠀⤀⤀⤀⨀㈀㔀⬀㘀㔀⤀⤀㬀 
			/* Exclude vowels so that the string cannot spell a word.਀ऀऀऀ   䔀砀挀氀甀搀攀 䰀 猀漀 琀栀愀琀 椀琀 挀愀渀渀漀琀 戀攀 洀椀猀爀攀愀搀 愀猀 ㄀⸀ 
			   Excude W because it has more than one syllable.਀ऀऀऀ   䔀砀挀氀甀搀攀 嘀 戀攀挀愀甀猀攀 琀眀漀 嘀猀 氀漀漀欀猀 氀椀欀攀 圀⸀ 
			   Hence the maximum possible number of combinations is ਀ऀऀऀ   ㄀㠀 帀 䀀椀搀氀攀渀最琀栀⸀ 
			*/਀ऀऀऀ䤀䘀    䀀氀攀琀琀攀爀 㴀 ✀䄀✀  
			   OR @letter = 'E' ਀ऀऀऀ   伀刀 䀀氀攀琀琀攀爀 㴀 ✀䤀✀ 
			   OR @letter = 'O'਀ऀऀऀ   伀刀 䀀氀攀琀琀攀爀 㴀 ✀唀✀ 
			   OR @letter = 'L'਀ऀऀऀ   伀刀 䀀氀攀琀琀攀爀 㴀 ✀圀✀ 
			   OR @letter = 'V'਀ऀऀऀ  匀䔀吀 䀀氀攀琀琀攀爀 㴀 一唀䰀䰀㬀 
		  END਀      匀䔀吀 䀀挀栀愀爀挀漀甀渀琀 㴀 䀀挀栀愀爀挀漀甀渀琀 ⬀ ㄀㬀 
	  SET @idlength = @idlength - 1;਀ 
	  -- Insert a dash in the middle.਀ऀ  䤀䘀 䀀挀栀愀爀挀漀甀渀琀 㴀 㐀 愀渀搀 䀀椀搀氀攀渀最琀栀 㴀 ㈀  
	     SET @randomdocumentid = @randomdocumentid + '-';਀ऀ  䤀䘀 䀀挀栀愀爀挀漀甀渀琀 㴀 㔀 愀渀搀 䀀椀搀氀攀渀最琀栀 㴀 ㌀ 
	     SET @randomdocumentid = @randomdocumentid + '-';਀ 
	  SET @randomdocumentid = @randomdocumentid + @letter;਀    䔀一䐀 
  -- End of generating random document id਀   
  -- Checking of whether the document id is unique is done elsewhere.਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_VALIDATE_filename]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Checks whether a filename is a valid Windows filename਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 猀琀爀椀渀最 挀漀渀琀愀椀渀椀渀最 琀栀攀 昀椀氀攀渀愀洀攀 琀漀 戀攀 挀栀攀挀欀攀搀⸀   
-- Output is a status string of 'Valid' or 'Invalid'.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [internal].[usp_VALIDATE_filename] ਀ऀⴀⴀ 䄀搀搀 琀栀攀 瀀愀爀愀洀攀琀攀爀猀 昀漀爀 琀栀攀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀 栀攀爀攀 
	@filename_to_validate nvarchar(255),਀ऀ䀀昀椀氀攀渀愀洀攀开瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀 渀挀栀愀爀⠀㄀　⤀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
਀ 䤀䘀     䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀─崀─✀ 
     OR @filename_to_validate LIKE '%[/]%'਀ऀ 伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀尀崀─✀ 
     OR @filename_to_validate LIKE '%[:]%'਀     伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀⨀崀─✀ 
     OR @filename_to_validate LIKE '%[?]%'਀     伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀㰀崀─✀ 
     OR @filename_to_validate LIKE '%[>]%'਀     伀刀 䀀昀椀氀攀渀愀洀攀开琀漀开瘀愀氀椀搀愀琀攀 䰀䤀䬀䔀 ✀─嬀簀崀─✀ 
     OR @filename_to_validate LIKE '%["]%'਀ 
     SET @filename_validation_result = 'Invalid';਀ 䔀䰀匀䔀 匀䔀吀 䀀昀椀氀攀渀愀洀攀开瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀 㴀 ✀嘀愀氀椀搀✀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [internal].[usp_VALIDATE_mnem_name_descr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㘀ⴀ㈀　㈀㌀ 
-- Description:	Performs data validation on name, attribute and description fields.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 愀 洀攀猀猀愀最攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀崀  
	-- Add the parameters for the stored procedure here਀     䀀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀          㴀 一唀䰀䰀Ⰰ 
	 @attr_name nvarchar(50)     = NULL,਀ऀ 䀀搀攀猀挀爀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 一唀䰀䰀Ⰰ 
	 @data_valn_status nchar(10) = 'Pass' OUTPUT,਀ऀ 䀀洀攀猀猀最 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀       㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
    @tempmessage nvarchar(300)      = '',਀    䀀渀漀搀愀琀愀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ 
	@toolong10message nvarchar(200) = '',਀ऀ䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀ 㴀 ✀✀Ⰰ 
    @nameemptymessage nvarchar(200) = '';਀ 
 -- Data validation਀   ⴀⴀ 一唀䰀䰀 爀攀挀漀爀搀猀 渀漀琀 瀀攀爀洀椀琀琀攀搀 
   IF ((@mnem IS NULL OR @mnem = '') AND (@attr_name IS NULL OR @attr_name = '') ਀      䄀一䐀 ⠀䀀搀攀猀挀爀 䤀匀 一唀䰀䰀 伀刀 䀀搀攀猀挀爀 㴀 ✀✀⤀⤀ 
 	 BEGIN਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoData', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	   IF (@tempmessage IS NOT NULL) ਀ऀ     匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
       ELSE਀ऀ      匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀愀✀㬀 
	   SET @data_valn_status = 'Fail';਀ऀ 䔀一䐀 
   ELSE -- Do other checking only if data is supplied.਀     䈀䔀䜀䤀一  
       -- Check if the Mnemonic text may have been automatically truncated.਀ऀ   䤀䘀 ⠀䰀䔀一⠀䀀洀渀攀洀⤀ 㸀㴀 ㄀　⤀ 
   	    BEGIN਀          䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'TooLong10', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	      IF (@tempmessage IS NOT NULL) ਀ऀऀ     匀䔀吀 䀀琀漀漀氀漀渀最㄀　洀攀猀猀愀最攀 㴀 䀀洀渀攀洀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	      ELSE ਀ऀऀ     匀䔀吀 䀀琀漀漀氀漀渀最㄀　洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀漀漀䰀漀渀最㄀　✀㬀 
	    END਀       ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 䄀琀琀爀椀戀甀琀攀 琀攀砀琀 洀愀礀 栀愀瘀攀 戀攀攀渀 愀甀琀漀洀愀琀椀挀愀氀氀礀 琀爀甀渀挀愀琀攀搀⸀ 
       IF (LEN(@attr_name) >= 50)਀         䈀䔀䜀䤀一 
           EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀漀漀䰀漀渀最㔀　✀Ⰰ  
			 @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	  	     SET @toolong50message = LEFT(@attr_name, 8) + '...' + ' | ' + @tempmessage;਀ऀ       䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀  
	         SET @toolong50message = 'A database level message error occurred on TooLong50';਀ऀ     䔀一䐀 
       -- Check if the name entry is blank.   ਀ऀ   ⴀⴀ ⠀一漀琀攀 琀栀愀琀 椀渀 䴀匀匀儀䰀匀 一唀䰀䰀㴀一唀䰀䰀 愀渀搀 栀攀渀挀攀 愀 甀渀椀焀甀攀 挀漀渀猀琀爀愀椀渀琀 眀椀氀氀 昀愀椀氀 椀昀 洀甀氀琀椀瀀氀攀 爀攀挀漀爀搀猀 
	   -- are NULL.)਀       䤀䘀 ⠀䀀愀琀琀爀开渀愀洀攀 㴀 ✀✀ 伀刀 䀀愀琀琀爀开渀愀洀攀 䤀匀 一唀䰀䰀⤀ 
	     BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	       EXEC internal.usp_SEL_message ਀                䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䄀琀琀爀一愀洀攀✀Ⰰ  
			    @message_text = @tempmessage OUTPUT;਀ऀ       䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	         SET @nameemptymessage = @tempmessage;਀ऀ       䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀  
		      SET @nameemptymessage = 'A database level message error occurred on NoAttrName';਀ऀऀ 䔀一䐀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 漀昀 琀栀攀 䔀䰀匀䔀 昀漀爀 琀栀攀 渀漀ⴀ搀愀琀愀 挀栀攀挀欀 
-- End of data validation਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀ 
  IF (@nodatamessage <> '')    SET @messg = @messg + ' | ' + @nodatamessage;਀  䤀䘀 ⠀䀀渀愀洀攀攀洀瀀琀礀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀ 匀䔀吀 䀀洀攀猀猀最 㴀 䀀洀攀猀猀最 ⬀ ✀ 簀 ✀ ⬀ 䀀渀愀洀攀攀洀瀀琀礀洀攀猀猀愀最攀㬀 
  IF (@toolong10message <> '') SET @messg = @messg + ' | ' + @toolong10message;਀  䤀䘀 ⠀䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀 㰀㸀 ✀✀⤀ 匀䔀吀 䀀洀攀猀猀最 㴀 䀀洀攀猀猀最 ⬀ ✀ 簀 ✀ ⬀ 䀀琀漀漀氀漀渀最㔀　洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_CHECK_doc_ed_permission]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㐀 
-- Description:	Checks whether the connected user has edit permission for the given document id.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀⸀  伀甀琀瀀甀琀 椀猀 愀 爀攀猀甀氀琀 愀渀搀 洀攀猀猀愀最攀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema, stored procedures and functions are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_CHECK_doc_ed_permission] ਀ 
      @documentid nvarchar(50)         = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䈀䔀䜀䤀一 吀刀夀 
  -- Document id validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to edit the document data਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开搀漀挀开攀搀开瀀攀爀洀崀  
 	            @doc_id_to_check_ep =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开搀攀瀀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
		   SET @validation_result   = @docauthenticationstatus;਀ऀऀ   䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to edit it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoDocIDAccess', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀ Ⰰ  䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
				 END	਀ऀऀऀ 䔀䰀匀䔀 
				 BEGIN -- The user has edit permission਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'EdPermCheckPass', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀ Ⰰ  䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䔀搀倀攀爀洀䌀栀攀挀欀倀愀猀猀⸀✀⤀㬀 
				 END਀ 
				 --EdPermCheckResult਀ऀऀ 䔀一䐀 
	   EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀ऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀  㴀 ✀䘀愀椀氀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 
	SET @validation_result = RTRIM(@validation_result);਀   
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䌀䠀䔀䌀䬀开昀椀氀攀开攀搀开瀀攀爀洀椀猀猀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 最椀瘀攀渀 昀椀氀攀 椀搀⸀ 
-- Input is a file id.  Output is a result and messages.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 昀甀渀挀琀椀漀渀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䌀䠀䔀䌀䬀开昀椀氀攀开攀搀开瀀攀爀洀椀猀猀椀漀渀崀  
਀      䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @validation_result nvarchar(10)  = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 䘀椀氀攀 
		                                          -- or alternatively if the File does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
BEGIN TRY਀  ⴀⴀ 䘀椀氀攀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a file id was supplied.਀ऀ  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䘀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to edit the File data਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 	            @file_id_to_check_ep =  @fileid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
		   SET @validation_result   = @fileauthenticationstatus;਀ऀऀ   䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- file id does not exist or the user does not have permission to edit it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
				 END		਀ऀऀऀ 䔀䰀匀䔀 
				 BEGIN -- The user has edit permission਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'EdPermCheckPass', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䔀搀倀攀爀洀䌀栀攀挀欀倀愀猀猀⸀✀⤀㬀 
				 END				 ਀ऀऀ 䔀一䐀 
	   EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀ऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀  㴀 ✀䘀愀椀氀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 
	SET @validation_result = RTRIM(@validation_result);਀   
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开椀渀搀椀瘀开戀爀漀眀猀椀渀最开琀爀攀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Deletes a tag browsing tree, both the name details and the nodes.਀ⴀⴀ 伀渀氀礀 昀漀爀 琀爀攀攀猀 眀栀椀挀栀 愀爀攀 漀眀渀攀搀 戀礀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
-- Input and output parameters are as declared below. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_DEL_indiv_browsing_tree] ਀ 
     @tag_br_treeid bigint            = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the roles਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTree.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- Check that the tag browsing tree is valid and is owned by the connected user਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
								 WHERE    tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀 
								   AND tbtn.sid_id਀ऀऀऀऀऀऀऀऀ       㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
									        FROM user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 
										         = @connectedusersid))਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䈀爀吀爀攀攀一漀琀伀眀渀攀搀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on BrTreeNotOwned.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
    END -- End user authentication = Pass਀  
-- Execute the delete query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  -- Delete the tag tree਀ऀ  䐀䔀䰀䔀吀䔀 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
		    WHERE    tag_browsing_tree_id ਀ऀऀऀऀ  㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀㬀  
਀      ⴀⴀ 䐀攀氀攀琀攀 琀栀攀 琀愀最 琀爀攀攀 渀愀洀攀 搀攀琀愀椀氀猀 
	     DELETE tagging.tag_browsing_tree_names ਀ऀऀ  圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
				= @tag_br_treeid; ਀ 
         COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀攀氀攀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀氀攀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开戀爀开琀爀攀攀开戀爀愀渀挀栀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Delete a tag browsing tree branch.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_DEL_tag_br_tree_branch] ਀ 
     @tag_br_tree_node_id bigint      = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',	਀ऀऀ䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 IF @tag_br_tree_node_id = 0਀    匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 㴀 一唀䰀䰀㬀 
 IF @tag_br_tree_node_id IS NULL਀ ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoNode');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
  ELSE -- A node ID has been supplied.  Check if it exists. ਀    䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT browsing_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   browsing_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TreeNodeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ऀ䔀一䐀 
਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 渀漀搀攀 椀猀 爀漀漀琀⸀  吀栀攀 爀漀漀琀 渀漀搀攀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀⸀ 
   IF EXISTS (SELECT browsing_tree_hierarchyid਀                䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
               WHERE    browsing_tree_node_id ਀ऀऀऀ         㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 
                 AND browsing_tree_hierarchyid = hierarchyid::GetRoot()਀                 䄀一䐀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
                                               FROM tagging.tag_browsing_tree_nodes਀                                              圀䠀䔀刀䔀  戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀  
											        = @tag_br_tree_node_id)) ਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀猀刀漀漀琀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IsRootNode');		   ਀ऀऀऀ䔀一䐀  
 ਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
਀  匀䔀吀 䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
                                 FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀऀ            圀䠀䔀刀䔀  戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
					                  = @tag_br_tree_node_id);਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  
	  BEGIN TRY਀ऀ   䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
     -- Delete all descendant nodes਀     䐀䔀䰀䔀吀䔀 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
           WHERE    tag_browsing_tree_id ਀ऀऀ         㴀 䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
             AND browsing_tree_hierarchyid.IsDescendantOf(਀                 ⠀匀䔀䰀䔀䌀吀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
                    FROM tagging.tag_browsing_tree_nodes਀                   圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀⤀ 㴀 ㄀㬀 
਀ऀऀ ⴀⴀ䐀攀氀攀琀攀 琀栀攀 渀漀搀攀  
		DELETE FROM tagging.tag_browsing_tree_nodes਀ऀऀ      圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀  
		            = @tag_br_tree_node_id;	਀ 
਀     䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_DEL_tag_br_tree_node]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ㄀　ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䐀攀氀攀琀攀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀漀搀攀⸀ 
-- Authenticates for both controller, editor and reader. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䐀䔀䰀开琀愀最开戀爀开琀爀攀攀开渀漀搀攀崀  
 ਀     䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@tag_browsing_tree_id bigint            = NULL,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass',਀        䀀渀漀搀攀开栀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
        @parent_hid hierarchyid;		਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀   
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 IF @tag_br_tree_node_id = 0਀    匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 㴀 一唀䰀䰀㬀 
 IF @tag_br_tree_node_id IS NULL਀ ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoNode');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
  ELSE -- A node ID has been supplied.  Check if it exists. ਀    䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT browsing_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   browsing_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TreeNodeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ऀ䔀一䐀 
਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 渀漀搀攀 椀猀 爀漀漀琀⸀  吀栀攀 爀漀漀琀 渀漀搀攀 挀愀渀渀漀琀 戀攀 搀攀氀攀琀攀搀⸀ 
   IF EXISTS (SELECT browsing_tree_hierarchyid਀                䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
               WHERE    browsing_tree_node_id ਀ऀऀऀ         㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 
                 AND browsing_tree_hierarchyid = hierarchyid::GetRoot()਀                 䄀一䐀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
                                               FROM tagging.tag_browsing_tree_nodes਀                                              圀䠀䔀刀䔀  戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀  
											        = @tag_br_tree_node_id)) ਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀猀刀漀漀琀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IsRootNode');		   ਀ऀऀऀ䔀一䐀  
 ਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
਀  匀䔀吀 䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
                                 FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀऀ            圀䠀䔀刀䔀  戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
					                  = @tag_br_tree_node_id);਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY਀        䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ 
		 --Delete the node ਀ऀऀ䐀䔀䰀䔀吀䔀 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
		      WHERE browsing_tree_node_id ਀ऀऀ            㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀㬀ऀ 
਀  ⴀⴀ ⌀⌀⌀⌀ 刀䔀ⴀ倀䄀刀䔀一吀 䐀䔀匀䌀䔀一䐀䄀一吀 一伀䐀䔀匀⸀ ⌀⌀⌀⌀ 
		-- Get hierarchyid of the node being deleted਀ऀऀ  匀䔀䰀䔀䌀吀 䀀渀漀搀攀开栀椀搀 㴀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
		  FROM tagging.tag_browsing_tree_nodes਀ऀऀ  圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀㬀 
਀ऀऀ  ⴀⴀ 䜀攀琀 椀琀猀 瀀愀爀攀渀琀 栀椀攀爀愀爀挀栀礀椀搀 
		  SET @parent_hid = @node_hid.GetAncestor(1);਀ 
		  -- Move each direct child of the deleted node to the parent਀ऀऀ  㬀圀䤀吀䠀 䐀椀爀攀挀琀䌀栀椀氀搀爀攀渀 䄀匀 ⠀ 
			  SELECT browsing_tree_node_id,਀ऀऀऀऀऀ 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
			  FROM tagging.tag_browsing_tree_nodes਀ऀऀऀ  圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䄀渀挀攀猀琀漀爀⠀㄀⤀ 㴀 䀀渀漀搀攀开栀椀搀 
				AND tag_browsing_tree_id = @tag_browsing_tree_id਀ऀऀ  ⤀ 
		  UPDATE c਀ऀऀऀ匀䔀吀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 
					@parent_hid.GetDescendant(਀ऀऀऀऀऀऀⴀⴀ 渀攀眀 猀椀戀氀椀渀最 瀀氀愀挀攀洀攀渀琀㨀 洀愀砀 攀砀椀猀琀椀渀最 甀渀搀攀爀 瀀愀爀攀渀琀 
						(SELECT MAX(browsing_tree_hierarchyid)਀ऀऀऀऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
						  WHERE browsing_tree_hierarchyid.GetAncestor(1) = @parent_hid਀ऀऀऀऀऀऀऀ䄀一䐀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀⤀Ⰰ 
						NULL਀ऀऀऀऀऀ⤀ 
		  FROM DirectChildren c;਀ 
਀     䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_INS_self_onboard_sid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Inserts a record into user_restr.sid_list directly from the connected user.਀ⴀⴀ 一漀琀攀 琀栀愀琀 愀搀搀椀渀最 愀 甀猀攀爀 琀漀 琀栀攀 匀䤀䐀 氀椀猀琀 搀漀攀猀 渀漀琀 最爀愀渀琀 愀渀礀 瀀攀爀洀椀猀猀椀漀渀猀⸀ 
-- The permissions are mapped via the ACLs. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 愀渀搀 愀 猀椀搀开椀搀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䤀一匀开猀攀氀昀开漀渀戀漀愀爀搀开猀椀搀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @transaction_ready nchar(10)       = 'Ready';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  ਀ऀऀऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
				IF EXISTS (SELECT sid਀ऀऀऀऀ   ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
							WHERE restore_sid = @connectedusersid)਀ऀऀऀऀ䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䐀甀瀀氀匀攀氀昀伀渀戀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage, @username);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DuplSelfOnb.');਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				END਀ 
		  -- Check if SID has resolved਀ऀऀ  䤀䘀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 㴀 　 
			BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'NoSID', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䀀甀猀攀爀渀愀洀攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀䤀䐀⸀✀⤀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ 
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
  	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
	     INSERT INTO user_restr.sid_list (sid,               username, restore_sid)਀ऀऀ      嘀䄀䰀唀䔀匀                     ⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀Ⰰ 䀀甀猀攀爀渀愀洀攀Ⰰ 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀㬀   
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage, @username, 'Onboarded');਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_INS_tag_br_tree_nm_indiv]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ㄀　ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䌀爀攀愀琀攀猀 愀 渀攀眀 琀愀最 琀爀攀攀 渀愀洀攀 眀栀椀挀栀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ 
-- The user must be explicitly registered with 'Reader' role. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开戀爀开琀爀攀攀开渀洀开椀渀搀椀瘀崀  
਀ऀ 䀀洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀           㴀 一唀䰀䰀Ⰰ 
	 @browsing_tree_name nvarchar(50),਀ऀ 䀀搀攀猀挀爀椀瀀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀       㴀 一唀䰀䰀Ⰰ 
	 @listposition int                = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@sidid bigint                           = NULL,਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT_WS(' | ', @message, ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission. ');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  -- Attribute name check਀ऀऀ䤀䘀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 㴀 ✀✀ 
		   SET @browsing_tree_name = NULL;਀ऀऀⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 渀攀眀 渀愀洀攀 椀猀 甀渀椀焀甀攀 
		IF EXISTS (SELECT name ਀ऀऀ ऀऀऀ 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
					WHERE name = @browsing_tree_name) ਀ऀऀऀ䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一愀洀攀一漀琀唀渀椀焀甀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  				SET @message = CONCAT(@message, ' | ', ISNULL(LEFT(@browsing_tree_name, 10), ''), '... | ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NameNotUnique');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 倀攀爀昀漀爀洀 最攀渀攀爀椀挀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀  ⠀䐀漀攀猀 渀漀琀 爀攀焀甀椀爀攀 愀挀挀攀猀猀 琀漀 琀栀攀 琀愀戀氀攀⸀⤀  
		EXEC internal.usp_VALIDATE_mnem_name_descr਀ऀऀऀ䀀洀渀攀洀             㴀 䀀洀渀攀洀漀渀椀挀Ⰰ 
			@attr_name        = @browsing_tree_name,਀ऀऀऀ䀀搀攀猀挀爀            㴀 䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ 
			@data_valn_status = @tempvalidationstatus OUTPUT,਀ऀऀऀ䀀洀攀猀猀最            㴀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		IF @tempvalidationstatus = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @message = CONCAT_WS(' | ', @message, @validationmessage);਀ऀऀऀ䔀一䐀 
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀⴀⴀ 刀攀琀爀椀攀瘀攀 琀栀攀 猀椀搀开椀搀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
	SET @sidid = (SELECT sid_id਀ऀ                䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 
				   WHERE sid = @connectedusersid)਀ 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
		             (mnem,                                 name,         descr,         list_position,  sid_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀Ⰰ 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀Ⰰ  䀀氀椀猀琀瀀漀猀椀琀椀漀渀Ⰰ 䀀猀椀搀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
਀ऀ     䤀䘀 堀䄀䌀吀开匀吀䄀吀䔀⠀⤀ 㰀㸀 　 
            ROLLBACK TRANSACTION;਀ 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Check the entry and retrieve the new row id਀  䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀⤀ 
	  SET @newrecordid = SCOPE_IDENTITY();਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_INS_tag_browsing_tree_node]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 搀漀挀甀洀攀渀琀 琀愀最 椀渀琀漀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀⸀ 
-- Authenticates for controller, editor and reader. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开䤀一匀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀崀  
਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @tag_br_treeid bigint            = NULL,਀ऀ 䀀瀀愀爀攀渀琀椀搀 戀椀最椀渀琀                 㴀 一唀䰀䰀Ⰰ 
	 @invert_tag bit                  = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀攀眀爀攀挀漀爀搀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @newnode nvarchar(4000)          = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@parent_hierarchyid hierarchyid,਀ऀऀ䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		 -- Check the tag tree ID਀ऀ  ऀ  䤀䘀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 　  
			 SET @tag_br_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开戀爀开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag tree id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagTree', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_browsing_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
								       = @tag_br_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 琀爀攀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
				 ELSE  --  A valid tag tree has been supplied.  Check that the user has rights to it. ਀ऀऀऀऀ  䈀䔀䜀䤀一 
					EXEC [internal].[usp_AUTHENTICATE_tag_br_tree]਀ऀऀऀऀऀ   䀀琀愀最开戀爀琀爀攀攀椀搀开攀瀀 㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀Ⰰ 
					   @user_authentication_result_bt = @temp_userauth_status OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					  BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoTagTreePerm', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀倀攀爀洀⸀✀⤀㬀 
਀ऀऀऀऀऀ  䔀一䐀 
				  END਀          䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @tag_id)਀ऀऀ 䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @tag_id), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ 
 ਀ 
  -- Validate the parent ID਀    䤀䘀 䀀瀀愀爀攀渀琀椀搀 㴀 　 
	    SET @parentid = NULL;਀ऀ䤀䘀 䀀瀀愀爀攀渀琀椀搀 䤀匀 一唀䰀䰀 
	   BEGIN਀ऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀漀漀琀 渀漀搀攀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 昀漀爀 琀栀椀猀 琀愀最 琀爀攀攀 
		  IF EXISTS(਀ऀऀ       匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
			     FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀ圀䠀䔀刀䔀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
				      = @tag_br_treeid਀ऀऀऀऀ  䄀一䐀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀ 
				  )਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀刀漀漀琀一漀搀攀䔀砀椀猀琀猀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RootNodeExists');		   ਀ऀऀऀऀऀ 䔀一䐀 
	   END਀ऀ䔀䰀匀䔀 ⴀⴀ 䄀 瀀愀爀攀渀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  一唀䰀䰀 椀猀 瀀攀爀洀椀琀琀攀搀 愀渀搀 眀椀氀氀 戀攀 猀琀漀爀攀搀 愀猀 爀漀漀琀 椀昀 愀 爀漀漀琀 搀漀攀猀 渀漀琀 愀氀爀攀愀搀礀 攀砀椀猀琀⸀ 
	     -- Check that the parent ID exists for that tree ID਀ऀ   䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT browsing_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   browsing_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀瀀愀爀攀渀琀椀搀 
						  AND    tag_browsing_tree_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'ParentNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀愀爀攀渀琀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ 
	   END਀ऀ   ऀऀ  
਀ 
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  END -- END IF @userauthentication_status = 'Pass'਀  
-- Execute the insert query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ   
	  BEGIN TRY਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	    IF @parentid IS NULL਀ऀऀ   匀䔀吀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 㴀 栀椀攀爀愀爀挀栀礀椀搀㨀㨀䜀攀琀刀漀漀琀⠀⤀㬀 ⴀⴀ 䤀昀 渀漀 瀀愀爀攀渀琀Ⰰ 猀攀琀 愀猀 爀漀漀琀 
		ELSE  ਀ऀऀ   䈀䔀䜀䤀一 
		     SELECT @parent_hierarchyid = browsing_tree_hierarchyid  -- Set the parent to @parentid਀ऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
			  WHERE browsing_tree_node_id਀ऀऀऀ        㴀 䀀瀀愀爀攀渀琀椀搀 
			 -- Generate new hierarchy id as child of parent਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 㴀 䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䐀攀猀挀攀渀搀愀渀琀⠀ 
			    (SELECT MAX(browsing_tree_hierarchyid)਀ऀऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
				  WHERE browsing_tree_hierarchyid.IsDescendantOf(@parent_hierarchyid) = 1਀ऀऀऀऀ    䄀一䐀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䰀攀瘀攀氀⠀⤀ 㴀 䀀瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䰀攀瘀攀氀⠀⤀ ⬀ ㄀⤀Ⰰ 一唀䰀䰀⤀㬀 
           END਀ऀऀⴀⴀ 䤀渀猀攀爀琀 琀栀攀 渀攀眀 渀漀搀攀 
		INSERT INTO tagging.tag_browsing_tree_nodes਀ऀऀ            ⠀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀Ⰰ  琀愀最开椀搀Ⰰ 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 椀渀瘀攀爀琀开琀愀最⤀ 
			 VALUES (@tag_br_treeid, @tag_id,     @new_hierarchyid,     @invert_tag)਀ऀ    匀䔀吀 䀀渀攀眀爀攀挀漀爀搀椀搀 㴀 匀䌀伀倀䔀开䤀䐀䔀一吀䤀吀夀⠀⤀㬀 
		SET @newnode = @new_hierarchyid.ToString();਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ 
	     IF XACT_STATE() <> 0਀            刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_common_obj_lists]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all common object list records਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_common_obj_lists]਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '';਀ 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
			 coln.list_name                 AS 'Common Object List Name',਀ऀ         挀漀⸀漀戀樀攀挀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 一愀洀攀✀Ⰰ 
	         ISNULL(co.mnem, '')            AS 'Common Object Mnemonic',਀             䤀匀一唀䰀䰀⠀挀漀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
             co.common_object_id            AS 'Common Object ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
			 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀ 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
			 col.list_position              AS 'List Position'਀ऀ    䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
		LEFT JOIN com_obj.common_object_attributes AS coa਀ऀऀ      伀一   挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			      = co.common_object_attribute_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
		      ON   col.common_object_id਀ऀऀऀ      㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
		LEFT JOIN com_obj.common_object_list_names AS coln਀ऀऀ      伀一    挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			      =  col.common_object_list_id਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	END CATCH਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开挀漀洀洀漀渀开漀戀樀攀挀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 挀漀洀洀漀渀 漀戀樀攀挀琀 爀攀挀漀爀搀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开挀漀洀洀漀渀开漀戀樀攀挀琀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	         co.object_name                 AS 'Common Object Name',਀ऀ         䤀匀一唀䰀䰀⠀挀漀⸀洀渀攀洀Ⰰ ✀✀⤀            䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(co.description, '')     AS 'Description',਀             挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀            䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䤀䐀✀Ⰰ 
			 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀ 
	    FROM com_obj.common_objects  AS co਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 挀漀愀 
		      ON   coa.common_object_attribute_id਀ऀऀऀ      㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
    ORDER BY 'Common Object Name';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	     CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ  䔀䰀匀䔀 
		   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀挀开戀礀开昀渀挀琀开氀猀琀开渀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document data linked to duty function lists according to a general field name  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_dc_by_fnct_lst_nm] ਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ    
	  @formid bigint                   = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm -- Apply the permission filter. ਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid       --### The search criteria    ਀ऀऀऀऀऀ   ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_dc_by_funct_fld_nm]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 搀愀琀愀 氀椀渀欀攀搀 琀漀 搀甀琀礀 昀甀渀挀琀椀漀渀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀挀开戀礀开昀甀渀挀琀开昀氀搀开渀洀崀  
      @genfield_nameid bigint          = NULL,   ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
 ਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_function_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀⸀  
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀       ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
					   )਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀挀开戀礀开瀀瀀氀开氀猀琀开渀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document data linked to people lists according to a general field name  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_dc_by_ppl_lst_nm] ਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ    
	  @formid bigint                   = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm -- Apply the permission filter. ਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid       --### The search criteria    ਀ऀऀऀऀऀ   ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_dcs_by_txt_fld_any]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ㄀㈀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 琀攀砀琀 昀椀攀氀搀 䤀䐀⸀ 
-- Differs from usp_SEL_docs_by_text_field in that no filter group is applied ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀挀猀开戀礀开琀砀琀开昀氀搀开愀渀礀崀  
      @doctextnameid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
		  -- Check the doc text name field id਀ऀऀ  䤀䘀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		     BEGIN -- A document doc text name field id has been supplied਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_free_text_values਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN -- Doc text name field is invalid.਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					END਀ऀऀऀ 䔀一䐀 
		  ELSE -- No doc text name field ID has been supplied਀ऀऀऀ䈀䔀䜀䤀一 
			   SET @doctextnameid = (SELECT default_doc_free_text_name_id ਀ऀऀऀ            䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ    䤀䘀  䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			        BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DefFrTextIdNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE  ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀爀吀攀砀琀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀ     䔀一䐀 ⴀⴀ 䔀一䐀 挀栀攀挀欀椀渀最 琀栀攀 搀攀昀愀甀氀琀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
਀   
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀      猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 ⤀ ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀   
			 ਀       ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
			  (SELECT ਀ऀऀऀऀऀ  䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ  
					  docidsCTE.docid         AS docid, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
					  doc_data.field_name_id  AS name_id, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ   
			          doc_data.field_mnemonic AS field_mnemonic,਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
					  doc_data.attr_value     AS attr_value, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			          doc_data.form_position  AS form_position਀ऀऀऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
		  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data ਀ऀऀ   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
				   ON docidsCTE.docid਀ऀऀऀऀऀऀ  㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.doc_count                  AS 'Record',  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ   
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ 
-- ================================================================================਀        匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords');਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	      CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ    䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 挀漀洀洀漀渀漀戀樀攀挀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 漀戀樀攀挀琀 
-- Only lists results for documents which the connected user has permision਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀渀欀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀㬀     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀   
਀ 
  -- Execute the select query਀ ऀऀ䈀䔀䜀䤀一 吀刀夀 
		  SELECT DISTINCT਀ऀऀ         挀漀洀猀氀氀⸀搀漀挀开椀搀                  䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
				 coln.list_name                 AS 'Common Object List Name',਀ऀऀऀऀ 挀漀⸀漀戀樀攀挀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 一愀洀攀✀Ⰰ 
				 ISNULL(co.mnem, '')            AS 'Common Object Mnemonic',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 co.common_object_id            AS 'Common Object ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀऀ 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 col.list_position              AS 'List Position'਀ऀऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
			LEFT JOIN com_obj.common_object_attributes AS coa਀ऀऀऀऀ  伀一   挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
					  = co.common_object_attribute_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
				  ON   col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
			LEFT JOIN com_obj.common_object_list_names AS coln਀ऀऀऀऀ  伀一    挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  =  col.common_object_list_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 䄀匀 挀漀洀猀氀氀 
				  ON       col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  AND  col.common_object_list_id਀ऀऀऀऀऀ  㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			INNER JOIN base.document_id_list AS searchtable਀ऀऀऀ       伀一         挀漀洀猀氀氀⸀搀漀挀开椀搀 
				      =  searchtable.doc_id਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀   
			ORDER BY 'Document ID', 'Common Object List Name', 'List Position';਀  ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'ZeroRecords', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		  SET @transaction_status = 'Good';਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
			 CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ  䔀䰀匀䔀 
			   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
		਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_doc_com_obj_rb_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all document common object radio button list object਀ⴀⴀ 伀渀氀礀 氀椀猀琀猀 爀攀猀甀氀琀猀 昀漀爀 搀漀挀甀洀攀渀琀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀椀漀渀 
-- Output is a list of common objects਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_com_obj_rb_lnk]਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records where retrieved਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @data_validation_status nchar(10)  = 'Pass',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN();     -- The username ਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀   
  -- Execute the select query਀ ऀऀ䈀䔀䜀䤀一 吀刀夀 
		  SELECT DISTINCT਀ऀऀ         挀漀爀戀氀氀⸀搀漀挀开椀搀                  䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
				 coln.list_name                 AS 'Common Object List Name',਀ऀऀऀऀ 挀漀⸀漀戀樀攀挀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 一愀洀攀✀Ⰰ 
				 ISNULL(co.mnem, '')            AS 'Common Object Mnemonic',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 co.common_object_id            AS 'Common Object ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀऀ 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 col.list_position              AS 'List Position'਀ऀऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
			LEFT JOIN com_obj.common_object_attributes AS coa਀ऀऀऀऀ  伀一   挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
					  = co.common_object_attribute_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
				  ON   col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
			LEFT JOIN com_obj.common_object_list_names AS coln਀ऀऀऀऀ  伀一    挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  =  col.common_object_list_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 挀漀爀戀氀氀 
				  ON       col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀爀戀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  AND  col.common_object_list_id਀ऀऀऀऀऀ  㴀 挀漀爀戀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			INNER JOIN base.document_id_list AS searchtable਀ऀऀऀ       伀一         挀漀爀戀氀氀⸀搀漀挀开椀搀 
				      =  searchtable.doc_id਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀  
			ORDER BY 'Document ID', 'Common Object List Name', 'List Position';਀  ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'ZeroRecords', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		  SET @transaction_status = 'Good';਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
			 CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ  䔀䰀匀䔀 
			   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
		਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_doc_date_fields]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 搀愀琀攀 昀椀攀氀搀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开搀愀琀攀开昀椀攀氀搀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	BEGIN TRY਀ऀऀ  匀䔀䰀䔀䌀吀  
				 attr_name         AS 'Date Field Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 ISNULL(descr, '') AS 'Description',਀ऀऀऀऀ 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  䄀匀 ✀䐀漀挀甀洀攀渀琀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
			FROM doc_attr.doc_date_field_names AS ddfn਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀䐀愀琀攀 䘀椀攀氀搀 一愀洀攀✀㬀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @transactionmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
			    SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @zerorecordsmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
		       SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀ    䔀一䐀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	     CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ  䔀䰀匀䔀 
		   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开椀搀开挀漀渀琀愀椀渀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 22-12-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs where the doc id contains a given string.਀ⴀⴀ 䤀渀挀氀甀搀攀猀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  䐀漀攀猀 渀漀琀 愀瀀瀀氀礀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_id_contains] ਀     
      @likestring nvarchar(50)         = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
	    @temp_userauth_status nchar(10)  = 'Fail',਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
 -- Data validation	਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ 
		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀ 
਀ऀऀ ⴀⴀ 䄀搀搀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀⌀⌀⌀⌀⌀⌀⌀ 
਀    
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
    END -- End user authentication = Pass		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀    䄀匀 搀漀挀椀搀 
		  FROM base.document_id_list AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE (searchtable.doc_id LIKE '%' + @likestring + '%') -- Filter by @likestring਀            ⤀Ⰰ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document    ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开戀礀开搀漀挀开吀嘀䘀⠀䀀搀漀挀甀洀攀渀琀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀   匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numrecords = ISNULL(@numrecords, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开椀渀琀开昀椀攀氀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 昀椀攀氀搀 渀愀洀攀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开椀渀琀开昀椀攀氀搀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	         attr_name         AS 'Document Integer Field Name',਀ऀ         䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(descr, '') AS 'Description',਀             搀漀挀开椀渀琀开渀愀洀攀开椀搀   䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀渀琀攀最攀爀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
	    FROM doc_attr.doc_integer_field_names AS difn਀    伀刀䐀䔀刀 䈀夀 ✀䐀漀挀甀洀攀渀琀 䤀渀琀攀最攀爀 䘀椀攀氀搀 一愀洀攀✀㬀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @transactionmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
			    SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @zerorecordsmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
		       SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀ    䔀一䐀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	     CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ  䔀䰀匀䔀 
		   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 搀愀琀愀 昀爀漀洀 琀栀攀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 琀愀戀氀攀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀猀崀  
਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀ 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
		      dmsln.doc_ms_list_id     AS 'Doc Multi-Select List ID',਀ऀऀ      搀洀猀氀渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ 
			  dmsln.list_position      AS 'Name List Position',਀ऀ          搀洀猀愀⸀搀漀挀开洀猀开愀琀琀爀开椀搀      䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
	          ISNULL(dmsa.mnem, '')    AS Mnemonic, ਀ऀऀऀ  搀洀猀愀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ  
	          ISNULL(dmsa.descr, '')   AS Description, ਀ऀ          搀洀猀愀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	     FROM doc_attr.doc_multi_select_attributes AS dmsa਀    䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 搀洀猀氀渀 
           ON dmsln.doc_ms_list_id = dmsa.doc_ms_list_id਀ऀ 伀刀䐀䔀刀 䈀夀 ✀一愀洀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
਀  ऀ    䤀䘀 ⠀䀀䀀刀伀圀䌀伀唀一吀 㴀 　⤀ 
	      BEGIN਀ऀ        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                 @message_id   = 'ZeroRecords', ਀                 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
		  END਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'Success', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	    IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	    SET @transaction_status = 'Good';਀  䔀一䐀 吀刀夀 
  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
  END CATCH਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开洀猀开氀椀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 搀愀琀愀 昀爀漀洀 琀栀攀 搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开洀猀开氀椀猀琀猀崀  
਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
	          doc_ms_list_id    AS 'Doc Multi-Select List ID', ਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			  attr_name         AS 'Doc Multi-Select List Name', ਀ऀ          䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	          list_position     AS 'List Position' ਀ऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
     ORDER BY list_position;਀  ऀ    䤀䘀 ⠀䀀䀀刀伀圀䌀伀唀一吀 㴀 　⤀ 
	      BEGIN਀ऀ        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                 @message_id   = 'ZeroRecords', ਀                 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀ            匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	         ELSE ਀ऀऀ         匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
		  END਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'Success', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	    IF @tempmessage IS NOT NULL ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	    SET @transaction_status = 'Good';਀  䔀一䐀 吀刀夀 
  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
  END CATCH਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀⸀ 
-- Selects all doc radio button attributes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 琀栀攀 氀椀猀琀 漀昀 愀琀琀爀椀戀甀琀攀猀Ⰰ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀崀  
਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀㬀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
	          frbln.doc_radiob_list_id AS 'Doc Radio Button List ID',਀ऀऀ      昀爀戀氀渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
			  frbln.list_position      AS 'Name List Position',਀ऀ          昀爀戀愀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀  䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
	          ISNULL(frba.mnem, '')    AS Mnemonic, ਀ऀऀऀ  昀爀戀愀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ  
	          ISNULL(frba.descr, '')   AS Description, ਀ऀ          昀爀戀愀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	     FROM doc_attr.doc_radio_button_attributes AS frba਀    䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀爀戀氀渀 
           ON frbln.doc_radiob_list_id = frba.doc_radiob_list_id਀ऀ 伀刀䐀䔀刀 䈀夀 ✀一愀洀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䄀琀琀爀椀戀甀琀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
਀  ऀ    䤀䘀 ⠀䀀䀀刀伀圀䌀伀唀一吀 㴀 　⤀ 
	      BEGIN਀ऀ        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                 @message_id   = 'ZeroRecords', ਀                 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
		  END਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'Success', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	    IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	    SET @transaction_status = 'Good';਀  䔀一䐀 吀刀夀 
  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
਀ 
  END CATCH਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_doc_radiob_lists]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ　㘀ⴀ㈀　㈀㌀ 
-- Description:	Selects all data from the doc_radio_button_list_names table਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_radiob_lists] ਀ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀ          搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀          䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ  
	          ISNULL(mnem, '')            AS Mnemonic, ਀ऀऀऀ  愀琀琀爀开渀愀洀攀                   䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ  
	          ISNULL(descr, '')           AS Description, ਀ऀ          䤀匀一唀䰀䰀⠀氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ 　⤀    䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ  
			  ISNULL(restricted, 0)       AS 'Restricted'਀ऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
     ORDER BY 'List Position';਀  ऀ    䤀䘀 ⠀䀀䀀刀伀圀䌀伀唀一吀 㴀 　⤀ 
	      BEGIN਀ऀ        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                 @message_id   = 'ZeroRecords', ਀                 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀ            匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	         ELSE ਀ऀऀ         匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
		  END਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'Success', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	    IF @tempmessage IS NOT NULL ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	    SET @transaction_status = 'Good';਀  䔀一䐀 吀刀夀 
  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
  END CATCH਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_doc_real_fields]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Selects all document real number field names਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_real_fields]਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ          愀琀琀爀开渀愀洀攀         䄀匀 ✀䐀漀挀甀洀攀渀琀 刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
	          ISNULL(mnem, '')  AS 'Mnemonic',਀              䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
              doc_real_name_id  AS 'Document Real Number Field Name ID'਀ऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀爀渀昀渀 
     ORDER BY 'Document Real Number Field Name';਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	  SET @transaction_status = 'Good';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
	    END਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @transactionmessage = @tempmessage + ' | ' + ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
	END CATCH਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开琀攀砀琀开昀椀攀氀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 渀愀洀攀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀开琀攀砀琀开昀椀攀氀搀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	          attr_name             AS 'Document Free Text Field Name',਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀      䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
              ISNULL(descr, '')     AS 'Description',਀              搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 ✀䐀漀挀甀洀攀渀琀 䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
	     FROM doc_attr.doc_free_text_field_names AS dftfn਀     伀刀䐀䔀刀 䈀夀 ✀䐀漀挀甀洀攀渀琀 䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀 一愀洀攀✀㬀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @transactionmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
			    SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @zerorecordsmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
		       SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀ    䔀一䐀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	     CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ  䔀䰀匀䔀 
		   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_doc_xrefs_by_doc]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Lists the metadata for documents and also files linked to the documents, for a given document, by cross reference.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀⸀  䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_doc_xrefs_by_doc] ਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ   
	  @xref_typeid bigint              = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀                     㴀 一唀䰀䰀Ⰰ 
		@docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;  ਀ 
 -- Data validation	਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
	  -- Check the document id਀ऀ      䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		     SET @documentid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
			 END਀ 
		  ELSE  -- doc id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 
					   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀऀऀऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
							 @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						 BEGIN -- Doc id does not exist or the user does not have edit permission for਀ऀऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀Ⰰ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀Ⰰ ✀⸀⸀⸀ ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						   ELSE ਀ऀऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						 END਀ऀऀऀऀ䔀一䐀 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 椀搀 
		  IF @xref_typeid = 0਀ऀऀऀ 匀䔀吀 䀀砀爀攀昀开琀礀瀀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check cross-reference id has been supplied਀ऀऀ  䤀䘀 䀀砀爀攀昀开琀礀瀀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoXrefTypeID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀堀爀攀昀吀礀瀀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the cross reference id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 砀爀攀昀开琀礀瀀攀开椀搀 
			                 FROM xref.cross_reference_types਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 砀爀攀昀开琀礀瀀攀开椀搀 㴀 䀀砀爀攀昀开琀礀瀀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'XrefTypeIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀  䤀䐀㨀✀ ⬀ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀砀爀攀昀开琀礀瀀攀椀搀⤀⤀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 堀爀攀昀吀礀瀀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END  ਀ 
਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀砀爀攀昀开搀漀挀开椀搀   䄀匀 搀漀挀椀搀 
		  FROM xref.doc_cross_references AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.xref_doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀  
		WHERE searchtable.xref_type_id = @xref_typeid)     --### The search criteria    ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开戀爀开琀爀开渀漀搀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects all document IDs according linked to a given browsing tag. No filtering is applied਀ⴀⴀ 愀渀搀 渀漀 昀椀氀攀 爀攀挀漀爀搀猀 愀爀攀 椀渀挀氀甀搀攀搀⸀  
-- The search comprises a logical AND of all of the ancestors of the given tag, including the tag.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
-- If no tag tree ID is supplied then the default is retrieved from the global settings table.਀ⴀⴀ 䤀昀 䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 椀猀 愀渀礀 瘀愀氀甀攀 漀琀栀攀爀 琀栀愀渀 ✀伀一✀ 琀栀攀渀 琀栀攀 琀愀最 搀攀猀挀攀渀搀愀渀琀猀 眀椀氀氀 渀漀琀 戀攀 爀攀琀爀椀攀瘀攀搀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀ऀ 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开戀爀开琀爀开渀漀搀攀崀  
਀      䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀Ⰰ     
	  @tag_treeid bigint               = NULL,   -- An optional tag tree to be applied to the tag to retrieve descendants of the tag.਀ऀ  䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 渀瘀愀爀挀栀愀爀⠀㌀⤀     㴀 ✀伀一✀Ⰰ   ⴀⴀ 䄀 猀眀椀琀挀栀 眀栀椀挀栀 搀攀琀攀爀洀椀渀攀猀 眀栀攀琀栀攀爀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 最椀瘀攀渀 琀愀最 愀爀攀 椀渀挀氀甀搀攀搀⸀ 
	  @formid bigint                   = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㐀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;  ਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 IF @tag_br_tree_node_id = 0਀    匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 㴀 一唀䰀䰀㬀 
 IF @tag_br_tree_node_id IS NULL਀ ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoNode');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
  ELSE -- A node ID has been supplied.  Check if it exists. ਀    䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT browsing_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   browsing_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TreeNodeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ऀ   䔀一䐀 
਀    ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 琀愀最 琀爀攀攀 
 	  	  IF @tag_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   -- Get the default tag tree ID from global settings਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 搀攀昀愀甀氀琀开琀愀最开琀爀攀攀开椀搀 
					  FROM base.global_settings_groups਀ऀऀऀऀऀ 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀㬀 
	          END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
								       = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 琀愀最 愀琀 琀栀攀 最椀瘀攀渀 戀爀漀眀猀椀渀最 琀爀攀攀 渀漀搀攀Ⰰ 瀀氀甀猀 愀氀氀 椀琀猀 愀渀挀攀猀琀漀爀猀⸀ 
		-- For each of those tags, if @tag_descendants = 'ON' then retrieve all of their਀ऀऀⴀⴀ 搀攀猀挀攀渀搀愀渀琀猀 昀爀漀洀 琀栀攀 最椀瘀攀渀 琀愀最 琀爀攀攀⸀ 
		-- If the invert_tag flag is true, then exclude all document IDs which are linke to the ਀ऀऀⴀⴀ 椀渀瘀攀爀琀攀搀 琀愀最Ⰰ 瀀氀甀猀 愀氀氀 椀琀猀 搀攀猀挀攀渀搀愀渀琀 琀愀最猀⸀  
		-- Select all the documents linked to all of the tags. ਀ 
            WITH BrowsingTreeAncestors AS (਀                 ⴀⴀ 䜀攀琀 琀栀攀 猀瀀攀挀椀昀椀攀搀 渀漀搀攀 愀渀搀 愀氀氀 椀琀猀 愀渀挀攀猀琀漀爀猀Ⰰ 攀砀挀氀甀搀椀渀最 琀栀攀 爀漀漀琀 渀漀搀攀 
                 SELECT tbtna.tag_id, tbtna.invert_tag਀                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 琀戀琀渀愀 
                 JOIN tagging.tag_browsing_tree_nodes tbtn਀                      伀一 琀戀琀渀愀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
                     AND tbtn.browsing_tree_hierarchyid.IsDescendantOf(tbtna.browsing_tree_hierarchyid) = 1਀                圀䠀䔀刀䔀 琀戀琀渀⸀戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 
				  AND tbtna.browsing_tree_hierarchyid <> hierarchyid::GetRoot()਀             ⤀Ⰰ 
             TagTreeDescendants AS (਀                 ⴀⴀ 䜀攀琀 愀氀氀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 琀愀最猀 ⠀椀渀挀氀甀搀椀渀最 琀栀攀 琀愀最猀 琀栀攀洀猀攀氀瘀攀猀⤀ 椀昀 䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 椀猀 ✀伀一✀ 
                 -- IMPORTANT: Preserve the originating ancestor tag_id and invert_tag flag਀                 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 戀琀愀⸀琀愀最开椀搀 䄀匀 愀渀挀攀猀琀漀爀开琀愀最开椀搀Ⰰ 䤀匀一唀䰀䰀⠀戀琀愀⸀椀渀瘀攀爀琀开琀愀最Ⰰ 　⤀ 䄀匀 椀渀瘀攀爀琀开琀愀最Ⰰ 琀琀搀⸀琀愀最开椀搀 
                 FROM BrowsingTreeAncestors bta਀                 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 琀琀渀 伀一 戀琀愀⸀琀愀最开椀搀 㴀 琀琀渀⸀琀愀最开椀搀 䄀一䐀 琀琀渀⸀琀愀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀椀搀 
                 JOIN tagging.tag_tree_nodes ttd਀                     伀一 琀琀搀⸀琀愀最开琀爀攀攀开椀搀 㴀 琀琀渀⸀琀愀最开琀爀攀攀开椀搀 
                    AND (ttd.tag_id = ttn.tag_id਀                     伀刀 ⠀䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 㴀 ✀伀一✀ 䄀一䐀 琀琀搀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀⤀⤀ 
             ),਀ऀⴀⴀ 䌀漀甀渀琀 漀昀 搀椀猀琀椀渀挀琀 渀漀渀ⴀ椀渀瘀攀爀琀攀搀 愀渀挀攀猀琀漀爀 琀愀最猀 ⠀琀栀攀 渀甀洀戀攀爀 漀昀 䄀一䐀 挀漀渀搀椀琀椀漀渀猀⤀ 
             NonInvertedAncestorCount AS (਀                 匀䔀䰀䔀䌀吀 䌀伀唀一吀⠀䐀䤀匀吀䤀一䌀吀 愀渀挀攀猀琀漀爀开琀愀最开椀搀⤀ 䄀匀 琀愀最开挀漀甀渀琀 
                 FROM TagTreeDescendants਀                 圀䠀䔀刀䔀 椀渀瘀攀爀琀开琀愀最 㴀 　 
             ),਀             䤀渀挀氀甀搀攀搀䐀漀挀猀 䄀匀 ⠀ 
                 -- Get documents linked to ALL non-inverted tag groups (logical AND)਀                 匀䔀䰀䔀䌀吀 琀搀氀⸀搀漀挀开椀搀 
                 FROM TagTreeDescendants ttd਀                 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 琀搀氀 伀一 琀琀搀⸀琀愀最开椀搀 㴀 琀搀氀⸀琀愀最开椀搀 
                 WHERE ttd.invert_tag = 0਀                 䜀刀伀唀倀 䈀夀 琀搀氀⸀搀漀挀开椀搀 
                 HAVING COUNT(DISTINCT ttd.ancestor_tag_id) = (SELECT tag_count FROM NonInvertedAncestorCount)਀             ⤀Ⰰ 
             ExcludedDocs AS (਀                 ⴀⴀ 䜀攀琀 愀氀氀 搀漀挀甀洀攀渀琀猀 氀椀渀欀攀搀 琀漀 䄀一夀 椀渀瘀攀爀琀攀搀 琀愀最 ⠀漀爀 椀琀猀 搀攀猀挀攀渀搀愀渀琀猀⤀ 
                 SELECT DISTINCT tdl.doc_id਀                 䘀刀伀䴀 吀愀最吀爀攀攀䐀攀猀挀攀渀搀愀渀琀猀 琀琀搀 
                 JOIN tagging.tag_to_document_links tdl ON ttd.tag_id = tdl.tag_id਀                 圀䠀䔀刀䔀 琀琀搀⸀椀渀瘀攀爀琀开琀愀最 㴀 ㄀ 
             ),਀             吀愀最最攀搀䐀漀挀猀 䄀匀 ⠀ 
                 -- Final result: documents included by AND logic, but not excluded by inverted tags਀                 匀䔀䰀䔀䌀吀 搀漀挀开椀搀 
                 FROM IncludedDocs਀                 圀䠀䔀刀䔀 搀漀挀开椀搀 一伀吀 䤀一 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀 䘀刀伀䴀 䔀砀挀氀甀搀攀搀䐀漀挀猀⤀ 
             ),਀ ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
		docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM TaggedDocs AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀⤀ ऀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开挀漀开洀猀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document metadata by document common object multi-select link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 昀漀爀洀 椀搀⸀ 
-- Differs from reading.usp_SEL_docs_by_co_ms_attr in that it does not apply a filter group਀ⴀⴀ 愀渀搀 搀漀攀猀 渀漀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀 洀攀琀愀搀愀琀愀⸀  
਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开挀漀开洀猀开愀琀琀爀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ  
  	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                  = NULL OUTPUT,਀ऀ 䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	 @outputformid bigint             = NULL OUTPUT,਀ऀ 䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀    㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)             = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ऀⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
		 -- Check the common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀ऀऀऀऀऀ 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
  --============================================਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀  ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	  ELSE ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
	END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
--===========================================================================਀ 
  -- Select documents metadata for a given transaction group id.  ਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM com_obj.doc_to_com_obj_ms_list_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE     searchtable.common_object_list_id = @commonobjlistid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ ऀ 
			 ਀       ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
			  (SELECT ਀ऀऀऀऀऀ  䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ  
					  docidsCTE.docid         AS docid, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
					  doc_data.field_name_id  AS name_id, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ   
			          doc_data.field_mnemonic AS field_mnemonic,਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
					  doc_data.attr_value     AS attr_value, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			          doc_data.form_position  AS form_position਀ऀऀऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
		  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data ਀ऀऀ   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
				   ON docidsCTE.docid਀ऀऀऀऀऀऀ  㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.doc_count                  AS 'Record',  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ   
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ 
-- ================================================================================਀        匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords');਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	      CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ    䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开挀漀开爀戀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document metadata by document common object radio button link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 昀漀爀洀 椀搀⸀ 
-- Differs from usp_SEL_docs_by_co_rb_attr in that it does not apply a filter group਀ⴀⴀ 愀渀搀 搀漀攀猀 渀漀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀 洀攀琀愀搀愀琀愀⸀  
਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开挀漀开爀戀开愀琀琀爀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
     @commonobjlistid bigint          = NULL,਀ऀ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ  
  	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                  = NULL OUTPUT,਀ऀ 䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	 @outputformid bigint             = NULL OUTPUT,਀ऀ 䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀    㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)             = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ऀⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
		 -- Check the common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀ऀऀऀऀऀ 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
  --============================================਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀  ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	  ELSE ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
	END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
--===========================================================================਀ 
  -- Select documents metadata for a given common object radio button attribute.  ਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM com_obj.doc_to_com_obj_radiob_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE     searchtable.common_object_list_id = @commonobjlistid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀ ऀ 
			 ਀       ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
			  (SELECT ਀ऀऀऀऀऀ  䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ  
					  docidsCTE.docid         AS docid, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
					  doc_data.field_name_id  AS name_id, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ   
			          doc_data.field_mnemonic AS field_mnemonic,਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
					  doc_data.attr_value     AS attr_value, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			          doc_data.form_position  AS form_position਀ऀऀऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
		  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data ਀ऀऀ   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
				   ON docidsCTE.docid਀ऀऀऀऀऀऀ  㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.doc_count                  AS 'Record',  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ   
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ 
-- ================================================================================਀        匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords');਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	      CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ    䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开搀漀挀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 12-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all documents linked to a given document group਀ⴀⴀ 伀渀氀礀 愀瀀瀀氀椀攀猀 琀漀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 昀漀爀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 栀愀猀 栀愀猀 爀椀最栀琀猀 琀漀 
-- and only lists document IDs which the connected user has rights to.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  䴀攀琀愀搀愀琀愀 昀漀爀 爀攀氀愀琀攀搀 昀椀氀攀猀 椀猀 渀漀琀 椀渀挀氀甀搀攀搀⸀    
-- Output is a table of documents, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_doc_group] ਀ 
     @docgroupid bigint               = NULL, ਀ऀ 䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrows bigint                  = NULL OUTPUT,਀ऀ 䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	 @outputformid bigint             = NULL OUTPUT,਀ऀ 䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),  ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @docgroupid = 0਀ऀऀऀ 匀䔀吀 䀀搀漀挀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  䤀䘀 䀀搀漀挀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document group id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocGroupId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䜀爀漀甀瀀䤀搀⸀✀⤀㬀 
			 END਀ 
		   IF @data_validation_status = 'Pass'  -- doc group id has been supplied਀ऀऀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 最爀漀甀瀀 
		 -- This also returns negative if the id does not exist਀ऀऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开最爀瀀崀  
				@docgroupid_to_check_vp = @docgroupid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
		  IF @temp_userauth_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
				SET @userauthentication_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀䐀漀挀䜀爀漀甀瀀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', 'Document group ID: ', ISNULL(CONVERT(nvarchar(10), @docgroupid), 'NULL'), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocGroupPermission.');਀ऀऀऀ䔀一䐀 
਀   ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--============================================================================਀ऀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  WITH docidsCTE AS (਀ऀ     匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀       䄀匀 䤀䐀 
		   FROM xref.doc_group_links AS searchtable਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
	    WHERE searchtable.doc_group_id = @docgroupid਀                        ⤀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.ID) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀䤀䐀            䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀䤀䐀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀䤀䐀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
		    ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
-- ===================================================਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开搀琀礀开昀甀渀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document data according to a duty function.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_dty_funct] ਀      䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ     
	  @formid bigint                   = NULL,   ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀   ⴀⴀ 䐀甀琀礀 昀甀渀挀琀椀漀渀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @functionid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
		  IF @functionid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䐀甀琀礀 昀甀渀挀琀椀漀渀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @functionid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT function_id਀ऀऀऀऀऀऀऀऀऀ 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
									WHERE function_id = @functionid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ 
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_function_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀⸀  
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.function_id਀ऀऀ               㴀 䀀昀甀渀挀琀椀漀渀椀搀       ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
					   )਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-07-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document data according to a file ID.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开昀椀氀攀崀  
      @fileid bigint                   = NULL,  ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),    ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileauthenticationstatus nchar(10) = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ ऀ 
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
 -- Data validation	਀ 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	   ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀⤀Ⰰ     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
           	਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀       
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                            䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				DENSE_RANK() OVER (ORDER BY f.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, NULL, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.doc_count                  AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀   匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀    
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开昀甀渀挀琀开氀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document data according to a function list.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_funct_lst] ਀      䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @formid bigint                   = NULL,   ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀  ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @functionlistid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @functionlistid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @functionlistid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT function_list_id਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 
									WHERE function_list_id = @functionlistid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ 
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_function_list_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.function_list_id = @functionlistid )     --### The search criteria    ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开瀀攀漀瀀氀攀开氀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document data according to a people list.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_people_lst] ਀      䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ     
	  @formid bigint                   = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
		  --  Check the search criteria name field id਀   ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @peoplelistid = 0 ਀ऀऀऀ 匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @peoplelistid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @peoplelistid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT people_list_id਀ऀऀऀऀऀऀऀऀऀ 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
									WHERE people_list_id = @peoplelistid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ 
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_people_list_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.people_list_id਀ऀऀ               㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀      ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
					   )਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开爀愀搀椀漀开戀琀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document ID data according to a document radio button.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_radio_btn] ਀      䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ     
	  @formid bigint                   = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀ऀऀ䤀䘀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 㴀 　 
		   SET @docradiobattrid = NULL;਀ऀऀ䤀䘀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀  
			BEGIN  -- The search criteria was not supplied਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrID',  -- ###਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			END ਀ऀऀ䔀䰀匀䔀 ⴀⴀ 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀  
				BEGIN -- A document search criteria name field id has been supplied   ###਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀        
									FROM doc_attr.doc_radio_button_attributes  ਀ऀऀऀ  ऀ ऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
					BEGIN -- Field is invalid.਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀⤀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_by_tag]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 琀愀最⸀ 一漀 昀椀氀琀攀爀椀渀最 椀猀 愀瀀瀀氀椀攀搀 
-- and no file records are included. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
-- If no tag tree ID is supplied then the default is retrieved from the global settings table.਀ⴀⴀ 䤀昀 䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 椀猀 愀渀礀 瘀愀氀甀攀 漀琀栀攀爀 琀栀愀渀 ✀伀一✀ 琀栀攀渀 琀栀攀 琀愀最 搀攀猀挀攀渀搀愀渀琀猀 眀椀氀氀 渀漀琀 戀攀 爀攀琀爀椀攀瘀攀搀⸀  
-- This SP differs from SEL_docs_by_tag in that no filter group is applied and not files data is retrieved. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_tag] ਀      䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ     
	  @tag_treeid bigint               = NULL,   -- An optional tag tree to be applied to the tag to retrieve descendants of the tag.਀ऀ  䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 渀瘀愀爀挀栀愀爀⠀㌀⤀     㴀 ✀伀一✀Ⰰ   ⴀⴀ 䄀 猀眀椀琀挀栀 眀栀椀挀栀 搀攀琀攀爀洀椀渀攀猀 眀栀攀琀栀攀爀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 最椀瘀攀渀 琀愀最 愀爀攀 椀渀挀氀甀搀攀搀⸀ 
	  @formid bigint                   = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㐀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
 -- Validate the tag tree਀ ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag tree id has not been supplied.਀ऀऀऀ   ⴀⴀ 䜀攀琀 琀栀攀 搀攀昀愀甀氀琀 琀愀最 琀爀攀攀 䤀䐀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 
					SELECT @tag_treeid = default_tag_tree_id਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
					 WHERE setting_group_name = 'Master';਀ऀ          䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
 	  -- Check if a tag was supplied਀ऀ  䤀䘀 䀀琀愀最开椀搀 㴀 　  
	    SET @tag_id = NULL;਀ऀ  䤀䘀 䀀琀愀最开椀搀 䤀匀 一唀䰀䰀 
	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoTagID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䤀䐀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @tag_id)਀ऀऀऀ 䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_id), '  ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀一䐀 
਀ 
 ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		-- Select all the documents linked to the given tag਀ऀऀऀ圀䤀吀䠀 䈀愀猀攀吀愀最 䄀匀 ⠀ 
				SELECT tag_id, tag_tree_hierarchyid਀ऀऀऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
				WHERE tag_id = @tag_id਀ऀऀऀऀ䄀一䐀 琀愀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀椀搀 
			),਀ऀऀऀ吀愀最最攀搀䐀漀挀猀 䄀匀 ⠀ 
				SELECT DISTINCT tdl.doc_id਀ऀऀऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 䄀匀 琀琀渀 
				INNER JOIN BaseTag AS bt਀ऀऀऀऀऀ伀一 ⠀䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 㴀 ✀伀一✀  
				       AND ttn.tag_tree_hierarchyid.IsDescendantOf(bt.tag_tree_hierarchyid) = 1)਀ऀऀऀऀऀ   伀刀 琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 戀琀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
				INNER JOIN tagging.tag_to_document_links AS tdl਀ऀऀऀऀऀ伀一 琀琀渀⸀琀愀最开椀搀 㴀 琀搀氀⸀琀愀最开椀搀 
਀ऀऀऀऀ唀一䤀伀一 
਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 琀搀氀⸀搀漀挀开椀搀 
				FROM tagging.tag_to_document_links AS tdl਀ऀऀऀऀ圀䠀䔀刀䔀 琀搀氀⸀琀愀最开椀搀 㴀 䀀琀愀最开椀搀 
			),਀ ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
		docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM TaggedDocs AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀⤀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开琀攀砀琀开昀椀攀氀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs and metadata according to the content of a text field using the LIKE operator.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开琀攀砀琀开昀椀攀氀搀 椀渀 琀栀愀琀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_text_field] ਀      䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @likestring nvarchar(max)        = '',	  ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀ 
		  -- Check the doc text name field id਀ऀऀ  䤀䘀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		     BEGIN -- A document doc text name field id has been supplied਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_free_text_values਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN -- Doc text name field is invalid.਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					END਀ऀऀऀ 䔀一䐀 
		  ELSE -- No doc text name field ID has been supplied਀ऀऀऀ䈀䔀䜀䤀一 
			   SET @doctextnameid = (SELECT default_doc_free_text_name_id ਀ऀऀऀ            䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ    䤀䘀  䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			        BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DefFrTextIdNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE  ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀爀吀攀砀琀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀ     䔀一䐀 ⴀⴀ 䔀一䐀 挀栀攀挀欀椀渀最 琀栀攀 搀攀昀愀甀氀琀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
਀   
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀   猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND (਀ऀऀ    ⠀䀀氀椀欀攀猀琀爀椀渀最 䤀匀 一唀䰀䰀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀琀攀砀琀开瘀愀氀甀攀 䤀匀 一唀䰀䰀⤀  ⴀⴀ 䌀愀琀攀爀猀 昀漀爀 猀攀愀爀挀栀椀渀最 昀漀爀 爀攀挀漀爀搀猀 眀栀攀爀攀 琀栀攀 猀琀爀椀渀最 椀猀 一唀䰀䰀 
		    OR (searchtable.text_value LIKE '%' + @likestring + '%' ESCAPE '\') )਀ऀऀ         ⤀ 
			 ਀       ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
			  (SELECT ਀ऀऀऀऀऀ  䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ  
					  docidsCTE.docid         AS docid, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
					  doc_data.field_name_id  AS name_id, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ   
			          doc_data.field_mnemonic AS field_mnemonic,਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
					  doc_data.attr_value     AS attr_value, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			          doc_data.form_position  AS form_position਀ऀऀऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
		  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data ਀ऀऀ   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
				   ON docidsCTE.docid਀ऀऀऀऀऀऀ  㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.doc_count                  AS 'Record',  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ   
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ 
-- ================================================================================਀        匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords');਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	      CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ    䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开甀猀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects documents linked to a given user.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_by_user] ਀      䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ    
	  @formid bigint                   = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
		  --  Check the search criteria name field id਀    ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
		  IF @sidid = 0਀ऀऀऀ 匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			                 FROM user_restr.sid_list AS SL਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开甀猀攀爀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀猀椀搀开椀搀 
		               = @sidid      --### The search criteria    ਀ऀऀऀऀऀ   ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_by_user_fgn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 搀愀琀愀 氀椀渀欀攀搀 琀漀 愀 甀猀攀爀 愀挀挀漀爀搀椀渀最 琀漀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开戀礀开甀猀攀爀开昀最渀崀  
      @genfield_nameid bigint          = NULL,   ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
 ਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_user_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀⸀  
		    ON    searchtable.doc_id਀ऀऀऀ    㴀        瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀       ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
					   )਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开愀昀琀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document ID data according to a document date value after a given date.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_date_after] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ    
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation਀ 
		  --  Check the search criteria name field id਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docdatenameid = 0 ਀ऀऀ     匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docdatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_date_name_id = @docdatenameid) -- Check if the doc date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 
			  AND 	searchtable.date_value > @datevalue    --### The search criteria ਀ऀऀ   
		  )       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开愀渀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 28-12-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document ID data for any documents linked to the given date field  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_date_any] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @formid bigint                   = NULL,   ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  -- Check the doc date name field id਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 　 
		     SET @docdatenameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_date_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_date_name_id = @docdatenameid --### The search criteria ਀ऀऀ   
		  )       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开戀攀昀漀爀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document ID data according to a document date value before a given date.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_date_before] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ     
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docdatenameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docdatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_date_name_id = @docdatenameid) -- Check if the doc date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 
			  AND 	searchtable.date_value < @datevalue    --### The search criteria ਀ऀऀ   
		  )       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document ID data according to if a document date value is between given dates.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_date_between] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @earlier_date datetime2(7)       = NULL,਀ऀ  䀀氀愀琀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀         㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,    ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  -- Check the doc date name field id਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 　 
		     SET @docdatenameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 
		  AND  (searchtable.date_value < @later_date AND searchtable.date_value > @earlier_date)   --### The search criteria value਀ऀऀ   
		  )       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开搀愀琀攀开攀焀甀愀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document ID data according to a document date value.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_date_equals] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀऀ 
਀ 
		  --  Check the search criteria name field id਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docdatenameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docdatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_date_name_id = @docdatenameid) -- Check if the doc date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 
			  AND 	searchtable.date_value = @datevalue    --### The search criteria ਀ऀऀ   
		  )       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开昀漀爀开甀猀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects documents linked to the connected user.  No filter group is applied.਀ⴀⴀ 䐀漀攀猀渀✀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_for_user] ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
    ਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_user_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	        ON searchtable.sid_id਀ऀऀऀ   㴀        猀氀⸀猀椀搀开椀搀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀      ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
					   )਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开椀渀琀开愀渀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files which are linked to the document integer field ID.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_int_any] ਀ऀ  䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docintnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc integer name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ 
     -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 ऀऀ   
		  )       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开椀渀琀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the value for a given integer field is between given values.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开搀漀挀猀开椀渀琀开戀攀琀眀攀攀渀 椀渀 琀栀愀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_int_between] ਀ऀ  䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ    
	  @lower_int_value bigint          = NULL,਀ऀ  䀀甀瀀瀀攀爀开椀渀琀开瘀愀氀甀攀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docintnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc integer name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_integer_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_int_name_id = @docintnameid  --### The search criteria਀ऀऀ  䄀一䐀  
		  (਀ऀऀ    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㸀 䀀氀漀眀攀爀开椀渀琀开瘀愀氀甀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㰀 䀀甀瀀瀀攀爀开椀渀琀开瘀愀氀甀攀⤀ 
		  )	  ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_int_equals]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 椀渀琀攀最攀爀⸀ 
-- Differs from reading.usp_SEL_docs_int_equals in that a filter group is not applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开椀渀琀开攀焀甀愀氀猀崀  
	  @docintnameid bigint             = NULL,   ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docintnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc integer name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
     -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 
			  AND 	searchtable.int_value = @integervalue    --### The search criteria 		  ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_int_grtr_than]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 最爀攀愀琀攀爀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- Differs from reading.usp_SEL_docs_int_greater_than in that a filter group is not applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开椀渀琀开最爀琀爀开琀栀愀渀崀  
	  @docintnameid bigint             = NULL,   ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docintnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc integer name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_integer_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_int_name_id = @docintnameid਀ऀऀऀ  䄀一䐀 ऀ猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㸀 䀀椀渀琀攀最攀爀瘀愀氀甀攀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 ऀऀ   
		  )       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开椀渀琀开氀攀猀猀开琀栀愀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the value for a given integer field is less than a given value.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开搀漀挀猀开椀渀琀开氀攀猀猀开琀栀愀渀 椀渀 琀栀愀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_int_less_than] ਀ऀ  䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ    
	  @integervalue bigint             = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the doc integer name field id਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @docintnameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the integer value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 
			  AND 	searchtable.int_value < @integervalue    --### The search criteria 		  ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_multi_sel_atr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀 洀攀琀愀搀愀琀愀 戀礀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Input is a common object list id and a common object id, an optional filter group id਀ⴀⴀ 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 昀漀爀洀 椀搀⸀ 
-- This differs from usp_SEL_docs_multi_sel_attr in that a filter group is not applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开洀甀氀琀椀开猀攀氀开愀琀爀崀  
	  @docmslistid bigint              = NULL,਀ऀ  䀀搀漀挀洀猀愀琀琀爀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ    
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                                  ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㐀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
 --==============================਀ऀⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docmslistid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docmslistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document multi-select attribute list has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_ms_list_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 
			  	 				 WHERE doc_ms_list_id = @docmslistid) -- Check if the attribute list id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @docmsattrid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docmsattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
਀          ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀愀椀爀 攀砀椀猀琀猀 
		  IF @docmsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT doc_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE doc_ms_attr_id = @docmsattrid਀ऀऀऀऀऀऀऀऀऀ   䄀一䐀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀⤀  
					 BEGIN -- multi-select list id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
  --============================================਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀     猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.doc_ms_attr_id = @docmsattrid਀ऀऀऀ  ⤀ ऀ 
			 ਀       ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀऀऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
			  (SELECT ਀ऀऀऀऀऀ  䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ  
					  docidsCTE.docid         AS docid, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
					  doc_data.field_name_id  AS name_id, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ   
			          doc_data.field_mnemonic AS field_mnemonic,਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
					  doc_data.attr_value     AS attr_value, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			          doc_data.form_position  AS form_position਀ऀऀऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
		  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data ਀ऀऀ   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
				   ON docidsCTE.docid਀ऀऀऀऀऀऀ  㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.doc_count                  AS 'Record',  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ   
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ 
-- ================================================================================਀        匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  			     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ     䔀䰀匀䔀  
			     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords');਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	      CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ    䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
   ਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开爀攀愀氀开愀渀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 28-12-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files which are linked to the given real number ID.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_real_any] ਀ऀ  䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ    
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docrealnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docrealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_real_name_id = @docrealnameid) -- Check if the doc real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀   
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_real_number_values AS searchtable   --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_real_name_id = @docrealnameid  --### The search criteria਀  ऀ   
					)       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开爀攀愀氀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the value for a given real number field is between given values.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开搀漀挀猀开爀攀愀氀开戀攀琀眀攀攀渀 椀渀 琀栀愀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_real_between] ਀ऀ  䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ    
	  @lower_real_value real           = NULL,਀ऀ  䀀甀瀀瀀攀爀开爀攀愀氀开瘀愀氀甀攀 爀攀愀氀           㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docrealnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docrealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_real_name_id = @docrealnameid) -- Check if the doc real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_real_number_values AS searchtable   --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_real_name_id = @docrealnameid  --### The search criteria਀ऀऀ  䄀一䐀    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀 㸀 䀀氀漀眀攀爀开爀攀愀氀开瘀愀氀甀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀 㰀 䀀甀瀀瀀攀爀开爀攀愀氀开瘀愀氀甀攀⤀ऀ 
		  	  ਀ऀऀऀऀऀ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_docs_real_equals]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀猀 攀焀甀愀氀 琀漀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- Differs from reading.usp_SEL_docs_real_equals in that a filter group is not applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开爀攀愀氀开攀焀甀愀氀猀崀  
	  @docrealnameid bigint            = NULL,   ਀ऀ  䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀            㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docrealnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docrealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_real_name_id = @docrealnameid) -- Check if the doc real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		  AND    searchtable.real_value = @realnumbervalue	਀ऀऀ  ऀ   
					)       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开爀攀愀氀开最爀攀愀琀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the value for a given real number field is greater than a given value.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开搀漀挀猀开爀攀愀氀开最爀攀愀琀攀爀开琀栀愀渀 椀渀 琀栀愀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_real_greater] ਀ऀ  䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ    
	  @realnumbervalue real            = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the doc real number name field id਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 　 
		     SET @docrealnameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		  AND    searchtable.real_value > @realnumbervalue	਀ऀऀ  ऀ   
					)       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开爀攀愀氀开氀攀猀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the value for a given real number field is less than a given value.਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开搀漀挀猀开爀攀愀氀开氀攀猀猀开琀栀愀渀 椀渀 琀栀愀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 渀漀琀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_real_less] ਀ऀ  䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ    
	  @realnumbervalue real            = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
		  -- Check the doc real number name field id਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 　 
		     SET @docrealnameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		  AND    searchtable.real_value < @realnumbervalue	਀ऀऀ  ऀ   
					)       ਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      DENSE_RANK() OVER (ORDER BY docidsCTE.docid) AS doc_count,਀ऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM docidsCTE AS df਀  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
   RIGHT JOIN docidsCTE਀ऀ       伀一 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀 
			      = doc_data.doc_id);਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀猀开眀椀琀栀开攀搀开瀀攀爀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀琀甀爀渀猀 琀栀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 搀漀挀甀洀攀渀琀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀⸀  
਀  ⴀⴀ 吀漀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 搀漀挀甀洀攀渀琀 琀栀攀 甀猀攀爀 洀甀猀琀 昀椀爀猀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀愀琀 昀椀氀攀⸀ 
  -- Viewing restrictions override editing permissions.  ਀  ⴀⴀ 䔀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 眀漀爀欀 搀椀昀昀攀爀攀渀琀氀礀 昀爀漀洀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀⸀  圀椀琀栀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀 愀 搀漀挀甀洀攀渀琀 
  -- is viewable by default.  With edit permissions the document is restricted by default. ਀  ⴀⴀ 䄀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 搀漀挀甀洀攀渀琀 椀昀 琀栀攀爀攀 椀猀 愀 挀栀愀椀渀 昀爀漀洀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 琀栀爀漀甀最栀 
  -- either a function list or a people list to a sid in the sid list which is the sid for the user or a sid the user is a member of.਀  ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 搀漀挀甀洀攀渀琀 琀栀攀礀 栀愀瘀攀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
  -- except if the document is linked to a controller document group which is not linked to the connected user. ਀  ⴀⴀ 䤀昀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 琀栀攀渀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 渀漀琀 瀀愀爀琀 漀昀 琀栀愀琀 最爀漀甀瀀 
  -- then the user is excluded from editing rights.਀  ⴀⴀ 吀栀攀爀攀 愀爀攀 琀眀漀 氀愀礀攀爀猀 漀昀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀⸀  䄀琀 漀渀攀 氀攀瘀攀氀Ⰰ 挀漀渀琀爀漀氀氀攀爀猀 愀爀攀 最爀愀渀琀攀搀 攀砀挀氀甀猀椀瘀攀 攀搀椀琀椀渀最 
  -- permissions by an authoriser, referred to as controller level permission. Other controllers cannot alter those permissions.਀  ⴀⴀ 䄀琀 琀栀攀 漀琀栀攀爀 氀攀瘀攀氀 挀漀渀琀爀漀氀氀攀爀猀 最爀愀渀琀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀 琀漀 攀搀椀琀漀爀猀Ⰰ 爀攀昀攀爀爀攀搀 琀漀 愀猀 攀搀椀琀漀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  䌀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀猀 
  -- exclude and override any editor level permission.  A controller cannot delegate permission for a controller level permission. ਀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_docs_with_ed_perm] ਀ⴀⴀ 䐀刀䄀䘀吀 䤀一 倀刀伀䜀刀䔀匀匀 
      @formid bigint                    = NULL,    ਀ऀ  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀   伀唀吀倀唀吀Ⰰ 
	  @transaction_status nvarchar(50)  = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numdocs bigint                   = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)            = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
  	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass',਀  ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 一唀䰀䰀Ⰰ ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),  ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀  渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 一唀䰀䰀Ⰰ 
		@iscontroller nvarchar(5)          = NULL,਀ऀऀ䀀搀漀挀椀猀挀漀渀琀爀漀氀氀攀爀最爀漀甀瀀 渀瘀愀爀挀栀愀爀⠀㔀⤀  㴀 一唀䰀䰀㬀 
਀ 
	DECLARE @AttData TABLE਀ऀ  ⠀ 
  			doc_count bigint,਀ऀऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
			field_type nvarchar(50), ਀ऀऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
			field_name  nvarchar(50),਀ऀऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
			attr_id  bigint,਀ऀऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
			units nvarchar(50),਀ऀऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
	  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
  SET @connectedusersid = SUSER_SID(ORIGINAL_LOGIN()); -- Read the SID of the connected user਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
 IF @transaction_ready = 'Ready'਀ 
  BEGIN਀    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;਀ 
        BEGIN TRY਀            ⴀⴀ 䌀吀䔀 琀漀 最攀琀 愀氀氀 搀漀挀甀洀攀渀琀猀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
            WITH EditableDocsCTE AS (਀                匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 搀椀氀⸀搀漀挀开椀搀 䄀匀 䤀䐀  
                FROM base.document_id_list AS dil਀                䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀  
				       ON   dil.doc_id ਀ऀऀऀऀऀ      㴀 搀最氀⸀搀漀挀开椀搀 
                LEFT JOIN xref.doc_group_names AS dgn ਀ऀऀऀऀ       伀一   搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀  
					      = dgn.doc_group_id਀                䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 挀搀最氀  
				       ON    dil.doc_id ਀ऀऀऀऀऀ      㴀 挀搀最氀⸀搀漀挀开椀搀 
                LEFT JOIN xref.controller_doc_group_names AS cdgn ਀ऀऀऀऀ       伀一   挀搀最氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀  
					      = cdgn.controller_doc_group_name_id਀                圀䠀䔀刀䔀  
                    -- Controller with viewing rights, except for controller groups they're not part of਀                    ⠀䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 䄀一䐀 
                    (cdgl.doc_id IS NULL OR਀                    䔀堀䤀匀吀匀 ⠀ 
                        SELECT 1਀                        䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀搀最猀氀 
                        JOIN user_restr.sid_list AS sl ਀ऀऀऀऀऀऀ  伀一 挀搀最猀氀⸀猀椀搀开椀搀  
						     =  sl.sid_id਀                       圀䠀䔀刀䔀  挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀  
					         = cdgn.controller_doc_group_name_id਀                        䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
                    )))਀                    伀刀 
                    -- Non-controller with edit permissions਀                    ⠀䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀䘀愀椀氀✀ 䄀一䐀 
                    (਀                        ⴀⴀ 吀栀爀漀甀最栀 昀甀渀挀琀椀漀渀 氀椀猀琀 
                        EXISTS (਀                            匀䔀䰀䔀䌀吀 ㄀ 
                            FROM user_restr.doc_group_edit_perm_funct_lst AS dgepfl਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀  
							  ON dgepfl.function_list_id ਀ऀऀऀऀऀऀऀ     㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
                            JOIN people.function_lists AS fl ਀ऀऀऀऀऀऀऀ  伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
							     = fl.function_list_id਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀  
							  ON   fl.function_id ਀ऀऀऀऀऀऀऀ     㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
                            JOIN people.duty_function_sid_links AS dfsl ਀ऀऀऀऀऀऀऀ  伀一     搀昀⸀昀甀渀挀琀椀漀渀开椀搀  
							     = dfsl.function_id਀                            䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀  
							  ON dfsl.sid_id ਀ऀऀऀऀऀऀऀ     㴀 猀氀⸀猀椀搀开椀搀 
                            WHERE dgepfl.doc_group_id ਀ऀऀऀऀऀऀऀ      㴀  搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
                            AND sl.sid = @connectedusersid ਀                        ⤀ 
                        OR਀                        ⴀⴀ 吀栀爀漀甀最栀 瀀攀漀瀀氀攀 氀椀猀琀 
                        EXISTS (਀                            匀䔀䰀䔀䌀吀 ㄀ 
                            FROM user_restr.doc_group_edit_perm_people_lst AS dgeppl਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀  
							  ON dgeppl.people_list_id ਀ऀऀऀऀऀऀऀ     㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
                            JOIN people.people_lists AS pl ਀ऀऀऀऀऀऀऀ  伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
							     = pl.people_list_id਀                            䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀  
							  ON   pl.sid_id ਀ऀऀऀऀऀऀऀ     㴀 猀氀⸀猀椀搀开椀搀 
                           WHERE dgeppl.doc_group_id ਀ऀऀऀऀऀऀऀ     㴀  搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
                            AND sl.sid = @connectedusersid ਀                        ⤀ 
                    ))਀            ⤀Ⰰ 
            docDataCTE AS (਀                匀䔀䰀䔀䌀吀  
                    EditableDocsCTE.ID AS docid, ਀                    搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ  
                    doc_data.field_name_id, ਀                    搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀Ⰰ  
                    doc_data.field_mnemonic, ਀                    搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀Ⰰ  
                    doc_data.attr_value, ਀                    搀漀挀开搀愀琀愀⸀甀渀椀琀猀Ⰰ  
                    doc_data.form_position਀                䘀刀伀䴀 䔀搀椀琀愀戀氀攀䐀漀挀猀䌀吀䔀 
                CROSS APPLY [internal].[ufn_SEL_one_dc_data_by_frm_ITVF](EditableDocsCTE.ID, NULL, @formid) AS doc_data਀            ⤀Ⰰ 
            AttDataCTE AS (਀                匀䔀䰀䔀䌀吀  
                    DENSE_RANK() OVER (ORDER BY docDataCTE.docid) AS doc_count,਀                    搀漀挀䐀愀琀愀䌀吀䔀⸀⨀ 
                FROM docDataCTE਀            ⤀ 
਀            䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀 ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
            SELECT ਀                搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀 
            FROM AttDataCTE;਀ 
            SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
            SELECT ਀                愀搀⸀搀漀挀开挀漀甀渀琀ऀऀऀऀऀ䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
                ad.docid						AS 'Document ID', ਀                愀搀⸀昀椀攀氀搀开琀礀瀀攀ऀऀऀऀऀ䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
                ad.field_name_id				AS 'Name ID', ਀                䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀ऀऀ䄀匀 ✀一愀洀攀✀Ⰰ  
                ISNULL(ad.field_mnemonic, '')	AS 'Mnemonic', ਀                愀搀⸀愀琀琀爀开椀搀ऀऀऀऀऀऀ䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
                ISNULL(ad.attr_value, '')		AS 'Value', ਀                䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀ऀऀऀ䄀匀 ✀唀渀椀琀猀✀Ⰰ 
                ISNULL(ad.form_position, '')	AS 'Position'਀            䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
            ORDER BY Position, 'Record', 'Document ID';਀ 
            SET @numrows = @@ROWCOUNT;਀ 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
            EXEC internal.usp_SEL_message ਀                䀀洀攀猀猀愀最攀开椀搀 㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
                @message_text = @tempmessage OUTPUT;਀            䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
                SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀            䔀䰀匀䔀  
                SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀            匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
        END TRY਀        䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
            SET @transaction_status = 'Bad';਀            䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                @message_id = 'SelectError', ਀                䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
            IF @tempmessage IS NOT NULL ਀                匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
            ELSE਀                匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
        END CATCH਀     
END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows = ISNULL(@numrows, 0);਀    匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_documents]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 瘀椀攀眀⸀ 
-- Input is an optional form ID.  ਀ⴀⴀ 䐀漀攀猀 渀漀琀 愀瀀瀀氀礀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀  䐀漀攀猀 渀漀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀漀挀甀洀攀渀琀猀崀  
਀      䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 伀瀀琀椀漀渀愀氀 椀渀瀀甀琀 瀀愀爀愀洀攀琀攀爀 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	@temp_userauth_status nchar(10)         = 'Fail',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀  
	BEGIN TRY਀ 
	WITH docidsCTE AS (਀         匀䔀䰀䔀䌀吀 搀漀挀开椀搀      䄀匀 䤀䐀  
	       FROM internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) ),  -- Apply permission filtering.਀ 
		docDataCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docidsCTE.ID AS docid, ਀ऀऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ  
				doc_data.field_name_id, ਀ऀऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀Ⰰ  
				doc_data.field_mnemonic, ਀ऀऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀Ⰰ  
				doc_data.attr_value, ਀ऀऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀Ⰰ  
				doc_data.form_position਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 
			CROSS APPLY [internal].[ufn_SEL_one_dc_data_by_frm_ITVF](docidsCTE.ID, NULL, @formid) AS doc_data਀ऀऀ⤀Ⰰ 
਀ऀऀ䄀琀琀䐀愀琀愀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀                䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀䐀愀琀愀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰऀऀऀऀऀ 
				docDataCTE.docid, ਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ  
				docDataCTE.field_name_id, ਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀昀椀攀氀搀开渀愀洀攀Ⰰ  
				docDataCTE.field_mnemonic, ਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀愀琀琀爀开椀搀Ⰰ  
				docDataCTE.attr_value, ਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀甀渀椀琀猀Ⰰ  
				docDataCTE.form_position਀ऀऀऀ䘀刀伀䴀 搀漀挀䐀愀琀愀䌀吀䔀 
		)਀ 
---- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      搀漀挀开搀愀琀愀⸀搀漀挀开挀漀甀渀琀      䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  doc_data.docid          AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 䄀琀琀䐀愀琀愀䌀吀䔀 䄀匀 搀漀挀开搀愀琀愀⤀㬀 
਀ 
		SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.docid                      AS 'Document ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.form_position, '')  AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
   ORDER BY Position, 'Record', 'Document ID';਀ 
---- ===================================================਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 
	  END  -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀甀琀礀开昀渀挀琀开猀椀搀开氀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all records from people.duty_function_sid_links.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ一漀渀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of records.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - None਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开搀甀琀礀开昀渀挀琀开猀椀搀开氀渀欀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀Ⰰ 
		@tempuserauth_status nchar(10)          = 'Fail';  -- Temporary value for authentication sp.਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀猀 昀漀爀 琀栀攀 爀漀氀攀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀   匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Editor',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀऀऀऀ䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
				@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀ऀ 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
				@role_to_check = 'Reader',਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';	਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
	    SET @userauthentication_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀                䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ  
				 df.name                         AS 'Duty Function Name',਀ऀऀऀऀ 搀昀猀氀⸀猀椀搀开椀搀                     䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				 ISNULL(sl.name, '')             AS 'Database Username',਀ऀऀ         䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀         䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				 ISNULL(dfsl.notes, '')          AS 'Notes',਀ऀऀ         䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀昀猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				 dfsl.granted_by                 AS 'Granted By',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'				 ਀ऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
	   LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀ  伀一 搀昀猀氀⸀猀椀搀开椀搀  
			     = sl.sid_id਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
	          ON dfsl.function_id਀ऀऀऀऀ 㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			ORDER BY 'Duty Function Name';਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END  -- End if transaction ready = Ready਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_duty_functions]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 搀甀琀礀 昀甀渀挀琀椀漀渀猀⸀ 
-- Output is a list of duty functions, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists all duty functions from people.duty_functions.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* -None਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 搀甀琀礀 昀甀渀挀琀椀漀渀 搀攀琀愀椀氀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_duty_functions] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 df.function_id             AS 'Duty Function ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 df.name                    AS 'Duty Function Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 df.list_position           AS 'List Position'਀ऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀   
			ORDER BY 'List Position', 'Duty Function Name';਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all file date fields਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_file_date_fields]਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ          愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀氀攀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
	          ISNULL(mnem, '')  AS 'Mnemonic',਀              䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
	          file_date_name_id AS 'File Date Field Name ID'਀ऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀搀昀渀 
     ORDER BY 'File Date Field Name';਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	  SET @transaction_status = 'Good';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
	    END਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @transactionmessage = @tempmessage + ' | ' + ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
	END CATCH਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开椀渀琀开昀椀攀氀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 椀渀琀攀最攀爀 昀椀攀氀搀 渀愀洀攀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开椀渀琀开昀椀攀氀搀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	          attr_name         AS 'File Integer Field Name',਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
              ISNULL(descr, '') AS 'Description',਀              昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  䄀匀 ✀䘀椀氀攀 䤀渀琀攀最攀爀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
	     FROM file_attr.file_integer_field_names AS difn਀     伀刀䐀䔀刀 䈀夀 ✀䘀椀氀攀 䤀渀琀攀最攀爀 䘀椀攀氀搀 一愀洀攀✀㬀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @transactionmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
			    SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @zerorecordsmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
		       SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀ    䔀一䐀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	     CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ  䔀䰀匀䔀 
		   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开洀猀开愀琀琀爀椀戀甀琀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀⸀ 
-- Selects all file multi-select attributes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 琀栀攀 氀椀猀琀 漀昀 愀琀琀爀椀戀甀琀攀猀Ⰰ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开洀猀开愀琀琀爀椀戀甀琀攀猀崀  
਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀㬀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
		       fmsln.file_ms_list_id    AS 'File Multi-Select List ID',਀ऀऀ       昀洀猀氀渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ 
			   fmsln.list_position      AS 'Name List Position',਀ऀ           昀洀猀愀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀     䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
	           ISNULL(fmsa.mnem, '')    AS Mnemonic, ਀ऀऀऀ   昀洀猀愀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ  
	           ISNULL(fmsa.descr, '')   AS Description, ਀ऀ           昀洀猀愀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	      FROM file_attr.file_multi_select_attributes AS fmsa਀     䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀洀猀氀渀 
		    ON fmsln.file_ms_list_id = fmsa.file_ms_list_id਀ऀ  伀刀䐀䔀刀 䈀夀 ✀一愀洀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
  	    IF (@@ROWCOUNT = 0)਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  END TRY਀  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀  䔀一䐀 䌀䄀吀䌀䠀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_file_ms_lists]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Selects all data from the file_multi_select_list_names table਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_file_ms_lists] ਀ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀ          昀椀氀攀开洀猀开氀椀猀琀开椀搀   䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ  
	          ISNULL(mnem, '')  AS Mnemonic, ਀ऀऀऀ  愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ  
	          ISNULL(descr, '') AS Description, ਀ऀ          氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀  
	     FROM file_attr.file_multi_select_list_names ਀ऀ 伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
  	    IF (@@ROWCOUNT = 0)਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	            SET @zerorecordsmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
		         SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	       SET @transactionmessage = @tempmessage;਀ऀ    䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  END TRY਀  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		   CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ䔀䰀匀䔀  
		    SET @transactionmessage = 'A database level message error occurred on SelectError';਀  䔀一䐀 䌀䄀吀䌀䠀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀⸀ 
-- Selects all file radio button attributes.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 琀栀攀 氀椀猀琀 漀昀 愀琀琀爀椀戀甀琀攀猀Ⰰ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀崀  
਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀㬀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
	          frbln.file_radiob_list_id AS 'File Radio Button List ID',਀ऀऀ      昀爀戀氀渀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
			  frbln.list_position       AS 'Name List Position',਀ऀ          昀爀戀愀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀  䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
	          ISNULL(frba.mnem, '')     AS Mnemonic, ਀ऀऀऀ  昀爀戀愀⸀愀琀琀爀开渀愀洀攀            䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ  
	          ISNULL(frba.descr, '')    AS Description, ਀ऀ          昀爀戀愀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	     FROM file_attr.file_radio_button_attributes AS frba਀    䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀爀戀氀渀 
		   ON frbln.file_radiob_list_id = frba.file_radiob_list_id਀ऀ 伀刀䐀䔀刀 䈀夀 ✀一愀洀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䄀琀琀爀椀戀甀琀攀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
਀  ऀ    䤀䘀 ⠀䀀䀀刀伀圀䌀伀唀一吀 㴀 　⤀ 
	      BEGIN਀ऀ        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                 @message_id   = 'ZeroRecords', ਀                 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
		  END਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'Success', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	    IF @tempmessage IS NOT NULL ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	    SET @transaction_status = 'Good';਀  䔀一䐀 吀刀夀 
  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
  END CATCH਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-07--2023਀ⴀⴀ 䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Description:	Selects all data from the file_radio_button_list_names table਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_file_radiob_lists] ਀ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
	          file_radiob_list_id      AS 'File Radio Button List ID', ਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀         䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
			  attr_name                AS 'File Radio Button List Name', ਀ऀ          䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀        䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	          ISNULL(list_position, 0) AS 'List Position', ਀ऀऀऀ  䤀匀一唀䰀䰀⠀爀攀猀琀爀椀挀琀攀搀Ⰰ 　⤀    䄀匀 ✀刀攀猀琀爀椀挀琀攀搀✀ 
	     FROM file_attr.file_radio_button_list_names ਀     伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
  	    IF (@@ROWCOUNT = 0)਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	            SET @zerorecordsmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
		         SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	       SET @transactionmessage = @tempmessage;਀ऀ    䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  END TRY਀  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		   CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ䔀䰀匀䔀  
		    SET @transactionmessage = 'A database level message error occurred on SelectError';਀  䔀一䐀 䌀䄀吀䌀䠀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开爀攀愀氀开昀椀攀氀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 05-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 渀愀洀攀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀开爀攀愀氀开昀椀攀氀搀猀崀 
  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	          attr_name         AS 'File Real Number Field Name',਀ऀ          䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
              ISNULL(descr, '') AS 'Description',਀              昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 ✀䘀椀氀攀 刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
	     FROM file_attr.file_real_number_field_names AS drnfn਀     伀刀䐀䔀刀 䈀夀 ✀䘀椀氀攀 刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀 一愀洀攀✀㬀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @transactionmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
			    SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @zerorecordsmessage = @tempmessage;਀ऀ       䔀䰀匀䔀  
		       SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀ    䔀一䐀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	     CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ  䔀䰀匀䔀 
		   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_file_text_fields]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file free text field names਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_file_text_fields]਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ          愀琀琀爀开渀愀洀攀              䄀匀 ✀䘀椀氀攀 䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
	          ISNULL(mnem, '')       AS 'Mnemonic',਀              䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀      䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
              file_free_text_name_id AS 'File Free Text Field Name ID'਀ऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀昀琀昀渀 
	 ORDER BY 'File Free Text Field Name';਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	  SET @transaction_status = 'Good';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
	    END਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @transactionmessage = @tempmessage + ' | ' + ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
	END CATCH਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for a given form for all files਀ⴀⴀ 戀甀琀 渀漀琀 琀栀攀 昀椀氀攀 挀漀渀琀攀渀琀⸀  䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 
-- see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files] ਀ 
      @formid bigint                   = NULL, ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ 
	@connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid nvarchar(50),਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
		      WITH fileidsCTE AS(਀ऀऀऀऀ匀䔀䰀䔀䌀吀 昀椀氀攀开椀搀 䄀匀 䤀䐀 
				  FROM internal.ufn_SEL_files_permission_filtr_ITVF (@connectedusersid) -- Apply permission filtering਀ऀऀऀ⤀Ⰰ 
਀ऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
			 SELECT DISTINCT fileidsCTE.ID,਀ऀऀऀ 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 ⴀⴀ 䤀渀挀氀甀搀椀渀最 琀栀椀猀 椀渀 昀椀氀攀椀搀猀䌀吀䔀 挀愀甀猀攀猀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀猀 琀漀 戀攀 挀爀攀愀琀攀搀 
			 FROM fileidsCTE)਀ 
਀ऀⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀攀 椀搀 
	   INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀऀऀ⠀匀䔀䰀䔀䌀吀   
					DENSE_RANK() OVER (ORDER BY fi.row_number, distinctfileidsCTE.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ  ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
					distinctfileidsCTE.ID    AS file_id, ਀ऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
					file_data.field_name_id  AS field_name_id, ਀ऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
					file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
					file_data.attr_value     AS attr_value, ਀ऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
					file_data.form_position  AS position਀ऀऀऀ   䘀刀伀䴀 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data਀ऀऀ 刀䤀䜀䠀吀 䨀伀䤀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 
				 ON distinctfileidsCTE.ID ਀ऀऀऀऀऀ㴀 昀椀⸀䤀䐀⤀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀ 匀䔀䰀䔀䌀吀  
				ad.file_count                 AS 'Record',਀ऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
				ad.field_type                 AS 'Field Type', ਀ऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
				ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
				ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
		   FROM @AttData as ad਀ऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ऀⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ  匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
		  SET @formname = (SELECT form_name਀ऀऀ                     䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 
							WHERE form_id = @formid);਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开搀琀礀开昀甀渀挀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 搀甀琀礀 昀甀渀挀琀椀漀渀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- Differs from reading.usp_SEL_files_by_duty_function in that no filter group is applied. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/ ਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_by_dty_funct] ਀ 
	  @functionid bigint               = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
   -- Duty function validation਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 　  
			 SET @functionid = NULL;਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN  -- Duty function not supplied਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoAttrID', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一伀吀 一唀䰀䰀  
				BEGIN  -- Check if the duty function is valid਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开椀搀 
									 FROM people.duty_functions਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀  
						BEGIN -- Attribute does not exist਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE  ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						END਀ऀऀऀ䔀一䐀 
਀  
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.function_id਀ऀऀ               㴀 䀀昀甀渀挀琀椀漀渀椀搀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_by_file_grp]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 刀攀愀搀猀 昀椀氀攀 搀攀琀愀椀氀猀 昀爀漀洀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀 椀搀⸀ 
-- Input is a file group id.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 昀椀氀攀 搀攀琀愀椀氀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 刀攀愀搀猀 昀椀氀攀 搀攀琀愀椀氀猀 昀爀漀洀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀 最爀漀甀瀀 椀搀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀  䴀甀猀琀 戀攀 愀 渀漀渀ⴀ渀甀氀氀 愀渀搀 渀漀渀ⴀ攀洀瀀琀礀 瘀愀氀椀搀 椀搀攀渀琀椀昀椀攀爀⸀ 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of file details.  Only files for which the user has viewing permission will be listed.਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - Data Validation Fail: Returns messages for missing or invalid file group ID.਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - @filegroupid must be provided and be valid਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开昀椀氀攀开最爀瀀崀  
਀     䀀昀椀氀攀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
     @formid bigint                   = NULL,   ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀   伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numfiles bigint                 = NULL OUTPUT,਀ऀ 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @formname nvarchar(50)           = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀   ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
         -- Check the file group id਀ऀ     䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 㴀 　  
		    SET @filegroupid = NULL;਀ऀऀ 䤀䘀 䀀昀椀氀攀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		   BEGIN਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id   = 'NoFileGroupId', ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䜀爀漀甀瀀䤀搀✀⤀㬀 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   END਀ऀऀ 䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 琀栀愀琀 昀椀氀攀 最爀漀甀瀀 椀搀 攀砀椀猀琀猀 
		   BEGIN -- Check the file group id਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开最爀漀甀瀀开椀搀 
				             FROM xref.file_group_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀攀最爀漀甀瀀椀搀⤀ 
				BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'FileGroupIdNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF @tempmessage IS NOT NULL ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀㨀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀昀椀氀攀最爀漀甀瀀椀搀⤀Ⰰ ✀一唀䰀䰀✀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀  
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀  䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䜀爀漀甀瀀䤀搀一漀琀䔀砀椀猀琀✀⤀㬀 
਀ऀऀऀऀ䔀一䐀ऀ 
			END -- End checking the file group id਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	  WITH fileidsCTE AS(਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	                 FROM base.file_metadata AS fm਀ऀऀऀ䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
			        ON  fgl.file_id ਀ऀऀऀऀऀ   㴀 昀洀⸀昀椀氀攀开椀搀 
            INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀                    伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
		 WHERE fgl.file_group_id = @filegroupid), -- ### The search criteria਀ 
਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀攀 椀搀 
   		 distinctfileidsCTE AS(਀ऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀Ⰰ 
		 ROW_NUMBER() OVER (ORDER BY fileidsCTE.ID) AS row_number -- Including this in fileidsCTE causes duplicate records to be created਀ऀऀ 䘀刀伀䴀 昀椀氀攀椀搀猀䌀吀䔀⤀ 
਀ 
-- Extract the data according to the file id਀   䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
		(SELECT  ਀ऀऀ        䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀Ⰰ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                                      -- each row in this table is a field. ਀ऀऀऀ    搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀    䄀匀 昀椀氀攀开椀搀Ⰰ  
			    file_data.field_type     AS field_type, ਀ऀऀऀ    昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			    file_data.field_name     AS field_name,਀ऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			    file_data.attr_id        AS attr_id, ਀ऀऀऀ    昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			    file_data.units          AS units,਀ऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		   FROM distinctfileidsCTE AS fi਀ऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀 
	 RIGHT JOIN distinctfileidsCTE਀ऀ         伀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀  
			    = fi.ID);਀ 
         SELECT @numfiles = MAX(file_count) from @AttData;਀ 
     SELECT ਀ऀऀ    愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
			ad.fileid                     AS 'File ID', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
			ad.field_name_id              AS 'Name ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			ISNULL(ad.position, '')       AS 'Position'਀ऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
   ORDER BY Position, 'Record', 'File ID';਀ 
--=======================================================਀ 
      SET @numrows = @@ROWCOUNT;਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开昀椀氀攀渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file data according to filename search using the LIKE operator.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开昀椀氀攀渀愀洀攀崀  
਀ऀ  䀀氀椀欀攀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ  
	  @formid bigint                   = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files.  ਀      䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation਀ 
		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
	  WITH fileidsCTE AS(਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
				 searchtable.file_id              AS ID਀ऀऀ    䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
	    WHERE ਀ऀऀऀऀऀ⠀䀀氀椀欀攀猀琀爀椀渀最 䤀匀 一唀䰀䰀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀渀愀洀攀 䤀匀 一唀䰀䰀⤀  ⴀⴀ 䌀愀琀攀爀猀 昀漀爀 猀攀愀爀挀栀椀渀最 昀漀爀 爀攀挀漀爀搀猀 眀栀攀爀攀 昀椀氀攀渀愀洀攀 椀猀 一唀䰀䰀 
					OR (searchtable.filename LIKE '%' + @likestring + '%' ESCAPE '\')਀ऀऀऀऀ   
		 ),਀ 
				 distinctfileidsCTE AS(਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀Ⰰ 
				 ROW_NUMBER() OVER (ORDER BY fileidsCTE.ID) AS row_number -- Including this in fileidsCTE causes duplicate records to be created਀ऀऀऀऀ 䘀刀伀䴀 昀椀氀攀椀搀猀䌀吀䔀⤀ 
਀ 
		-- Extract the data according to the file id਀ऀऀ   䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
				(SELECT ਀ऀऀऀऀ        䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀⤀ 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
						DENSE_RANK() OVER (ORDER BY fi.row_number, distinctfileidsCTE.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ  ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
						distinctfileidsCTE.ID    AS file_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
						file_data.field_name_id  AS field_name_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
					    file_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
						file_data.attr_value     AS attr_value, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
					    file_data.form_position  AS position਀ऀऀऀऀ   䘀刀伀䴀 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀 昀椀 
			CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data਀ऀऀऀ 刀䤀䜀䠀吀 䨀伀䤀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 
					 ON distinctfileidsCTE.ID ਀ऀऀऀऀऀऀ㴀 昀椀⸀䤀䐀⤀㬀 
਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀   㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀऀ    䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀऀ    䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开昀甀渀挀琀开氀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 昀甀渀挀琀椀漀渀 氀椀猀琀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- Differs from reading.usp_SEL_files_by_function_list in that no filter group is applied. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_by_funct_lst] ਀ 
	  @functionlistid bigint           = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀    
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰऀऀ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
   -- Function list validation਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　  
			 SET @functionlistid = NULL;਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN  -- Function list not supplied਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoAttrID', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀  
				BEGIN  -- Check if the function list is valid਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									FROM people.function_list_names਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀  
						BEGIN -- Function list does not exist਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE  ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						END਀ऀऀऀ䔀一䐀 
਀  
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
	    WHERE searchtable.function_list_id਀ऀऀ               㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_by_ms_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given multi-select attribute਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开洀猀开氀椀猀琀 椀渀 琀栀愀琀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开洀猀开氀椀猀琀崀  
਀ऀ  䀀昀椀氀攀洀猀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @filemsattrid bigint             = NULL, ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰऀऀ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  IF @filemslistid = 0਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filemsattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 
		  IF @filemslistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file multi-select attribute list has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_ms_list_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 
			  	 				 WHERE file_ms_list_id = @filemslistid) -- Check if the attribute list id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @filemsattrid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
਀          ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 愀渀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 瀀愀椀爀 攀砀椀猀琀猀 
		  IF @filemsattrid IS NOT NULL AND @data_validation_status = 'Pass'਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT file_ms_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE file_ms_attr_id = @filemsattrid਀ऀऀऀऀऀऀऀऀऀ   䄀一䐀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀  
					 BEGIN -- multi-select list id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
	    WHERE searchtable.file_ms_list_id = @filemslistid ਀ऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_by_pple_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given people list਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀 椀渀 琀栀愀琀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开瀀瀀氀攀开氀椀猀琀崀  
਀ऀ  䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username   ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',		਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀   ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @peoplelistid = 0 ਀ऀऀऀ 匀䔀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @peoplelistid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @peoplelistid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT people_list_id਀ऀऀऀऀऀऀऀऀऀ 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 
									WHERE people_list_id = @peoplelistid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 倀攀漀瀀氀攀 氀椀猀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
	    WHERE searchtable.people_list_id਀ऀऀ               㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_by_radio_btn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given file radio button਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 昀椀氀攀 爀攀挀漀爀搀猀 昀漀爀 愀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀 
* - @formid bigint.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀椀氀攀 爀攀挀漀爀搀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
* - @numrows bigint OUTPUT: Number of rows਀⨀ ⴀ 䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀 伀唀吀倀唀吀㨀 一甀洀戀攀爀 漀昀 昀椀氀攀猀 
*਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/*਀吀栀攀 氀漀最椀挀 眀漀爀欀猀 愀猀 昀漀氀氀漀眀猀⸀ 
Files are listed which:਀  ⴀ 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀Ⰰ 
  - and which have the given radio button id਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开爀愀搀椀漀开戀琀渀崀  
਀      䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ   
	  @formid bigint                   = NULL,   ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀  ⴀⴀ 䘀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @file_radiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		  IF @file_radiobattrid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䘀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @file_radiobattrid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT file_radiob_attr_id਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
									WHERE file_radiob_attr_id = @file_radiobattrid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_radio_button_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
		      = @file_radiobattrid  -- ### The search criteria਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_by_txt_field]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files with a text field containing a given string. ਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_by_txt_field] ਀ 
	  @filetextnameid bigint           = NULL,਀ऀ  䀀氀椀欀攀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username   ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',		਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
 		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filetextnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filetextnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀攀砀琀一愀洀攀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTextNameId.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file text name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_free_text_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_free_text_name_id = @filetextnameid) -- Check if the file text name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TextIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 琀攀砀琀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes.਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_free_text_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND ਀ऀऀऀ  ⠀ 
				(@likestring IS NULL AND searchtable.text_value IS NULL)  -- Caters for searching for records where search string is NULL਀ऀऀऀऀ伀刀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀琀攀砀琀开瘀愀氀甀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀ 䔀匀䌀䄀倀䔀 ✀尀✀⤀ 
			  )਀ऀऀऀऀऀऀ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_by_user]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Selects file metadata for all the files for a given user਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀 椀渀 琀栀愀琀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开戀礀开甀猀攀爀崀  
਀      䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ   
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username   ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',		਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀     ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
		  IF @sidid = 0਀ऀऀऀ 匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			                 FROM user_restr.sid_list AS SL਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
 ਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
	    WHERE searchtable.sid_id਀ऀऀ               㴀 䀀猀椀搀椀搀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_contains]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 挀漀渀琀攀渀琀 甀猀椀渀最 琀栀攀 䌀伀一吀䄀䤀一匀 猀攀愀爀挀栀 昀甀渀挀琀椀漀渀⸀ 
-- The search is restricted to files which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_contains] ਀ 
	  @containsstring nvarchar(2000)   = '', ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀⸀  
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀  
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),    ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation਀ 
   	  -- String validation  ਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 㴀 ✀✀  
		 SET @containsstring = NULL;਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 䤀匀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoSearchString', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀攀愀爀挀栀匀琀爀椀渀最⸀✀⤀㬀 
		 END  ਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
	  WITH fileidsCTE AS(਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
				 fm.file_id              AS ID਀ऀऀ    䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
	   INNER JOIN base.file_plain_text_content AS searchtable  -- ## The search table਀ऀऀऀ   伀一            昀洀⸀昀椀氀攀开椀搀 
				  = searchtable.file_id਀       䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
               ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀऀ   圀䠀䔀刀䔀  
				  (਀ऀऀऀऀ  䌀伀一吀䄀䤀一匀⠀猀攀愀爀挀栀琀愀戀氀攀⸀瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀Ⰰ 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最⤀ ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
				  )਀ऀऀ ⤀Ⰰ 
਀ऀऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				 SELECT DISTINCT fileidsCTE.ID,਀ऀऀऀऀ 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 ⴀⴀ 䤀渀挀氀甀搀椀渀最 琀栀椀猀 椀渀 昀椀氀攀椀搀猀䌀吀䔀 挀愀甀猀攀猀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀猀 琀漀 戀攀 挀爀攀愀琀攀搀 
				 FROM fileidsCTE)਀ 
਀ऀऀⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀攀 椀搀 
		   INSERT INTO @AttData  (num_records, file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀  
				        DENSE_RANK() OVER (ORDER BY fi.row_number) AS num_records,਀ऀऀऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀Ⰰ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
																						  -- each row in this table is a field. ਀ऀऀऀऀऀऀ搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀    䄀匀 昀椀氀攀开椀搀Ⰰ  
						file_data.field_type     AS field_type, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
						file_data.field_name     AS field_name,਀ऀऀऀऀऀ    昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
						file_data.attr_id        AS attr_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
						file_data.units          AS units,਀ऀऀऀऀऀ    昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
				   FROM distinctfileidsCTE AS fi਀ऀऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀 
			 RIGHT JOIN distinctfileidsCTE਀ऀऀऀऀऀ 伀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀  
						= fi.ID);਀ 
				 SELECT @numfiles   = MAX(file_count)  from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
				    ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
				    ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, 'Record', 'File ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
		  SET @numrows = @@ROWCOUNT;਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开挀漀渀琀愀椀渀猀琀愀戀氀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file content using the FREETEXTTABLE search function.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开挀漀渀琀愀椀渀猀琀愀戀氀崀  
਀ऀ  䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀㈀　　　⤀   㴀 ✀✀Ⰰ  
	  @formid bigint                   = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files. ਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT ਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀   ऀ  ⴀⴀ 匀琀爀椀渀最 瘀愀氀椀搀愀琀椀漀渀   
	  IF @containsstring = '' ਀ऀऀ 匀䔀吀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 㴀 一唀䰀䰀㬀 
	  IF @containsstring IS NULL਀ऀऀ 䈀䔀䜀䤀一  
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀匀攀愀爀挀栀匀琀爀椀渀最✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSearchString.');਀ऀऀ 䔀一䐀   
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ  圀䤀吀䠀 昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
		  SELECT DISTINCT਀ऀऀऀऀ 昀洀⸀昀椀氀攀开椀搀   䄀匀 䤀䐀Ⰰ 
				 ft.RANK      AS rank_score਀ऀऀ䘀刀伀䴀 䌀伀一吀䄀䤀一匀吀䄀䈀䰀䔀⠀戀愀猀攀⸀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀Ⰰ 瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀Ⰰ 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最⤀ 䄀匀 昀琀 
		INNER JOIN base.file_metadata AS fm਀                伀一 昀洀⸀昀椀氀攀开椀搀 㴀 昀琀⸀嬀䬀䔀夀崀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
਀ऀऀ ⤀Ⰰ 
਀ऀऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				 SELECT DISTINCT fileidsCTE.ID,਀ऀऀऀऀऀऀऀऀ 昀椀氀攀椀搀猀䌀吀䔀⸀爀愀渀欀开猀挀漀爀攀Ⰰ 
				 ROW_NUMBER() OVER (ORDER BY fileidsCTE.rank_score DESC, fileidsCTE.ID) AS row_number -- Including this in fileidsCTE causes duplicate records to be created਀ऀऀऀऀ 䘀刀伀䴀 昀椀氀攀椀搀猀䌀吀䔀⤀ 
਀ 
		-- Extract the data according to the file id਀ऀऀ   䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
				(SELECT ਀ऀऀऀऀ        䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀⤀ 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
						DENSE_RANK() OVER (ORDER BY fi.row_number, distinctfileidsCTE.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ  ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
						distinctfileidsCTE.ID    AS file_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
						file_data.field_name_id  AS field_name_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
					    file_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
						file_data.attr_value     AS attr_value, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
					    file_data.form_position  AS position਀ऀऀऀऀ   䘀刀伀䴀 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀 昀椀 
			CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data਀ऀऀऀ 刀䤀䜀䠀吀 䨀伀䤀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 
					 ON distinctfileidsCTE.ID ਀ऀऀऀऀऀऀ㴀 昀椀⸀䤀䐀⤀㬀 
਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀   㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀऀ    䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀऀ    䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_date_after]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 搀愀琀攀 昀漀爀 愀 最椀瘀攀渀 搀愀琀攀 昀椀攀氀搀 椀猀 愀昀琀攀爀 愀 最椀瘀攀渀 搀愀琀攀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开搀愀琀攀开愀昀琀攀爀崀  
਀      䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL, ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filedatenameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_date_name_id = @filedatenameid) -- Check if the file date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_date_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 
		  AND searchtable.date_value > @datevalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开搀愀琀攀开愀渀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata for files linked to the given file date field ID.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_date_any] ਀ 
      @filedatenameid bigint           = NULL,  ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filedatenameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_date_name_id = @filedatenameid) -- Check if the file date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_date_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_date_before]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 搀愀琀攀 昀漀爀 愀 最椀瘀攀渀 搀愀琀攀 昀椀攀氀搀 椀猀 戀攀昀漀爀攀 愀 最椀瘀攀渀 搀愀琀攀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开搀愀琀攀开戀攀昀漀爀攀崀  
਀      䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL, ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filedatenameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_date_name_id = @filedatenameid) -- Check if the file date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_date_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 
		  AND searchtable.date_value < @datevalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开搀愀琀攀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the date for a given date field is between given dates.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_date_between] ਀ 
      @filedatenameid bigint           = NULL,    ਀ऀ  䀀攀愀爀氀椀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀       㴀 一唀䰀䰀Ⰰ 
	  @later_date datetime2(7)         = NULL, ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filedatenameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_date_name_id = @filedatenameid) -- Check if the file date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
	    WHERE searchtable.file_date_name_id = @filedatenameid਀ऀऀ  䄀一䐀  
		  (਀ऀऀ    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㰀 䀀氀愀琀攀爀开搀愀琀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㸀 䀀攀愀爀氀椀攀爀开搀愀琀攀⤀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀 
		  )਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开搀愀琀攀开攀焀甀愀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the date for a given date field equals a given date.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_date_equals] ਀ 
      @filedatenameid bigint           = NULL,    ਀ऀ  䀀搀愀琀攀瘀愀氀甀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀ऀ       㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass'; ਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the file date name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 　 
		     SET @filedatenameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM file_attr.file_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_date_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 
		  AND searchtable.date_value = @datevalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开昀漀爀开漀渀攀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists file records for a given document id and filter group.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @documentid nvarchar(50)਀⨀ ⴀ 䀀昀漀爀洀椀搀 戀椀最椀渀琀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of file records.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ ⴀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀 伀唀吀倀唀吀㨀 一甀洀戀攀爀 漀昀 爀漀眀猀 
* - @numfiles bigint OUTPUT: Number of files਀⨀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀⼀⨀ 
The logic works as follows.਀䘀椀氀攀猀 愀爀攀 氀椀猀琀攀搀 眀栀椀挀栀㨀 
  - the user has viewing rights to,਀  ⴀ 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 瘀椀愀 琀栀攀 琀愀戀氀攀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_for_one_doc] ਀ 
਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,   ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀     
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰऀऀ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
			END਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  -- Noting that docid is not case sensitive, return the docid ਀      ⴀⴀ 眀椀琀栀 琀栀攀 猀愀洀攀 氀攀琀琀攀爀 挀愀猀攀 愀猀 椀猀 猀琀漀爀攀搀 爀愀琀栀攀爀 琀栀愀渀 眀栀愀琀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
        SET @documentid = (SELECT doc_id਀                             䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
			                WHERE dil.doc_id = @documentid);਀ 
	-- Select the files for the given document id. ਀ऀ圀䤀吀䠀 昀椀氀攀氀椀猀琀 䄀匀 ⠀ 
		SELECT DISTINCT ਀ऀऀऀ昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀Ⰰ 
			ROW_NUMBER() OVER (ORDER BY fm.file_id) AS row_number਀ऀऀ䘀刀伀䴀  
			base.file_metadata AS fm਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀  
			internal.ufn_SEL_files_by_doc_TVF(@documentid) AS tvf਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀऀ圀䠀䔀刀䔀  
			   fm.file_id ਀ऀऀऀ㴀 琀瘀昀⸀昀椀氀攀开椀搀 
			)਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.row_number, fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                             ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			 file_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 昀椀氀攀氀椀猀琀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					@documentid                   AS 'Document ID',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_for_user]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Selects file metadata for all the files linked to the connected user਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_for_user] ਀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username   ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',		਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_user_links AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀ऀ䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	        ON searchtable.sid_id਀ऀऀऀ   㴀        猀氀⸀猀椀搀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
	    WHERE sl.sid = @connectedusersid    --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开昀爀攀攀琀攀砀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file content using the FREETEXT search function.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开昀爀攀攀琀攀砀琀崀  
਀ऀ  䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀㈀　　　⤀   㴀 ✀✀Ⰰ  
	  @formid bigint                   = NULL,  ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files.  ਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀   ऀ  ⴀⴀ 匀琀爀椀渀最 瘀愀氀椀搀愀琀椀漀渀   
	  IF @containsstring = '' ਀ऀऀ 匀䔀吀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 㴀 一唀䰀䰀㬀 
	  IF @containsstring IS NULL਀ऀऀ 䈀䔀䜀䤀一  
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀匀攀愀爀挀栀匀琀爀椀渀最✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSearchString.');਀ऀऀ 䔀一䐀   
਀   
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ  圀䤀吀䠀 昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
		  SELECT DISTINCT਀ऀऀऀऀ 昀洀⸀昀椀氀攀开椀搀              䄀匀 䤀䐀 
		    FROM base.file_metadata AS fm਀ऀ   䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
			   ON            fm.file_id਀ऀऀऀऀ  㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
		   WHERE ਀ऀऀऀऀ  䘀刀䔀䔀吀䔀堀吀⠀猀攀愀爀挀栀琀愀戀氀攀⸀瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀Ⰰ 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最⤀ ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		 ),਀ 
				 distinctfileidsCTE AS(਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀Ⰰ 
				 ROW_NUMBER() OVER (ORDER BY fileidsCTE.ID) AS row_number -- Including this in fileidsCTE causes duplicate records to be created਀ऀऀऀऀ 䘀刀伀䴀 昀椀氀攀椀搀猀䌀吀䔀⤀ 
਀ 
		-- Extract the data according to the file id਀ऀऀ   䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
				(SELECT ਀ऀऀऀऀ        䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀⤀ 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
						DENSE_RANK() OVER (ORDER BY fi.row_number, distinctfileidsCTE.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ  ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
						distinctfileidsCTE.ID    AS file_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
						file_data.field_name_id  AS field_name_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
					    file_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
						file_data.attr_value     AS attr_value, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
					    file_data.form_position  AS position਀ऀऀऀऀ   䘀刀伀䴀 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀 昀椀 
			CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data਀ऀऀऀ 刀䤀䜀䠀吀 䨀伀䤀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 
					 ON distinctfileidsCTE.ID ਀ऀऀऀऀऀऀ㴀 昀椀⸀䤀䐀⤀㬀 
਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀   㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀऀ    䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀऀ    䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
-- ===================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_freetexttabl]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 挀漀渀琀攀渀琀 甀猀椀渀最 琀栀攀 䘀刀䔀䔀吀䔀堀吀吀䄀䈀䰀䔀 猀攀愀爀挀栀 昀甀渀挀琀椀漀渀⸀ 
-- The search is restricted to files which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_freetexttabl] ਀ 
	  @containsstring nvarchar(2000)   = '', ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀⸀   
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),    ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation਀ 
   	  -- String validation  ਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 㴀 ✀✀  
		 SET @containsstring = NULL;਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 䤀匀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoSearchString', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀攀愀爀挀栀匀琀爀椀渀最⸀✀⤀㬀 
		 END  ਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
	  WITH fileidsCTE AS(਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
				 fm.file_id              AS ID,਀ऀऀऀऀ 昀琀⸀刀䄀一䬀    䄀匀 爀愀渀欀开猀挀漀爀攀 
		FROM FREETEXTTABLE(base.file_plain_text_content, plain_text_content, @containsstring) AS ft਀ऀऀ䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
                ON fm.file_id = ft.[KEY]਀        䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
                ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀऀ ⤀Ⰰ 
਀ऀऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				 SELECT DISTINCT fileidsCTE.ID,਀ऀऀऀऀऀऀऀऀ 昀椀氀攀椀搀猀䌀吀䔀⸀爀愀渀欀开猀挀漀爀攀Ⰰ 
				 ROW_NUMBER() OVER (ORDER BY fileidsCTE.rank_score DESC, fileidsCTE.ID) AS row_number -- Including this in fileidsCTE causes duplicate records to be created਀ऀऀऀऀ 䘀刀伀䴀 昀椀氀攀椀搀猀䌀吀䔀⤀ 
਀ 
		-- Extract the data according to the file id਀ऀऀ   䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
				(SELECT ਀ऀऀऀऀ        䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀⤀ 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
						DENSE_RANK() OVER (ORDER BY fi.row_number, distinctfileidsCTE.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ  ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
						distinctfileidsCTE.ID    AS file_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
						file_data.field_name_id  AS field_name_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
					    file_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
						file_data.attr_value     AS attr_value, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
					    file_data.form_position  AS position਀ऀऀऀऀ   䘀刀伀䴀 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀 昀椀 
			CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data਀ऀऀऀ 刀䤀䜀䠀吀 䨀伀䤀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 
					 ON distinctfileidsCTE.ID ਀ऀऀऀऀऀऀ㴀 昀椀⸀䤀䐀⤀㬀 
਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀   㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀऀ    䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀऀ    䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
-- ===================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_int_any]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ㄀㈀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀椀挀栀 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 最椀瘀攀渀 椀渀琀攀最攀爀 昀椀攀氀搀 䤀䐀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开椀渀琀开愀渀礀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_int_between]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 戀攀琀眀攀攀渀 琀眀漀 最椀瘀攀渀 椀渀琀攀最攀爀 瘀愀氀甀攀猀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开椀渀琀开戀攀琀眀攀攀渀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @lower_int_value bigint          = NULL,਀ऀ  䀀甀瀀瀀攀爀开椀渀琀开瘀愀氀甀攀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 
		  AND (searchtable.int_value > @lower_int_value AND searchtable.int_value < @upper_int_value)   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开椀渀琀开攀焀甀愀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where a given integer field equals a given integer value.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_int_equals] ਀ 
      @fileintnameid bigint            = NULL,    ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀 ऀऀ       㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 
		  AND searchtable.int_value = @integervalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开椀渀琀开最爀琀爀开琀栀愀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where a given integer field is greater than a given integer value.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_int_grtr_than] ਀ 
      @fileintnameid bigint            = NULL,    ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀 ऀऀ       㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 
		  AND searchtable.int_value > @integervalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开椀渀琀开氀攀猀猀开琀栀愀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where a given integer field is less than a given integer value.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_int_less_than] ਀ 
      @fileintnameid bigint            = NULL,    ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀 ऀऀ       㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_integer_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 
		  AND searchtable.int_value < @integervalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开爀攀愀氀开愀渀礀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 28-12-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata which are linked to the given real number ID.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_real_any] ਀ 
      @filerealnameid bigint           = NULL,    ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filerealnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filerealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_real_name_id = @filerealnameid) -- Check if the file real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_files_real_between]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 瘀愀氀甀攀 昀漀爀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 椀猀 戀攀琀眀攀攀渀 琀眀漀 最椀瘀攀渀 瘀愀氀甀攀猀⸀ 
-- No filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开爀攀愀氀开戀攀琀眀攀攀渀崀  
਀      䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @lower_real_value real           = NULL,਀ऀ  䀀甀瀀瀀攀爀开爀攀愀氀开瘀愀氀甀攀 爀攀愀氀ऀ       㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the file real name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 　 
		     SET @filerealnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM file_attr.file_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 
		  AND (searchtable.real_value  > @lower_real_value AND searchtable.real_value < @upper_real_value)   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开爀攀愀氀开攀焀甀愀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the value for a given real number field equals a given value.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_real_equals] ਀ 
      @filerealnameid bigint           = NULL,    ਀ऀ  䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀            㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation		਀ 
		  -- Check the file real name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 　 
		     SET @filerealnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM file_attr.file_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 
		  AND 	searchtable.real_value  = @realnumbervalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开爀攀愀氀开最爀攀愀琀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the value for a given real number field is greater than a given value.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_real_greater] ਀ 
      @filerealnameid bigint           = NULL,    ਀ऀ  䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀            㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
		  -- Check the file real name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 　 
		     SET @filerealnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM file_attr.file_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 
		  AND 	searchtable.real_value  > @realnumbervalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开爀攀愀氀开氀攀猀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the value for a given real number field is less than a given value.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_files_real_less] ਀ 
      @filerealnameid bigint           = NULL,    ਀ऀ  䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀            㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
		  -- Check the file real name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 　 
		     SET @filerealnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM file_attr.file_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 
		  AND 	searchtable.real_value  < @realnumbervalue   --### The search criteria value		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开眀椀琀栀开攀搀开瀀攀爀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀刀攀琀甀爀渀猀 琀栀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀⸀  
਀  ⴀⴀ 吀漀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 昀椀氀攀 琀栀攀 甀猀攀爀 洀甀猀琀 昀椀爀猀琀 栀愀瘀攀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀愀琀 昀椀氀攀⸀ 
  -- Viewing restrictions override editing permissions.  ਀  ⴀⴀ 䔀搀椀琀 瀀攀爀洀椀猀猀椀漀渀猀 眀漀爀欀 搀椀昀昀攀爀攀渀琀氀礀 昀爀漀洀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀⸀  圀椀琀栀 瘀椀攀眀 瀀攀爀洀椀猀猀椀漀渀猀 愀 昀椀氀攀 
  -- is viewable by default.  With edit permissions the file is restricted by default. ਀  ⴀⴀ 䄀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 昀椀氀攀 椀昀 琀栀攀爀攀 椀猀 愀 挀栀愀椀渀 昀爀漀洀 琀栀攀 昀椀氀攀 䤀䐀 琀栀爀漀甀最栀 
  -- either a function list or a people list to a sid in the sid list which is the sid for the user or a sid the user is a member of.਀  ⴀⴀ 䤀昀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 攀搀椀琀椀渀最 爀椀最栀琀猀 琀漀 愀渀礀 昀椀氀攀 琀栀攀礀 栀愀瘀攀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
  -- except if the file is linked to a controller file group which is not linked to the connected user. ਀  ⴀⴀ 䤀昀 琀栀攀 昀椀氀攀 椀猀 氀椀渀欀攀搀 琀漀 愀 挀漀渀琀爀漀氀氀攀爀 最爀漀甀瀀 琀栀攀渀 椀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 渀漀琀 瀀愀爀琀 漀昀 琀栀愀琀 最爀漀甀瀀 
  -- then the user is excluded from editing rights.਀  ⴀⴀ 吀栀攀爀攀 愀爀攀 琀眀漀 氀愀礀攀爀猀 漀昀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀⸀  䄀琀 漀渀攀 氀攀瘀攀氀Ⰰ 挀漀渀琀爀漀氀氀攀爀猀 愀爀攀 最爀愀渀琀攀搀 攀砀挀氀甀猀椀瘀攀 攀搀椀琀椀渀最 
  -- permissions by an authoriser, referred to as controller level permission. Other controllers cannot alter those permissions.਀  ⴀⴀ 䄀琀 琀栀攀 漀琀栀攀爀 氀攀瘀攀氀 挀漀渀琀爀漀氀氀攀爀猀 最爀愀渀琀 攀搀椀琀椀渀最 瀀攀爀洀椀猀猀椀漀渀猀 琀漀 攀搀椀琀漀爀猀Ⰰ 爀攀昀攀爀爀攀搀 琀漀 愀猀 攀搀椀琀漀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀⸀  䌀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 瀀攀爀洀椀猀猀椀漀渀猀 
  -- exclude and override any editor level permission.  A controller cannot delegate permission for a controller level permission. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀攀猀开眀椀琀栀开攀搀开瀀攀爀洀崀  
਀      䀀昀漀爀洀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)           = ''   OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @numrows bigint                   = NULL OUTPUT,਀      䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint              = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀            㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀    ⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
    -- interfering with SELECT statements.਀    匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀    䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)         = '',਀        䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀        䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀          㴀 一唀䰀䰀㬀 
਀    䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
    (਀        昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
        fileid nvarchar(50),਀        昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
        field_name_id bigint,਀        昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
        field_mnemonic nvarchar(10),਀        愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
        attr_value nvarchar(max),਀        甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
        form_position nvarchar(50)਀    ⤀ 
਀    ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
    SET @transaction_status = 'Transaction not attempted';  ਀    匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
    SET @numfiles = 0;਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀ 
    -- Form id validation਀    䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
        SET @formid = NULL;਀    䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
    BEGIN ਀        䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
                       FROM forms.form_identifier_names ਀                       圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
        BEGIN  -- The form id does not exist਀            匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
            SET @transaction_ready      = 'Fail';਀            䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                @message_id = 'FormNotExist', ਀                䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
            IF @tempmessage IS NOT NULL ਀                匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
            ELSE  ਀                匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
        END ਀    䔀一䐀    
    ELSE -- If no form ID supplied then retrieve the default and then check the default਀    䈀䔀䜀䤀一 
        SET @formid = (SELECT default_form_id ਀                       䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
                       WHERE base.global_settings_groups.setting_group_name = 'Master');਀        䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
        BEGIN  -- The form ID does not exist਀            䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                @message_id = 'DefFormNotExist', ਀                䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
            SET @data_validation_status = 'Fail';਀            匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
            IF @tempmessage IS NOT NULL ਀                匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
            ELSE  ਀                匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
        END ਀    䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀    ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
    IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
        EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
            @message_text = @tempmessage OUTPUT;਀        䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
            SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀        䔀䰀匀䔀  
            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀    䔀一䐀 
  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀    ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀    䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀        ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 
        EXEC [internal].[usp_AUTHENTICATE_user_role] ਀            䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
            @user_authentication_result = @iscontroller OUTPUT;਀ 
        BEGIN TRY਀            ⴀⴀ 䌀吀䔀 琀漀 最攀琀 愀氀氀 昀椀氀攀猀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
            WITH EditableFilesCTE AS (਀                匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀  
                FROM base.file_metadata AS fm਀                䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀  
				       ON    fm.file_id ਀ऀऀऀऀऀ      㴀 昀最氀⸀昀椀氀攀开椀搀 
                LEFT JOIN xref.file_group_names AS fgn ਀ऀऀऀऀ       伀一   昀最氀⸀昀椀氀攀开最爀漀甀瀀开椀搀  
					      = fgn.file_group_id਀                䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 挀昀最氀  
				       ON     fm.file_id ਀ऀऀऀऀऀ      㴀 挀昀最氀⸀昀椀氀攀开椀搀 
                LEFT JOIN xref.controller_file_group_names AS cfgn ਀ऀऀऀऀ       伀一   挀昀最氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀  
					      = cfgn.controller_file_group_name_id਀                圀䠀䔀刀䔀  
                    -- Controller with viewing rights, except for controller groups they're not part of਀                    ⠀䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 䄀一䐀 
                    (cfgl.file_id IS NULL OR਀ऀऀऀऀऀ 䔀堀䤀匀吀匀 ⠀ 
						 SELECT 1਀ऀऀऀऀऀऀ 䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						 LEFT JOIN user_restr.controller_file_grp_sid_links AS cfgsl ਀ऀऀऀऀऀऀ        伀一 猀氀⸀猀椀搀开椀搀 㴀 挀昀最猀氀⸀猀椀搀开椀搀 
						 LEFT JOIN xref.controller_file_group_names AS cfgn ਀ऀऀऀऀऀऀ        伀一  挀昀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀  
						           = cfgn.controller_file_group_name_id਀ऀऀऀऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 挀昀最氀  
						        ON   cfgn.controller_file_group_name_id ਀ऀऀऀऀऀऀ           㴀 挀昀最氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
						 WHERE cfgl.file_id = fm.file_id਀ऀऀऀऀऀऀ 䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
					 )))਀                    伀刀 
                    -- Non-controller with edit permissions਀                    ⠀䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀䘀愀椀氀✀ 䄀一䐀 
                    (਀                        ⴀⴀ 吀栀爀漀甀最栀 昀甀渀挀琀椀漀渀 氀椀猀琀 
                        EXISTS (਀                            匀䔀䰀䔀䌀吀 ㄀ 
                            FROM user_restr.file_group_edit_perm_funct_lst AS fgepfl਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀  
							  ON fgepfl.function_list_id ਀ऀऀऀऀऀऀऀ     㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
                            JOIN people.function_lists AS fl ਀ऀऀऀऀऀऀऀ  伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
							     = fl.function_list_id਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀  
							  ON   fl.function_id ਀ऀऀऀऀऀऀऀ     㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
                            JOIN people.duty_function_sid_links AS dfsl ਀ऀऀऀऀऀऀऀ  伀一     搀昀⸀昀甀渀挀琀椀漀渀开椀搀   
							     = dfsl.function_id਀                            䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀  
							  ON dfsl.sid_id ਀ऀऀऀऀऀऀऀ     㴀 猀氀⸀猀椀搀开椀搀 
                           WHERE fgepfl.file_group_id ਀ऀऀऀऀऀऀऀ      㴀 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
                            AND sl.sid = @connectedusersid ਀                        ⤀ 
                        OR਀                        ⴀⴀ 吀栀爀漀甀最栀 瀀攀漀瀀氀攀 氀椀猀琀 
                        EXISTS (਀                            匀䔀䰀䔀䌀吀 ㄀ 
                            FROM user_restr.file_group_edit_perm_ppl_lst AS fgeppl਀                            䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀  
							  ON fgeppl.people_list_id ਀ऀऀऀऀऀऀऀ     㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
                            JOIN people.people_lists AS pl ਀ऀऀऀऀऀऀऀ  伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
							     = pl.people_list_id਀                            䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀  
							  ON   pl.sid_id ਀ऀऀऀऀऀऀऀ     㴀 猀氀⸀猀椀搀开椀搀 
                           WHERE fgeppl.file_group_id ਀ऀऀऀऀऀऀऀ     㴀  昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
                            AND sl.sid = @connectedusersid ਀                        ⤀ 
                    ))਀            ⤀Ⰰ 
            fileDataCTE AS (਀                匀䔀䰀䔀䌀吀  
                    EditableFilesCTE.ID AS fileid, ਀                    昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ  
                    file_data.field_name_id, ਀                    昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀Ⰰ  
                    file_data.field_mnemonic, ਀                    昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀Ⰰ  
                    file_data.attr_value, ਀                    昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀Ⰰ  
                    file_data.form_position਀                䘀刀伀䴀 䔀搀椀琀愀戀氀攀䘀椀氀攀猀䌀吀䔀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply view permission filtering਀           伀一 䔀搀椀琀愀戀氀攀䘀椀氀攀猀䌀吀䔀⸀䤀䐀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
                CROSS APPLY [internal].[ufn_SEL_one_fl_data_by_frm_TVF](EditableFilesCTE.ID, @formid) AS file_data਀            ⤀Ⰰ 
            AttDataCTE AS (਀                匀䔀䰀䔀䌀吀  
                    DENSE_RANK() OVER (ORDER BY fileDataCTE.fileid) AS file_count,਀                    昀椀氀攀䐀愀琀愀䌀吀䔀⸀⨀ 
                FROM fileDataCTE਀            ⤀ 
਀            䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀 ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
            SELECT ਀                昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀 
            FROM AttDataCTE;਀ 
            SELECT @numfiles = MAX(file_count) from @AttData;਀ 
            SELECT ਀                愀搀⸀昀椀氀攀开挀漀甀渀琀ऀऀऀऀ  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
                ad.fileid					  AS 'File ID', ਀                愀搀⸀昀椀攀氀搀开琀礀瀀攀ऀऀऀऀ  䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
                ad.field_name_id			  AS 'Name ID', ਀                䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀ऀ  䄀匀 ✀一愀洀攀✀Ⰰ  
                ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀                愀搀⸀愀琀琀爀开椀搀ऀऀऀऀऀ  䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
                ISNULL(ad.attr_value, '')	  AS 'Value', ਀                䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀ऀऀ  䄀匀 ✀唀渀椀琀猀✀Ⰰ 
                ISNULL(ad.form_position, '')  AS 'Position'਀            䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
            ORDER BY Position, Record, [File ID];਀ 
            SET @numrows = @@ROWCOUNT;਀ 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
            EXEC internal.usp_SEL_message ਀                䀀洀攀猀猀愀最攀开椀搀 㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
                @message_text = @tempmessage OUTPUT;਀            䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
                SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀            䔀䰀匀䔀  
                SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀            匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
        END TRY਀        䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
            SET @transaction_status = 'Bad';਀            䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                @message_id = 'SelectError', ਀                䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
            IF @tempmessage IS NOT NULL ਀                匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
            ELSE਀                匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
        END CATCH਀     
    END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows = ISNULL(@numrows, 0);਀    匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
    ਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_filter_group_attr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Selects the list of attributes linked to a given filter group.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀ 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀椀氀琀攀爀开最爀漀甀瀀开愀琀琀爀崀  
਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀ 
਀ 䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀爀䐀愀琀愀 吀䄀䈀䰀䔀 
   (਀     昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 field_name_id bigint,਀ऀ 昀椀攀氀搀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 attr_id bigint,਀ऀ 愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀ 
   )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
 -- Data Validation਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀爀䐀愀琀愀 ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀⤀ 
      SELECT 		 ਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 刀愀搀椀漀 䈀甀琀琀漀渀✀  䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			names.doc_radiob_list_id AS field_name_id, ਀ऀऀऀ渀愀洀攀猀⸀愀琀琀爀开渀愀洀攀          䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			attr.doc_radiob_attr_id  AS attr_id, ਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀           䄀匀 愀琀琀爀开瘀愀氀甀攀 
		     FROM doc_attr.doc_radiob_attr_fgroup_links AS links਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
		       ON  links.doc_radiob_attr_id਀ऀऀऀ      㴀 愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
		LEFT JOIN doc_attr.doc_radio_button_list_names AS names਀ऀऀ       伀一    愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
			      = names.doc_radiob_list_id਀ऀऀ    圀䠀䔀刀䔀 氀椀渀欀猀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
			      = @filtergroupid਀ 
	INSERT INTO @AttrData (field_type, field_name_id, field_name, attr_id, attr_value)਀      匀䔀䰀䔀䌀吀 ऀऀ  
			'Document Multi-Select'  AS field_type, ਀ऀऀऀ渀愀洀攀猀⸀搀漀挀开洀猀开氀椀猀琀开椀搀     䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			names.attr_name          AS field_name, ਀ऀऀऀ愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开椀搀      䄀匀 愀琀琀爀开椀搀Ⰰ  
			attr.attr_name           AS attr_value਀ऀऀ     䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
		LEFT JOIN doc_attr.doc_multi_select_attributes AS attr਀ऀऀ       伀一  氀椀渀欀猀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
			      = attr.doc_ms_attr_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 渀愀洀攀猀 
		       ON    attr.doc_ms_list_id਀ऀऀऀ      㴀 渀愀洀攀猀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
		    WHERE links.filter_group_id਀ऀऀऀ      㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀爀䐀愀琀愀 ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀⤀ 
      SELECT 		 ਀ऀऀऀ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀✀       䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			names.file_radiob_list_id AS field_name_id, ਀ऀऀऀ渀愀洀攀猀⸀愀琀琀爀开渀愀洀攀           䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			attr.file_radiob_attr_id  AS attr_id, ਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀            䄀匀 愀琀琀爀开瘀愀氀甀攀 
		     FROM file_attr.file_radiob_attr_fgroup_links AS links਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
		       ON  links.file_radiob_attr_id਀ऀऀऀ      㴀 愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
		LEFT JOIN file_attr.file_radio_button_list_names AS names਀ऀऀ       伀一    愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
			      = names.file_radiob_list_id਀ऀऀ    圀䠀䔀刀䔀 氀椀渀欀猀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
			      = @filtergroupid਀ऀऀ 
	INSERT INTO @AttrData (field_type, field_name_id, field_name, attr_id, attr_value)਀      匀䔀䰀䔀䌀吀 ऀऀ  
			'File Multi-Select'      AS field_type, ਀ऀऀऀ渀愀洀攀猀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀    䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			names.attr_name          AS field_name, ਀ऀऀऀ愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀     䄀匀 愀琀琀爀开椀搀Ⰰ  
			attr.attr_name           AS attr_value਀ऀऀ     䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 氀椀渀欀猀 
		LEFT JOIN file_attr.file_multi_select_attributes AS attr਀ऀऀ       伀一  氀椀渀欀猀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
			      = attr.file_ms_attr_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 渀愀洀攀猀 
		       ON    attr.file_ms_list_id਀ऀऀऀ      㴀 渀愀洀攀猀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
		    WHERE links.filter_group_id਀ऀऀऀ      㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
		਀ऀऀ 
     SELECT ਀ऀ        昀椀攀氀搀开琀礀瀀攀     䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ 
	        field_name_id  AS 'Field Name ID', ਀ऀऀऀ昀椀攀氀搀开渀愀洀攀     䄀匀 ✀䘀椀攀氀搀 一愀洀攀✀Ⰰ  
			attr_id        AS 'Attribute ID', ਀ऀऀऀ愀琀琀爀开瘀愀氀甀攀     䄀匀 ✀䄀琀琀爀椀戀甀琀攀 嘀愀氀甀攀✀ 
       FROM @AttrData;਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
--============================================================਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_filter_groups]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Selects all filter groups਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 愀氀氀 昀椀氀琀攀爀 最爀漀甀瀀猀Ⰰ 
-- plus a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_filter_groups] ਀ऀ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀ           昀椀氀琀攀爀开最爀漀甀瀀开椀搀   䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䤀䐀✀Ⰰ  
	           ISNULL(mnem, '')  AS Mnemonic, ਀ऀऀऀ   愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ  
	           ISNULL(descr, '') AS Description, ਀ऀ           氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀  
	      FROM forms.filter_groups ਀      伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	            SET @zerorecordsmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
		         SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	       SET @transactionmessage = @tempmessage;਀ऀ    䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  END TRY਀  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		   CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ䔀䰀匀䔀  
		    SET @transactionmessage = 'A database level message error occurred on SelectError';਀  䔀一䐀 䌀䄀吀䌀䠀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fl_by_fnct_lst_nm]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㔀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for all the files for a given general field name linked to duty function lists਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/ ਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_fl_by_fnct_lst_nm] ਀ 
      @genfield_nameid bigint          = NULL,  ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀  
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fl_by_funct_fld_nm]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㔀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for all the files for a given general field name linked to duty functions਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/ ਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_fl_by_funct_fld_nm] ਀ 
      @genfield_nameid bigint          = NULL,  ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀  
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fl_by_ppl_lst_nm]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㔀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for all the files for a given general field name linked to people lists਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/ ਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_fl_by_ppl_lst_nm] ਀ 
      @genfield_nameid bigint          = NULL,  ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
 ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
਀  
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀    ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fl_by_user_fgn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Selects file metadata for all the files for a given user general field name਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䐀椀昀昀攀爀猀 昀爀漀洀 爀攀愀搀椀渀最⸀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀 椀渀 琀栀愀琀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀开戀礀开甀猀攀爀开昀最渀崀  
਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ     
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username   ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',		਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀           ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
 ਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 渀愀洀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
		WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀       ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  ऀ   
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fl_cm_obj_ms_lnk]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file common objects from multi-select list਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀⸀  伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 氀椀渀欀攀搀 琀漀 琀栀愀琀 昀椀氀攀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀开挀洀开漀戀樀开洀猀开氀渀欀崀 
਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records where retrieved਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀㬀     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
		BEGIN TRY਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
		         fm.file_id                     AS 'File ID',਀ऀऀऀऀ 挀漀氀渀⸀氀椀猀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 co.object_name                 AS 'Common Object Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀洀渀攀洀Ⰰ ✀✀⤀            䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 ISNULL(co.description, '')     AS 'Common Object Description',਀ऀऀऀऀ 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀            䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䤀䐀✀Ⰰ 
				 ISNULL(coa.attr_name, '')      AS 'Common Object Attribute Name',਀ऀऀऀऀ 挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				 coln.common_object_list_id     AS 'Common Object List ID',਀ऀऀऀऀ 挀漀氀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀              䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
			FROM com_obj.common_objects  AS co਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 挀漀愀 
				  ON   coa.common_object_attribute_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			LEFT JOIN com_obj.common_object_lists AS col਀ऀऀऀऀ  伀一   挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = co.common_object_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
				  ON    coln.common_object_list_id਀ऀऀऀऀऀ  㴀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			LEFT JOIN com_obj.file_to_com_obj_ms_list_links AS comsll਀ऀऀऀऀ  伀一       挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = comsll.common_object_id਀ऀऀऀऀऀ  䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  = comsll.common_object_list_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
			      ON  fm.file_id਀ऀऀऀऀ      㴀 挀漀洀猀氀氀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  
			ORDER BY 'File ID', 'Common Object List Name', 'List Position';਀ 
਀  ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'ZeroRecords', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		  SET @transaction_status = 'Good';਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
			 CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ  䔀䰀匀䔀 
			   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	END਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀开挀洀开漀戀樀开爀戀开氀渀欀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 昀爀漀洀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀开挀洀开漀戀樀开爀戀开氀渀欀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN();     -- The username ਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
		  SELECT DISTINCT਀ऀऀ         昀洀⸀昀椀氀攀开椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
				 coln.list_name                 AS 'Common Object List Name',਀ऀऀऀऀ 挀漀⸀漀戀樀攀挀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 一愀洀攀✀Ⰰ 
				 ISNULL(co.mnem, '')            AS 'Common Object Mnemonic',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 co.common_object_id            AS 'Common Object ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀऀ 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀ 
			FROM com_obj.common_objects  AS co਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 挀漀愀 
				  ON   coa.common_object_attribute_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			LEFT JOIN com_obj.common_object_lists AS col਀ऀऀऀऀ  伀一   挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = co.common_object_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
				  ON    coln.common_object_list_id਀ऀऀऀऀऀ  㴀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			LEFT JOIN com_obj.file_to_com_obj_radiob_links AS corbll਀ऀऀऀऀ  伀一       挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = corbll.common_object_id਀ऀऀऀऀऀ  䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  = corbll.common_object_list_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
			      ON  fm.file_id਀ऀऀऀऀ      㴀 挀漀爀戀氀氀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  
਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䘀椀氀攀 䤀䐀✀Ⰰ ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀㬀 
਀  ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'ZeroRecords', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		  SET @transaction_status = 'Good';਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
			 CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ  䔀䰀匀䔀 
			   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	END਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fls_by_co_ms_attr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given common object multi-select attribute਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀猀开戀礀开挀漀开洀猀开愀琀琀爀崀  
਀      䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @commonobjectid  bigint          = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 䈀漀琀栀 愀渀 漀瀀琀椀漀渀愀氀 椀渀瀀甀琀 愀渀搀 愀渀 漀甀琀瀀甀琀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀    
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰऀऀ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the common object multi-select attribute ID.਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  
   INNER JOIN com_obj.file_to_com_obj_ms_list_links AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀ऀ    圀䠀䔀刀䔀     猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.common_object_id      = @commonobjectid਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀   匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fls_by_co_rb_attr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given common object radio button attribute਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀氀猀开戀礀开挀漀开爀戀开愀琀琀爀崀  
਀      䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @commonobjectid  bigint          = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 䈀漀琀栀 愀渀 漀瀀琀椀漀渀愀氀 椀渀瀀甀琀 愀渀搀 愀渀 漀甀琀瀀甀琀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀   
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰऀऀ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the common object radio button attribute ID.਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  
   INNER JOIN com_obj.file_to_com_obj_radiob_links AS searchtable -- ### The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀ऀ    圀䠀䔀刀䔀     猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.common_object_id      = @commonobjectid਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀   匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_fls_by_txt_fld_any]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ㄀㈀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for all the files which are linked to a given text field. ਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_fls_by_txt_fld_any] ਀ 
	  @filetextnameid bigint           = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀    
	    @userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰऀऀ 
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filetextnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filetextnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀攀砀琀一愀洀攀䤀搀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTextNameId.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file text name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_free_text_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_free_text_name_id = @filetextnameid) -- Check if the file text name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TextIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 琀攀砀琀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes.਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_free_text_values AS searchtable  -- ### The search table name਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
						)਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_form_defaults]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Lists all the field defaults for a given form.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 昀甀渀挀琀椀漀渀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists metadata associated with a document.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* @formid bigint਀⨀ 䤀昀 䀀昀漀爀洀椀搀 椀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 琀栀攀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀 昀爀漀洀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 眀椀氀氀 戀攀 甀猀攀搀⸀  
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀漀爀洀 搀攀昀愀甀氀琀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
* - @numrows bigint OUTPUT: Number of rows returned.਀⨀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_form_defaults] ਀ 
	  @formid bigint                   = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀        䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @dateformat nchar(3)               = 'dmy', ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @FormDefaultFields TABLE ਀ऀऀ⠀ 
			 field_type nvarchar(50),਀ऀऀऀ 昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
			 field_name nvarchar(50),਀ऀऀऀ 愀琀琀爀开椀搀 戀椀最椀渀琀Ⰰ 
			 attr_name nvarchar(150)਀ऀऀ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
	 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
  ਀ 
IF @transaction_ready = 'Ready'਀ 
BEGIN਀ऀ䈀䔀䜀䤀一 吀刀夀 
-- ===================================================਀ 
-- Extract the data according to the form id਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
  	 INSERT INTO @FormDefaultFields  (field_type, field_name_id, field_name, attr_id, attr_name)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.doc_radiob_list_id  AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀           䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			attr.doc_radiob_attr_id       AS attr_id,਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀                䄀匀 愀琀琀爀开瘀愀氀甀攀 
	   FROM forms.form_doc_radio_button_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.doc_radiob_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
  LEFT JOIN doc_attr.doc_radio_button_attributes AS attr਀         伀一   昀漀爀洀⸀搀攀昀愀甀氀琀开搀漀挀开爀戀开愀琀琀爀开椀搀 
		    = attr.doc_radiob_attr_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀 
  	 INSERT INTO @FormDefaultFields  (field_type, field_name_id, field_name, attr_id, attr_name)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.doc_ms_list_id  AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀       䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			attr.doc_ms_attr_id       AS attr_id,਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀            䄀匀 愀琀琀爀开瘀愀氀甀攀 
	   FROM forms.form_doc_multi_sel_defaults AS form਀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.doc_ms_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
  LEFT JOIN doc_attr.doc_multi_select_attributes AS attr਀         伀一   昀漀爀洀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
		    = attr.doc_ms_attr_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀 
  	 INSERT INTO @FormDefaultFields  (field_type, field_name_id, field_name, attr_id, attr_name)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀 䌀漀洀洀漀渀 伀戀樀攀挀琀猀 䴀甀氀琀椀ⴀ匀攀氀 䄀琀琀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.common_object_list_id     AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀                 䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			attr.common_object_id               AS attr_id,਀ऀऀऀ愀琀琀爀⸀漀戀樀攀挀琀开渀愀洀攀                    䄀匀 愀琀琀爀开瘀愀氀甀攀 
	   FROM forms.form_doc_com_obj_ms_defaults AS form਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.common_object_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
 INNER JOIN com_obj.common_objects AS attr਀         伀一   昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
		    = attr.common_object_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
	 ਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 
  	 INSERT INTO @FormDefaultFields  (field_type, field_name_id, field_name, attr_id, attr_name)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀 䌀漀洀洀漀渀 伀戀樀攀挀琀猀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.common_object_list_id        AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀                    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			attr.common_object_id                  AS attr_id,਀ऀऀऀ愀琀琀爀⸀漀戀樀攀挀琀开渀愀洀攀                       䄀匀 愀琀琀爀开瘀愀氀甀攀 
	   FROM forms.form_doc_com_obj_rb_lst_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.common_object_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
  LEFT JOIN com_obj.common_objects AS attr਀         伀一   昀漀爀洀⸀搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
		    = attr.common_object_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
-- ==== Files਀ 
	 --forms.form_file_radio_button_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䐀攀昀愀甀氀琀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开渀愀洀攀⤀ 
     SELECT 'File Radio Button Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name            AS field_name,਀ऀऀऀ愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀       䄀匀 愀琀琀爀开椀搀Ⰰ 
			attr.attr_name                 AS attr_value਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN file_attr.file_radio_button_list_names AS fieldname਀         伀一        昀漀爀洀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		    = fieldname.file_radiob_list_id਀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 愀琀琀爀 
         ON  form.default_file_rb_attr_id਀ऀऀ    㴀 愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀 
  	 INSERT INTO @FormDefaultFields  (field_type, field_name_id, field_name, attr_id, attr_name)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.file_ms_list_id AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀       䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			attr.file_ms_attr_id      AS attr_id,਀ऀऀऀ愀琀琀爀⸀愀琀琀爀开渀愀洀攀            䄀匀 愀琀琀爀开瘀愀氀甀攀 
	   FROM forms.form_file_multi_sel_defaults AS form਀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.file_ms_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
 INNER JOIN file_attr.file_multi_select_attributes AS attr਀         伀一  昀漀爀洀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
		    = attr.file_ms_attr_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_com_obj_ms_defaults਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䐀攀昀愀甀氀琀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开渀愀洀攀⤀ 
     SELECT 'File Common Objects Multi-Sel Attr' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀    䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.list_name                AS field_name,਀ऀऀऀ愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀              䄀匀 愀琀琀爀开椀搀Ⰰ 
			attr.object_name                   AS attr_value਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀 䄀匀 昀漀爀洀 
 INNER JOIN com_obj.common_object_list_names AS fieldname਀         伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		    = fieldname.common_object_list_id਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 愀琀琀爀 
         ON   form.common_object_id਀ऀऀ    㴀 愀琀琀爀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀 
  	 INSERT INTO @FormDefaultFields  (field_type, field_name_id, field_name, attr_id, attr_name)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䌀漀洀洀漀渀 伀戀樀攀挀琀猀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.common_object_list_id    AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀                䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			attr.common_object_id              AS attr_id,਀ऀऀऀ愀琀琀爀⸀漀戀樀攀挀琀开渀愀洀攀                   䄀匀 愀琀琀爀开瘀愀氀甀攀 
	   FROM forms.form_file_com_obj_rb_lst_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.common_object_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
 INNER JOIN com_obj.common_objects AS attr਀         伀一   昀漀爀洀⸀搀攀昀愀甀氀琀开挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
		    = attr.common_object_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀  
਀ 
਀ 
-- ===================================================਀        匀䔀䰀䔀䌀吀 䀀昀漀爀洀椀搀       䄀匀 ✀䘀漀爀洀 䤀䐀✀Ⰰ 
		       field_type    AS 'Field Type',਀ऀऀ       昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 ✀䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ 
			   field_name    AS 'Field Name',਀ऀऀऀ   愀琀琀爀开椀搀       䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
			   attr_name     AS 'Attribute Name'਀ 
          FROM @FormDefaultFields;਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END  -- End IF @transaction_ready = 'Ready'਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀漀爀洀开昀椀攀氀搀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 愀氀氀 漀昀 琀栀攀 攀氀攀洀攀渀琀猀 漀昀 愀 昀漀爀洀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema, stored procedures and functions are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 洀攀琀愀搀愀琀愀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ 䀀昀漀爀洀椀搀 戀椀最椀渀琀 
* If @formid is not supplied then the default_form_id from base.global_settings_groups will be used. ਀⨀ 
* **Return Values:**਀⨀ 
* - A list of form metadata.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_form_fields] ਀ 
	  @formid bigint                   = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 ✀✀ 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀        䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @dateformat nchar(3)               = 'dmy', ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @FormFields TABLE ਀ऀऀ⠀ 
			 field_type nvarchar(50),਀ऀऀऀ 昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
			 field_name nvarchar(50),਀ऀ         甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
			 mandatory nchar(3),਀ऀऀऀ 氀攀渀最琀栀 猀洀愀氀氀椀渀琀Ⰰ 
			 position nvarchar(50),਀ऀऀऀ 愀琀琀爀椀戀甀琀攀㄀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
			 attribute2 nvarchar(50),਀ऀऀऀ 愀琀琀爀椀戀甀琀攀㌀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
		)਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
	 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
  ਀ 
 IF @transaction_ready = 'Ready'਀ 
 BEGIN਀ऀ䈀䔀䜀䤀一 吀刀夀 
-- ===================================================਀ 
-- Extract the data according to the form id਀ 
     --forms.form_doc_free_text_field_links਀ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀 ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
      SELECT ਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 䘀爀攀攀 吀攀砀琀✀            䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.doc_free_text_name_id AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀             䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                       䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3਀ 
	   FROM forms.form_doc_free_text_field_links AS form਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON         form.doc_free_text_name_id਀ऀऀ    㴀  昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_date_field_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Date'                 AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name             AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                       AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_doc_date_field_links AS form਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON         form.doc_date_name_id਀ऀऀ    㴀  昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_radio_button_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Doc Radio Button Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name           AS field_name,਀ऀऀऀ一唀䰀䰀                          䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                     AS mandatory,਀ऀऀऀ氀攀渀最琀栀                        䄀匀 氀攀渀最琀栀Ⰰ 
			position                      AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                    䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                    AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                    䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_doc_radio_button_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.doc_radiob_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_multi_sel_list_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Doc Multi-Select Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name           AS field_name,਀ऀऀऀ一唀䰀䰀                          䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                     AS mandatory,਀ऀऀऀ氀攀渀最琀栀                        䄀匀 氀攀渀最琀栀Ⰰ 
			position                      AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                    䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                    AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                    䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_doc_multi_sel_list_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.doc_ms_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_com_obj_ms_lst_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Doc Common Objects Multi-Sel Attr' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.list_name                 AS field_name,਀ऀऀऀ一唀䰀䰀                                䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                           AS mandatory,਀ऀऀऀ氀攀渀最琀栀                              䄀匀 氀攀渀最琀栀Ⰰ 
			position                            AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                          䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                          AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                          䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_doc_com_obj_ms_lst_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.common_object_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_com_obj_rb_lst_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Doc Common Objects Radio Button Attr' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀        䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.list_name                    AS field_name,਀ऀऀऀ一唀䰀䰀                                   䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                              AS mandatory,਀ऀऀऀ氀攀渀最琀栀                                 䄀匀 氀攀渀最琀栀Ⰰ 
			position                               AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                             䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                             AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                             䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_doc_com_obj_rb_lst_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.common_object_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 䤀渀琀攀最攀爀✀              䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.doc_int_name_id       AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀             䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'Units'                         AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                       䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  INNER JOIN doc_attr.doc_integer_field_names AS fieldname਀         伀一         昀漀爀洀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 
		    =  fieldname.doc_int_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_doc_function_links  Note that duty function lists are overlapping sets.  ਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Duty Function'  AS field_type,਀ऀऀऀ最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			gfn.name                  AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                 AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_doc_function_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
         ON  form.general_field_name_id਀ऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_function_list_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Duty Function List' AS field_type,਀ऀऀऀ最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			gfn.name                  AS field_name,਀ऀऀऀ一唀䰀䰀                          䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                 AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_function_list_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
         ON  form.general_field_name_id਀ऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
	 --forms.form_doc_people_list_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document People List'    AS field_type,਀ऀऀऀ最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			gfn.name                  AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                 AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_people_list_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
         ON  form.general_field_name_id਀ऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ऀ  ⴀⴀ嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀崀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 唀猀攀爀 䰀椀渀欀✀      䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			gfn.general_field_name_id AS field_name_id,਀ऀऀऀ最昀渀⸀渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                      AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                 䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                    AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                  䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开甀猀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN people.general_field_names AS gfn਀         伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		    = gfn.general_field_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_doc_real_number_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Real Number'      AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name         AS field_name,਀ऀऀऀ✀唀渀椀琀猀✀                     䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                   AS mandatory,਀ऀऀऀ氀攀渀最琀栀                      䄀匀 氀攀渀最琀栀Ⰰ 
			position                    AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                  䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                  AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                  䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_real_number_links AS form਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON         form.doc_real_name_id਀ऀऀ    㴀  昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀  
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀    䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀✀    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                       䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀  
	  WHERE form_id = @formid਀  
	 --forms.forms.form_doc_lock_status_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document ID Lock Status'       AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document ID Lock Status'       AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                       AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_lock_status_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀  
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䐀愀琀攀✀         䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䐀愀琀攀✀         䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀 
	  WHERE form_id = @formid ਀ 
	 --forms.forms.form_doc_created_by_nm_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Created By Name'      AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Created By Name'      AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_created_by_nm_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀  
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀   䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀   䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 
	  WHERE form_id = @formid ਀ 
	 --[forms].[form_doc_booking_comnts_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Booking Comments'     AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Booking Comments'     AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_booking_comnts_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀  
਀ऀ ⴀⴀ嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀崀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䐀愀琀攀✀         䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 䐀愀琀攀✀         䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开搀愀琀攀开氀椀渀欀猀 
	  WHERE form_id = @formid ਀ 
	 --[forms].[form_doc_booking_id_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Booking ID'           AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Booking ID'           AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_booking_id_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀  
਀ऀ ⴀⴀ嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀崀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 刀攀氀攀愀猀攀 一甀洀戀攀爀✀    䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 刀攀氀攀愀猀攀 一甀洀戀攀爀✀    䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开爀攀氀攀愀猀攀开氀椀渀欀猀 
	  WHERE form_id = @formid ਀ 
਀ऀ ⴀⴀ嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀崀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 匀琀愀琀甀猀✀       䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 匀琀愀琀甀猀✀       䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开猀琀愀琀甀猀开氀椀渀欀猀 
	  WHERE form_id = @formid ਀ 
	 --[forms].[form_doc_booking_user_id_links]਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'Document Booking User ID'      AS field_type,਀ऀऀऀ一唀䰀䰀                            䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'Document Booking User ID'      AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			NULL                            AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ऀ 
	   FROM forms.form_doc_booking_user_id_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀  
਀ऀ ⴀⴀ嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀崀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀渀愀洀攀✀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                            AS field_name_id,਀ऀऀऀ✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 唀猀攀爀渀愀洀攀✀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                            AS units,਀ऀऀऀ一唀䰀䰀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开搀漀挀开戀漀漀欀椀渀最开甀猀攀爀渀洀开氀椀渀欀猀 
	  WHERE form_id = @formid ਀ 
-- ====================================================== Files਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䘀爀攀攀 吀攀砀琀✀            䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			form.file_free_text_name_id AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀         䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                        AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                   䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                      AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                    䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                  AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                  䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                  AS attribute3 ਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀爀攀攀开琀攀砀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  INNER JOIN file_attr.file_free_text_field_names AS fieldname਀         伀一   昀漀爀洀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 
		    = fieldname.file_free_text_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
  ਀ 
	 --forms.form_file_date_field_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Date'                     AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀     䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name             AS field_name,਀ऀऀऀ一唀䰀䰀                            䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                       AS mandatory,਀ऀऀऀ氀攀渀最琀栀                          䄀匀 氀攀渀最琀栀Ⰰ 
			position                        AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                      䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                      AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                      䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_date_field_links AS form਀  䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON         form.file_date_name_id਀ऀऀ    㴀  昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀猀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.file_radiob_list_id  AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀            䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                           AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                      䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                         AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                       䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                     AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                     䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                     AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN file_attr.file_radio_button_list_names AS fieldname਀         伀一        昀漀爀洀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
		    = fieldname.file_radiob_list_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_multi_sel_list_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Multi-Select Attributes' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.attr_name            AS field_name,਀ऀऀऀ一唀䰀䰀                           䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                      AS mandatory,਀ऀऀऀ氀攀渀最琀栀                         䄀匀 氀攀渀最琀栀Ⰰ 
			position                       AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                     䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                     AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                     䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_multi_sel_list_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.file_ms_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䌀漀洀洀漀渀 伀戀樀攀挀琀猀 䴀甀氀琀椀ⴀ匀攀氀 䄀琀琀爀✀ 䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.common_object_list_id      AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀氀椀猀琀开渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                                 AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                            䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                               AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                             䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                           AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                           䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                           AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN com_obj.common_object_list_names AS fieldname਀         伀一        昀漀爀洀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		    = fieldname.common_object_list_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_com_obj_rb_lst_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Common Objects Radio Button Attr' AS field_type,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀         䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			fieldname.list_name                     AS field_name,਀ऀऀऀ一唀䰀䰀                                    䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                               AS mandatory,਀ऀऀऀ氀攀渀最琀栀                                  䄀匀 氀攀渀最琀栀Ⰰ 
			position                                AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                              䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                              AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                              䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_com_obj_rb_lst_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
         ON        form.common_object_list_id਀ऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
	  WHERE form.form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䤀渀琀攀最攀爀✀                  䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.file_int_name_id      AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀             䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'Units'                         AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                       䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                          AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                        䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                      AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                      䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                      AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  INNER JOIN file_attr.file_integer_field_names AS fieldname਀         伀一         昀漀爀洀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 
		    =  fieldname.file_int_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
    --forms.form_file_function_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Duty Function'      AS field_type,਀ऀऀऀ最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			gfn.name                  AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                 AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀  
	   FROM forms.form_file_function_links AS form਀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
         ON  form.general_field_name_id਀ऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
	  WHERE form_id = @formid਀ऀऀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䐀甀琀礀 䘀甀渀挀琀椀漀渀 䰀椀猀琀✀  䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			gfn.general_field_name_id AS field_name_id,਀ऀऀऀ最昀渀⸀渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                       AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                 䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                    AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                  䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                AS attribute3 ਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN people.general_field_names AS gfn਀         伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		    = gfn.general_field_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀  
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 倀攀漀瀀氀攀 䰀椀猀琀✀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			gfn.general_field_name_id AS field_name_id,਀ऀऀऀ最昀渀⸀渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                   AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀              䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                 AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀               䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1             AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀             䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3             AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN people.general_field_names AS gfn਀         伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		    = gfn.general_field_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ  ⴀⴀ嬀昀漀爀洀猀崀⸀嬀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀崀 
  	 INSERT INTO @FormFields  (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 唀猀攀爀 䰀椀渀欀✀          䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			gfn.general_field_name_id AS field_name_id,਀ऀऀऀ最昀渀⸀渀愀洀攀                  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                      AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                 䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                    AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                  䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                AS attribute3	਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开甀猀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀 
 INNER JOIN people.general_field_names AS gfn਀         伀一  昀漀爀洀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		    = gfn.general_field_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 刀攀愀氀 一甀洀戀攀爀✀           䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			fieldname.file_real_name_id  AS field_name_id,਀ऀऀऀ昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀          䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			'Units'                      AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀                    䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                       AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                     䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                   AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                   䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                   AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀 䄀匀 昀漀爀洀 
  INNER JOIN file_attr.file_real_number_field_names AS fieldname਀         伀一         昀漀爀洀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 
		    =  fieldname.file_real_name_id਀ऀ  圀䠀䔀刀䔀 昀漀爀洀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀渀愀洀攀✀            䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                  AS field_name_id,਀ऀऀऀ✀䘀椀氀攀渀愀洀攀✀            䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                  AS units,਀ऀऀऀ洀愀渀搀愀琀漀爀礀             䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀              䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1            AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀            䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3            AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀 
	  WHERE form_id = @formid਀ 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䌀漀渀琀攀渀琀 䠀愀猀栀✀   䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                  AS field_name_id,਀ऀऀऀ✀䘀椀氀攀 䌀漀渀琀攀渀琀 䠀愀猀栀✀   䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                  AS units,਀ऀऀऀ一唀䰀䰀                  䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀              䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1            AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀            䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3            AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀漀渀琀攀渀琀开栀愀猀栀开氀椀渀欀猀 
	  WHERE form_id = @formid਀ 
	 --forms.form_file_transactn_grp_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT'File Transaction Group'   AS field_type,਀ऀऀऀ一唀䰀䰀                      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Transaction Group'  AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			mandatory                 AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_transactn_grp_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀 
਀ 
	 --forms.form_file_size_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Size'               AS field_type,਀ऀऀऀ一唀䰀䰀                      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Size'               AS field_name,਀ऀऀऀ✀䈀礀琀攀猀✀                   䄀匀 甀渀椀琀猀Ⰰ 
			NULL                      AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_size_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
 ਀ ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䐀愀琀攀✀       䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                      AS field_name_id,਀ऀऀऀ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䐀愀琀攀✀       䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                      AS units,਀ऀऀऀ一唀䰀䰀                      䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                    AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                  䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀 
	  WHERE form_id = @formid;਀ 
	 --forms.form_file_created_by_nm_links਀  ऀ 䤀一匀䔀刀吀 䤀一吀伀 䀀䘀漀爀洀䘀椀攀氀搀猀   ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 甀渀椀琀猀Ⰰ 洀愀渀搀愀琀漀爀礀Ⰰ 氀攀渀最琀栀Ⰰ 瀀漀猀椀琀椀漀渀Ⰰ 愀琀琀爀椀戀甀琀攀㄀Ⰰ 愀琀琀爀椀戀甀琀攀㈀Ⰰ 愀琀琀爀椀戀甀琀攀㌀⤀ 
     SELECT 'File Created By Name'    AS field_type,਀ऀऀऀ一唀䰀䰀                      䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 
			'File Created By Name'    AS field_name,਀ऀऀऀ一唀䰀䰀                      䄀匀 甀渀椀琀猀Ⰰ 
			NULL                      AS mandatory,਀ऀऀऀ氀攀渀最琀栀                    䄀匀 氀攀渀最琀栀Ⰰ 
			position                  AS position,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㄀                䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			attribute2                AS attribute2,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㌀                䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
	   FROM forms.form_file_created_by_nm_links਀ऀ  圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀㬀 
਀ऀ ⴀⴀ昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 
  	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀  䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                      AS field_name_id,਀ऀऀऀ✀䘀椀氀攀 䌀爀攀愀琀攀搀 䈀礀 唀猀攀爀 䤀䐀✀  䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                      AS units,਀ऀऀऀ一唀䰀䰀                      䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                    AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                  䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                AS attribute3਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀 
	  WHERE form_id = @formid;਀ 
਀     ⴀⴀ 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀 
 	 INSERT INTO @FormFields   (field_type, field_name_id, field_name, units, mandatory, length, position, attribute1, attribute2, attribute3)਀     匀䔀䰀䔀䌀吀 ✀䘀椀氀攀 刀攀琀攀渀琀椀漀渀 䐀愀琀攀✀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ 
			NULL                      AS field_name_id,਀ऀऀऀ✀䘀椀氀攀 刀攀琀攀渀琀椀漀渀 䐀愀琀攀✀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
			NULL                      AS units,਀ऀऀऀ一唀䰀䰀                      䄀匀 洀愀渀搀愀琀漀爀礀Ⰰ 
			length                    AS length,਀ऀऀऀ瀀漀猀椀琀椀漀渀                  䄀匀 瀀漀猀椀琀椀漀渀Ⰰ 
			attribute1                AS attribute1,਀ऀऀऀ愀琀琀爀椀戀甀琀攀㈀                䄀匀 愀琀琀爀椀戀甀琀攀㈀Ⰰ 
			attribute3                AS attribute3      ਀ऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀 
	  WHERE form_id = @formid;	  ਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
        SELECT @formid       AS 'Form ID',਀ऀऀ       昀椀攀氀搀开琀礀瀀攀    䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ 
		       field_name_id AS 'Field Name ID',਀ऀऀऀ   昀椀攀氀搀开渀愀洀攀    䄀匀 ✀䘀椀攀氀搀 一愀洀攀✀Ⰰ 
			   units         AS 'Units',਀ऀऀऀ   洀愀渀搀愀琀漀爀礀     䄀匀 ✀䴀愀渀搀愀琀漀爀礀✀Ⰰ 
			   length        AS 'Length',਀ऀऀऀ   瀀漀猀椀琀椀漀渀      䄀匀 ✀倀漀猀椀琀椀漀渀✀Ⰰ 
			   attribute1    AS 'Attribute 1',਀ऀऀऀ   愀琀琀爀椀戀甀琀攀㈀    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 ㈀✀Ⰰ 
			   attribute3    AS 'Attribute 3'਀          䘀刀伀䴀 䀀䘀漀爀洀䘀椀攀氀搀猀 
	  ORDER BY Position;਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
		 SET @formname = (SELECT ਀ऀऀऀऀ   昀椀渀⸀昀漀爀洀开渀愀洀攀     䄀匀 ✀䘀漀爀洀 一愀洀攀✀  
			  FROM forms.form_identifier_names AS fin਀ऀऀऀ  圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ 
	END CATCH਀ 䔀一䐀  ⴀⴀ 䔀渀搀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀  
  SET @numrows    = ISNULL(@numrows, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_form_groups]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Selects all forms groups਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 愀氀氀 昀漀爀洀 最爀漀瀀甀猀Ⰰ 
-- plus a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_form_groups] ਀ऀ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀ           昀漀爀洀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 䤀䐀✀Ⰰ  
	           ISNULL(mnem, '')  AS Mnemonic, ਀ऀऀऀ   愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ  
	           ISNULL(descr, '') AS Description, ਀ऀ           氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀  
	      FROM forms.form_group_names ਀ऀ  伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	            SET @zerorecordsmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
		         SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	       SET @transactionmessage = @tempmessage;਀ऀ    䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  END TRY਀  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		   CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ䔀䰀匀䔀  
		    SET @transactionmessage = 'A database level message error occurred on SelectError';਀  䔀一䐀 䌀䄀吀䌀䠀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀漀爀洀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀漀爀洀猀 椀搀攀渀琀椀昀椀攀爀猀 
-- Output is a list of all form names,਀ⴀⴀ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀漀爀洀开渀愀洀攀猀崀  
	਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT,਀  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  䈀䔀䜀䤀一 吀刀夀 
	   SELECT ਀ऀ           昀漀爀洀开椀搀           䄀匀 ✀䘀漀爀洀 䤀䐀✀Ⰰ  
			   form_group_id     AS 'Form Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀⠀ 
					SELECT fgn.attr_name਀ऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
					WHERE fgn.form_group_id = fin.form_group_id਀ऀऀऀऀ⤀Ⰰ ✀✀⤀           䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
			   form_name         AS 'Form Name', ਀ऀ           䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
	           ISNULL(descr, '') AS 'Description', ਀ऀ           氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀  
	      FROM forms.form_identifier_names AS fin਀ऀ  伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
	  SET @numrows = @@ROWCOUNT;਀  ऀ    䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	      BEGIN਀ऀ        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                 @message_id   = 'ZeroRecords', ਀                 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀ            匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	         ELSE ਀ऀऀ         匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
		  END਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'Success', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	    IF @tempmessage IS NOT NULL ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	    SET @transaction_status = 'Good';਀  䔀一䐀 吀刀夀 
  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
  END CATCH਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀甀渀挀琀椀漀渀开氀椀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all records from people.function_lists.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀 搀攀琀愀椀氀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 爀攀挀漀爀搀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ一漀渀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of function list records.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - None਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀甀渀挀琀椀漀渀开氀椀猀琀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀         䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 ISNULL(fln.mnem, '')        AS 'Function List Mnemonic',਀ऀऀऀऀ 昀氀渀⸀渀愀洀攀                    䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 ISNULL(fln.description, '') AS 'Function List Description',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ 　⤀ 䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				 df.function_id              AS 'Duty Function ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀洀渀攀洀Ⰰ ✀✀⤀         䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 df.name                     AS 'Duty Function Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
            FROM people.function_lists AS fl਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
	          ON    fl.function_list_id  ਀ऀऀऀ     㴀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
	   LEFT JOIN people.duty_functions AS df਀ऀ          伀一    昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
			      = df.function_id਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀ 䄀匀䌀Ⰰ ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 䄀匀䌀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀甀渀挀琀椀漀渀开氀猀琀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all duty function lists from people.function_list_names.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ一漀渀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of duty function list details.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - None਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开昀甀渀挀琀椀漀渀开氀猀琀开渀愀洀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀        䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ  
				 ISNULL(fln.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ 昀氀渀⸀渀愀洀攀                    䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 ISNULL(fln.description, '') AS 'Description',਀ऀऀऀऀ 昀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		    FROM people.function_list_names AS fln  ਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开爀攀挀攀渀琀开搀漀挀甀洀攀渀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects all document IDs which the connected user has permission to view and which have been created after a given time਀ⴀⴀ 爀攀氀愀琀椀瘀攀 琀漀 瀀爀攀猀攀渀琀⸀ 
-- Input is an optional form ID.  ਀ⴀⴀ 䐀漀攀猀 渀漀琀 愀瀀瀀氀礀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀  䐀漀攀猀 渀漀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开爀攀挀攀渀琀开搀漀挀甀洀攀渀琀猀崀  
਀      䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 伀瀀琀椀漀渀愀氀 椀渀瀀甀琀 瀀愀爀愀洀攀琀攀爀 
	  @minutes int                     = NULL,   -- Optional input parameter.  Number of minutes before present਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numdocs bigint                  = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀䘀愀椀氀✀Ⰰ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀऀ 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
 ਀ऀऀ ⴀⴀ 䌀栀攀挀欀 洀椀渀甀琀攀猀⸀  刀攀琀爀椀攀瘀攀 瘀愀氀甀攀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 椀昀 一唀䰀䰀⸀   
		 IF @minutes = 0਀ऀऀ    匀䔀吀 䀀洀椀渀甀琀攀猀 㴀 一唀䰀䰀㬀 
		 IF @minutes IS NULL਀ऀऀ    䈀䔀䜀䤀一 
			  SET @minutes = (਀ऀऀऀ     匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀开氀愀猀琀开洀椀渀甀琀攀猀  
			       FROM base.global_settings_groups਀ऀऀऀ      圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ 
	END -- End IF @userauthentication_status = 'Pass' 		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀  
	BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 䤀䐀 
		  FROM base.document_id_list AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE (searchtable.created > DATEADD(MINUTE, -@minutes, SYSDATETIME()))),਀ 
਀ऀऀ搀漀挀䐀愀琀愀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀猀䌀吀䔀⸀䤀䐀 䄀匀 搀漀挀椀搀Ⰰ  
				doc_data.field_type, ਀ऀऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
				doc_data.field_name, ਀ऀऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
				doc_data.attr_id, ਀ऀऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ  
				doc_data.units, ਀ऀऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀 
			FROM docidsCTE਀ऀऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀崀⠀搀漀挀椀搀猀䌀吀䔀⸀䤀䐀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
		),਀ 
		AttDataCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
                DENSE_RANK() OVER (ORDER BY docDataCTE.docid) AS doc_count,					਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀搀漀挀椀搀Ⰰ  
				docDataCTE.field_type, ਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
				docDataCTE.field_name, ਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
				docDataCTE.attr_id, ਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ  
				docDataCTE.units, ਀ऀऀऀऀ搀漀挀䐀愀琀愀䌀吀䔀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀 
			FROM docDataCTE਀ऀऀ⤀ 
਀ⴀⴀⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ 
     INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀      ⠀匀䔀䰀䔀䌀吀  
		      doc_data.doc_count      AS doc_count,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀搀漀挀椀搀          䄀匀 搀漀挀椀搀Ⰰ  
			  doc_data.field_type     AS field_type, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
			  doc_data.field_name     AS field_name, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			  doc_data.attr_id        AS attr_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			  doc_data.units          AS units,਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		 FROM AttDataCTE AS doc_data);਀ 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ⴀⴀⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numdocs  = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_recent_files]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for a given form for all files created in the last @minutes minutes਀ⴀⴀ 戀甀琀 渀漀琀 琀栀攀 昀椀氀攀 挀漀渀琀攀渀琀⸀  䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 
-- see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_recent_files] ਀ 
      @formid bigint                   = NULL, -- Optional input parameter਀ऀ  䀀洀椀渀甀琀攀猀 椀渀琀                     㴀 一唀䰀䰀Ⰰ ⴀⴀ 伀瀀琀椀漀渀愀氀 椀渀瀀甀琀 瀀愀爀愀洀攀琀攀爀 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@transactionmessage nvarchar(300)  = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username ਀ऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	@temp_userauth_status nchar(10)         = 'Fail',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
-- End user authentication. ਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
 -- Data validation	਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
਀ऀऀ ⴀⴀ 䌀栀攀挀欀 洀椀渀甀琀攀猀⸀  刀攀琀爀椀攀瘀攀 瘀愀氀甀攀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 椀昀 一唀䰀䰀⸀   
		 IF @minutes =0਀ऀऀ    匀䔀吀 䀀洀椀渀甀琀攀猀 㴀 一唀䰀䰀㬀 
		 IF @minutes IS NULL਀ऀऀ    䈀䔀䜀䤀一 
			  SET @minutes = (਀ऀऀऀ     匀䔀䰀䔀䌀吀 挀爀攀愀琀攀搀开氀愀猀琀开洀椀渀甀琀攀猀  
			       FROM base.global_settings_groups਀ऀऀऀ      圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			END਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
-- ====================================================਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
		BEGIN TRY਀ऀऀ  圀䤀吀䠀 昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
			  SELECT DISTINCT਀ऀऀऀऀऀ 昀洀⸀昀椀氀攀开椀搀              䄀匀 䤀䐀 
				FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id ਀        圀䠀䔀刀䔀 昀洀⸀挀爀攀愀琀攀搀 㸀 䐀䄀吀䔀䄀䐀䐀⠀䴀䤀一唀吀䔀Ⰰ ⴀ䀀洀椀渀甀琀攀猀Ⰰ 匀夀匀䐀䄀吀䔀吀䤀䴀䔀⠀⤀⤀ 
			 ),਀ 
			 distinctfileidsCTE AS(਀ऀऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀Ⰰ 
			 ROW_NUMBER() OVER (ORDER BY fileidsCTE.ID) AS row_number -- Including this in fileidsCTE causes duplicate records to be created਀ऀऀऀ 䘀刀伀䴀 昀椀氀攀椀搀猀䌀吀䔀⤀ 
਀ 
	-- Extract the data according to the file id਀ऀ   䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
			(SELECT  ਀ऀऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀Ⰰ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
																					  -- each row in this table is a field. ਀ऀऀऀऀऀ搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀    䄀匀 昀椀氀攀开椀搀Ⰰ  
					file_data.field_type     AS field_type, ਀ऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
					file_data.field_name     AS field_name, ਀ऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
					file_data.attr_id        AS attr_id, ਀ऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
					file_data.units          AS units,਀ऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
			   FROM distinctfileidsCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀 
		 RIGHT JOIN distinctfileidsCTE਀ऀऀऀऀ 伀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀  
					= fi.ID);਀ 
			 SELECT @numfiles = MAX(file_count) from @AttData;਀ 
		 SELECT ਀ऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
				ad.fileid                     AS 'File ID', ਀ऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
				ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
				ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
				ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
				ISNULL(ad.position, '')       AS 'Position'਀ऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
	   ORDER BY Position, Record, 'File ID';਀ 
	--=======================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied. ਀ऀऀ  匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
		  SET @formname = (SELECT form_name਀ऀऀ                     䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 
							WHERE form_id = @formid);਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开琀愀最开最爀漀甀瀀开椀搀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all tag group name details਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开琀愀最开最爀漀甀瀀开椀搀开渀愀洀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 琀最渀⸀琀愀最开最爀漀甀瀀开椀搀       䄀匀 ✀吀愀最 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(tgn.mnem, '')   AS 'Tag Group Mnemonic',਀ऀ            琀最渀⸀琀愀最开最爀漀甀瀀开渀愀洀攀     䄀匀 ✀吀愀最 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(tgn.descr, '')  AS 'Tag Group Description',਀ऀऀऀऀ琀最渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀      䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		   FROM tagging.tag_group_identifier_names AS tgn਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_tag_group_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 琀栀攀 搀愀琀愀 昀漀爀 愀氀氀 琀愀最 琀漀 琀愀最 最爀漀甀瀀 爀攀挀漀爀搀猀 
-- Output is a table of tags and linked tag groups.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_tag_group_links] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT dt.tag_id              AS 'Tag ID',਀ऀऀ        䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
				dt.tag_name            AS 'Tag Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		        tgn.tag_group_id       AS 'Tag Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀最渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䜀爀漀甀瀀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            tgn.tag_group_name     AS 'Tag Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀  䄀匀 ✀吀愀最 䜀爀漀甀瀀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM tagging.doc_tags AS dt਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 䄀匀 琀琀琀最氀 
	         ON      dt.tag_id਀ऀऀऀ    㴀 琀琀琀最氀⸀琀愀最开椀搀 
	 INNER JOIN tagging.tag_group_identifier_names AS tgn਀             伀一     琀最渀⸀琀愀最开最爀漀甀瀀开椀搀 
		        = tttgl.tag_group_id਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 䤀䐀✀ 䐀䔀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_all_tag_tree_names]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀愀最 琀爀攀攀 渀愀洀攀 搀攀琀愀椀氀猀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_tag_tree_names] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT ttn.tag_tree_id          AS 'Tag Tree ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            ttn.name                 AS 'Tag Tree Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ttn.list_position        AS 'List Position'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀 
	   ORDER BY 'List Position';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开琀愀最猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all tags਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 琀愀最 搀愀琀愀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开琀愀最猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀琀⸀琀愀最开椀搀              䄀匀 ✀吀愀最 䤀䐀✀Ⰰ 
		        ISNULL(dt.mnem, '')    AS 'Tag Mnemonic',਀ऀऀऀऀ搀琀⸀琀愀最开渀愀洀攀            䄀匀 ✀吀愀最 一愀洀攀✀Ⰰ 
				ISNULL(dt.descr, '')   AS 'Tag Description'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
	   ORDER BY 'Tag Name' ASC;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀猀⸀  
-- Output is a list of transaction group IDs and notes. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_transaction_groups]਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ          琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀               䄀匀 ✀吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
              ISNULL(transaction_group_note, '') AS 'Transaction Group Note'਀ऀ     䘀刀伀䴀 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀  
	 ORDER BY transaction_group_id DESC;਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	  SET @transaction_status = 'Good';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
	    END਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @transactionmessage = @tempmessage + ' | ' + ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
	END CATCH਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开愀氀氀开甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-10-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 甀渀椀琀猀 漀昀 洀攀愀猀甀爀攀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_all_units_of_measure]਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ          甀渀椀琀开椀搀                    䄀匀 ✀唀渀椀琀猀 䤀䐀✀Ⰰ 
	          unit                       AS 'Unit',਀              䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀          䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
	          ISNULL(list_position, '')  AS 'Position'਀ऀ     䘀刀伀䴀 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀 
     ORDER BY 'Position';਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	  SET @transaction_status = 'Good';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
	    END਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @transactionmessage = @tempmessage + ' | ' + ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
	END CATCH਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开戀爀漀眀猀椀渀最开琀爀攀攀开戀礀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all tags for a given tag browsing tree id. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 琀愀最 搀愀琀愀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开戀爀漀眀猀椀渀最开琀爀攀攀开戀礀开椀搀崀  
਀     䀀琀愀最开戀爀开琀爀攀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
	  	  IF @tag_br_treeid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 琀爀攀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_br_treeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 琀爀攀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTree.');਀ऀऀऀ 䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_browsing_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag tree id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT @tag_br_treeid         AS 'Tag Browsing Tree ID',਀ऀऀ        搀琀⸀琀愀最开椀搀              䄀匀 ✀吀愀最 䤀䐀✀Ⰰ 
		        ISNULL(dt.mnem, '')    AS 'Tag Mnemonic',਀ऀऀऀऀ搀琀⸀琀愀最开渀愀洀攀            䄀匀 ✀吀愀最 一愀洀攀✀Ⰰ 
				ISNULL(dt.descr, '')   AS 'Tag Description',਀ऀऀऀऀ琀琀渀⸀戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀   䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一漀搀攀 䤀䐀✀Ⰰ 
				ttn.invert_tag         AS 'Tag Invert',਀ऀऀऀऀ琀琀渀⸀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀吀漀匀琀爀椀渀最⠀⤀ 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀ 
		   FROM tagging.tag_browsing_tree_nodes AS ttn਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
	         ON  ttn.tag_id਀ऀऀऀ    㴀 搀琀⸀琀愀最开椀搀ऀऀ 
		  WHERE ttn.tag_browsing_tree_id਀ऀऀ        㴀  䀀琀愀最开戀爀开琀爀攀攀椀搀 
	   ORDER BY 'Tag Browsing Tree HierarchyId' ASC;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all tag browsing tree name details਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀Ⰰ 
				ISNULL(tbtn.mnem, '')     AS 'Tag Browsing Tree Mnemonic',਀ऀ            琀戀琀渀⸀渀愀洀攀                 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一愀洀攀✀Ⰰ 
				ISNULL(tbtn.descr, '')    AS 'Tag Browsing Tree Description',਀ऀऀऀऀ琀戀琀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				tbtn.sid_id               AS 'User ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀ 
				         (SELECT sl.sid਀ऀऀऀऀऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						  WHERE tbtn.sid_id਀ऀऀऀऀऀऀ        㴀 猀氀⸀猀椀搀开椀搀⤀⤀Ⰰ ✀✀⤀ 䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀ 
		   FROM tagging.tag_browsing_tree_names AS tbtn਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 䐀䔀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_brsng_trees_by_tag]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀　ⴀ　㈀ⴀ㈀　㈀㘀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀攀琀愀椀氀猀 漀昀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀猀 眀栀椀挀栀 挀漀渀琀愀椀渀 琀栀攀 最椀瘀攀渀 琀愀最 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_brsng_trees_by_tag] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
			 BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 END਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀  
		        @tag_id                  AS 'Tag ID',਀ऀऀ        琀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀Ⰰ 
				ISNULL(ttn.mnem, '')     AS 'Tag Browsing Tree Mnemonic',਀ऀ            琀琀渀⸀渀愀洀攀                 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一愀洀攀✀Ⰰ 
				ISNULL(ttn.descr, '')    AS 'Tag Browsing Tree Description',਀ऀऀऀऀ琀琀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				ttno.browsing_tree_node_id    AS 'Tag Browsing Tree Node ID',਀ऀऀऀऀ琀琀渀漀⸀戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀吀漀匀琀爀椀渀最⠀⤀ 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀ 
		   FROM tagging.doc_tags AS dt਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 䄀匀 琀琀渀漀 
	         ON     dt.tag_id਀ऀऀऀ    㴀 琀琀渀漀⸀琀愀最开椀搀 
	 INNER JOIN	tagging.tag_browsing_tree_names AS ttn਀ऀ         伀一  琀琀渀漀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
			    = ttn.tag_browsing_tree_id਀ऀ      圀䠀䔀刀䔀   琀琀渀漀⸀琀愀最开椀搀 
		        = @tag_id਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_brsng_trees_wth_ed_prm]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀愀洀攀 搀攀琀愀椀氀猀 昀漀爀 戀爀漀眀猀椀渀最 琀爀攀攀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 爀椀最栀琀猀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_brsng_trees_wth_ed_prm] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀            㴀 一唀䰀䰀Ⰰ 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀    
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀  ⴀⴀ 䄀 挀漀渀琀爀漀氀氀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 愀氀氀 戀爀漀眀猀椀渀最 琀爀攀攀猀 
	    BEGIN਀ऀऀऀ 匀䔀䰀䔀䌀吀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀Ⰰ 
					ISNULL(tbtn.mnem, '')     AS 'Tag Browsing Tree Mnemonic',਀ऀऀऀऀऀ琀戀琀渀⸀渀愀洀攀                 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一愀洀攀✀Ⰰ 
					ISNULL(tbtn.descr, '')    AS 'Tag Browsing Tree Description',਀ऀऀऀऀऀ琀戀琀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				    tbtn.sid_id               AS 'User ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀ 
				         (SELECT sl.sid਀ऀऀऀऀऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						  WHERE tbtn.sid_id਀ऀऀऀऀऀऀ        㴀 猀氀⸀猀椀搀开椀搀⤀⤀Ⰰ ✀✀⤀ 䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀ 
			   FROM tagging.tag_browsing_tree_names AS tbtn਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	    END਀ऀ  䔀䰀匀䔀 
	    BEGIN਀ऀऀ  匀䔀䰀䔀䌀吀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀Ⰰ 
				 ISNULL(tbtn.mnem, '')     AS 'Tag Browsing Tree Mnemonic',਀ऀऀऀऀ 琀戀琀渀⸀渀愀洀攀                 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一愀洀攀✀Ⰰ 
				 ISNULL(tbtn.descr, '')    AS 'Tag Browsing Tree Description',਀ऀऀऀऀ 琀戀琀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				 tbtn.sid_id               AS 'User ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀ 
				         (SELECT sl.sid਀ऀऀऀऀऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
						  WHERE tbtn.sid_id਀ऀऀऀऀऀऀ        㴀 猀氀⸀猀椀搀开椀搀⤀⤀Ⰰ ✀✀⤀ 䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀ 
		   FROM tagging.tag_browsing_tree_names AS tbtn਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀戀琀瀀昀 
						         ON    tbtn.tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ    㴀 琀戀琀瀀昀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
						 INNER JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ            伀一   琀戀琀瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   =   fln.function_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						            ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 INNER JOIN people.duty_functions AS df਀ऀऀऀऀऀऀ            伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   = df.function_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						            ON  dfsl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一 搀昀猀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
  							         ਀                     唀一䤀伀一  
਀ऀऀऀऀऀ    ⠀ 匀䔀䰀䔀䌀吀 琀戀琀渀㈀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀Ⰰ 
				                 ISNULL(tbtn2.mnem, '')     AS 'Tag Browsing Tree Mnemonic',਀ऀऀऀऀ                 琀戀琀渀㈀⸀渀愀洀攀                 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一愀洀攀✀Ⰰ 
				                 ISNULL(tbtn2.descr, '')    AS 'Tag Browsing Tree Description',਀ऀऀऀऀ                 琀戀琀渀㈀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				                 tbtn2.sid_id               AS 'User ID',਀ऀऀऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀ 
											(SELECT sl.sid਀ऀऀऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
											WHERE tbtn2.sid_id਀ऀऀऀऀऀऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀⤀⤀Ⰰ ✀✀⤀ 䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀ 
					           FROM tagging.tag_browsing_tree_names AS tbtn2਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀戀琀瀀瀀 
						         ON   tbtn2.tag_browsing_tree_id਀ऀऀऀऀऀऀऀऀ    㴀 琀戀琀瀀瀀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
						 INNER JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ            伀一   琀戀琀瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   =  pln.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						            ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一   瀀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
  							         )਀                    唀一䤀伀一 ⴀⴀ 䤀渀氀甀搀攀 椀昀 琀栀攀爀攀 椀猀 愀 琀爀攀攀 氀椀渀欀攀搀 琀漀 琀栀攀 椀渀搀椀瘀椀搀甀愀氀⸀ 
਀ऀऀऀऀऀ    ⠀ 匀䔀䰀䔀䌀吀 琀戀琀渀㌀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀Ⰰ 
				                 ISNULL(tbtn3.mnem, '')     AS 'Tag Browsing Tree Mnemonic',਀ऀऀऀऀ                 琀戀琀渀㌀⸀渀愀洀攀                 䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 一愀洀攀✀Ⰰ 
				                 ISNULL(tbtn3.descr, '')    AS 'Tag Browsing Tree Description',਀ऀऀऀऀ                 琀戀琀渀㌀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				                 tbtn3.sid_id               AS 'User ID',਀ऀऀऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀匀唀匀䔀刀开匀一䄀䴀䔀⠀ 
										 (SELECT sl.sid਀ऀऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
										  WHERE tbtn3.sid_id਀ऀऀऀऀऀऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀⤀⤀Ⰰ ✀✀⤀ 䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀ 
					           FROM tagging.tag_browsing_tree_names AS tbtn3਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON  tbtn3.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀   猀氀⸀猀椀搀开椀搀 
							  WHERE sl.sid = @connectedusersid਀  ऀऀऀऀऀऀऀ         ⤀ 
                   ORDER BY 'List Position'਀ 
		END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_com_obj_attributes]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Reads the list of common object attributes.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_com_obj_attributes]਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = ''; -- Communicates that zero records where retrieved਀   
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ          挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
			  ISNULL(coa.mnem, '')               AS 'Mnemonic',਀ऀऀऀ  挀漀愀⸀愀琀琀爀开渀愀洀攀                      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
			  ISNULL(coa.descr, '')              AS 'Description'਀ऀ     䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀   䄀匀 挀漀愀 
	 ORDER BY attr_name;਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @transactionmessage = @tempmessage + ' | ' + ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
	END CATCH਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀洀开漀戀樀开戀礀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 13-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ 
-- Lists all common objects for a given list ID.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 䤀䐀⸀ 
-- Output is a list of the common objects, a status message, a transaction.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_com_obj_by_list] ਀ 
	 @commonobjlistid bigint          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)       = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @nolistidmessage nvarchar(200)          = '', -- Communicates that no common object list id was supplied਀ऀऀ䀀氀椀猀琀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@zerorecordsmessage nvarchar(200)       = '', -- Communicates that zero records where retrieved਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';  -- Status is pass unless it is set to 'Fail'.਀ 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	  -- Data validation਀ऀ  䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
	     SET @commonobjlistid = NULL;਀ऀ  䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			   BEGIN਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id   = 'NoAttrListID', ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀渀漀氀椀猀琀椀搀洀攀猀猀愀最攀 㴀  䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀渀漀氀椀猀琀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀✀㬀 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䰀椀猀琀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 琀栀愀琀 椀琀 椀猀 瘀愀氀椀搀⸀  
	      BEGIN਀ऀऀऀ  䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
							   FROM com_obj.common_object_list_names AS coln਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
									= @commonobjlistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䄀琀琀爀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @listidinvalidmessage = CONVERT(nvarchar(10), @commonobjlistid) + ' | ' +  @tempmessage;਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @listidinvalidmessage = 'A database level message error occurred on AttrListIDNotExist';਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀一䐀 
		  END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @transactionmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
	  -- End data validation਀  
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀ    匀䔀䰀䔀䌀吀  
			     @commonobjlistid               AS 'Common Object List ID',਀ऀऀऀऀ 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀            䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䤀䐀✀Ⰰ 
				 ISNULL(co.mnem, '')            AS 'Mnemonic',਀ऀऀऀऀ 挀漀⸀漀戀樀攀挀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 一愀洀攀✀Ⰰ 
				 ISNULL(co.description, '')     AS 'Description',਀ऀऀऀऀ 挀漀氀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀              䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀ 
			FROM com_obj.common_objects  AS co਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 挀漀愀 
				  ON   coa.common_object_attribute_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			LEFT JOIN com_obj.common_object_lists AS col਀ऀऀऀऀ   伀一   挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					   = co.common_object_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
				   ON   coln.common_object_list_id ਀ऀऀऀऀऀ   㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			WHERE col.common_object_list_id ਀ऀऀऀऀ  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 
			ORDER BY 'List Position', 'Common Object Name';਀  ऀऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'Success', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
			SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@nolistidmessage <> '')            SET @message = @message + ' | ' + @nolistidmessage;਀    䤀䘀 ⠀䀀氀椀猀琀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀氀椀猀琀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀洀开漀戀樀开氀椀猀琀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 渀愀洀攀 爀攀挀漀爀搀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开挀漀洀开漀戀樀开氀椀猀琀开渀愀洀攀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	         coln.list_name                 AS 'Common Object List Name',਀ऀ         䤀匀一唀䰀䰀⠀挀漀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(coln.description, '')   AS 'Description',਀             挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
			 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀ 
	    FROM com_obj.common_object_list_names  AS coln਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 挀漀愀 
		      ON     coa.common_object_attribute_id਀ऀऀऀ      㴀 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
    ORDER BY 'Common Object List Name';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	     CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ  䔀䰀匀䔀 
		   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀愀琀攀开猀琀礀氀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 22-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 搀愀琀攀 猀琀礀氀攀猀 
-- Output is a list of all date styles,਀ⴀⴀ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀愀琀攀开猀琀礀氀攀猀崀  
	਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
	          datetime_style      AS 'Date Style', ਀ऀ          搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀 䄀匀 ✀䐀愀琀攀 匀琀礀氀攀 䘀漀爀洀愀琀✀Ⰰ  
	          list_position       AS 'List Position' ਀ऀ     䘀刀伀䴀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀  
	 ORDER BY list_position;਀  ऀ    䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	      BEGIN਀ऀ        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                 @message_id   = 'ZeroRecords', ਀                 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀ            匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	         ELSE ਀ऀऀ         匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
		  END਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'Success', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	    IF @tempmessage IS NOT NULL ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	    ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	    SET @transaction_status = 'Good';਀  䔀一䐀 吀刀夀 
  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
  END CATCH਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_dc_by_fnct_list_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_dc_by_fnct_list_name] ਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ     
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_function_list_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀      ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
          AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ ऀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_dc_by_ppl_list_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 瀀攀漀瀀氀攀 氀椀猀琀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_dc_by_ppl_list_name] ਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ     
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_people_list_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀      ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
          AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ  
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_dc_cm_obj_ms_lnk_by_dc]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all document commonobject multi-select list by document਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀⸀  伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 氀椀渀欀攀搀 琀漀 琀栀愀琀 搀漀挀甀洀攀渀琀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀挀开挀洀开漀戀樀开洀猀开氀渀欀开戀礀开搀挀崀 
਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records where retrieved਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)   = '', -- Communicates that the doc id was invalid਀ऀऀ䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@docauthenticationstatus nchar(10) = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                         ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @documentid = ''਀     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a doc id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoDocID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 				@doc_id_to_check =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @docinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
		BEGIN TRY਀ऀऀ  匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀                    䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
				 coln.list_name                 AS 'Common Object List Name',਀ऀऀऀऀ 挀漀⸀漀戀樀攀挀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 一愀洀攀✀Ⰰ 
				 ISNULL(co.mnem, '')            AS 'Common Object Mnemonic',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 co.common_object_id            AS 'Common Object ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀऀ 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 col.list_position              AS 'List Position'਀ऀऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
			LEFT JOIN com_obj.common_object_attributes AS coa਀ऀऀऀऀ  伀一   挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
					  = co.common_object_attribute_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
				  ON   col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
			LEFT JOIN com_obj.common_object_list_names AS coln਀ऀऀऀऀ  伀一    挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  =  col.common_object_list_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开洀猀开氀椀猀琀开氀椀渀欀猀 䄀匀 挀漀洀猀氀氀 
				  ON       col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  AND  col.common_object_list_id਀ऀऀऀऀऀ  㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
				WHERE comsll.doc_id = @documentid਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
  		  IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @zerorecordsmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
				   SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @transactionmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
					SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀऀ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		  ELSE਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
		END CATCH਀ऀ䔀一䐀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_dc_cm_obj_rb_lnk_by_dc]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all document commonobject radio button list by document਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀⸀  伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 氀椀渀欀攀搀 琀漀 琀栀愀琀 搀漀挀甀洀攀渀琀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀挀开挀洀开漀戀樀开爀戀开氀渀欀开戀礀开搀挀崀 
਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀      㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)       = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records where retrieved਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)   = '', -- Communicates that the doc id was invalid਀ऀऀ䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@docauthenticationstatus nchar(10) = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                         ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
 ਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @documentid = ''਀     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a doc id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoDocID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 				@doc_id_to_check =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @docinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
		BEGIN TRY਀ऀऀ  匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀                    䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
				 coln.list_name                 AS 'Common Object List Name',਀ऀऀऀऀ 挀漀⸀漀戀樀攀挀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 一愀洀攀✀Ⰰ 
				 ISNULL(co.mnem, '')            AS 'Common Object Mnemonic',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 co.common_object_id            AS 'Common Object ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀愀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀      䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 coa.common_object_attribute_id AS 'Common Object Attribute ID',਀ऀऀऀऀ 挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀     䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 col.list_position              AS 'List Position'਀ऀऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
			LEFT JOIN com_obj.common_object_attributes AS coa਀ऀऀऀऀ  伀一   挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
					  = co.common_object_attribute_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
				  ON   col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
			LEFT JOIN com_obj.common_object_list_names AS coln਀ऀऀऀऀ  伀一    挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  =  col.common_object_list_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 挀漀爀戀氀氀 
				  ON       col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀爀戀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  AND  col.common_object_list_id਀ऀऀऀऀऀ  㴀 挀漀爀戀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
				WHERE corbll.doc_id = @documentid਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
  		  IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @zerorecordsmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
				   SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @transactionmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
					SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀऀ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		  ELSE਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
		END CATCH਀ऀ䔀一䐀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀ऀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_default_date_format]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Selects the default date format details਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 搀愀琀攀 猀琀礀氀攀Ⰰ 渀愀洀攀 愀渀搀 昀漀爀洀愀琀Ⰰ 攀⸀最⸀ ㄀　㔀 搀搀ⴀ洀洀ⴀ礀礀礀Ⰰ 搀洀礀Ⰰ 
-- plus a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_default_date_format] ਀ऀ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  BEGIN TRY਀ऀ   匀䔀䰀䔀䌀吀  
	          datetime_style      AS 'Date Style', ਀ऀ          搀愀琀攀琀椀洀攀开猀琀礀氀攀开渀愀洀攀 䄀匀 ✀䐀愀琀攀 匀琀礀氀攀 一愀洀攀✀ 
	     FROM base.datetime_styles AS ds਀ऀऀ 䨀伀䤀一 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		   ON ds.datetime_style਀ऀऀ      㴀 最猀最⸀搀愀琀攀开猀琀礀氀攀 
        WHERE gsg.setting_group_name = 'Master'਀ऀ 伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	            SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ         䔀䰀匀䔀  
		         SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
  END TRY਀  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  䔀一䐀 䌀䄀吀䌀䠀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_date_values_by_doc]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Lists date values for a document਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- Output is the list of dates, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_date_values_by_doc] ਀ 
	 @documentid nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)   = '', -- Communicates that the doc id was invalid਀ऀऀ䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records were retrieved਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                         -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀               㴀 ✀搀洀礀✀Ⰰ 
		@datestyle int                     = 105,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @documentid = ''਀     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a doc id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoDocID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 				@doc_id_to_check =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @docinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀  ⴀⴀ 匀攀琀 琀栀攀 搀愀琀攀 猀琀礀氀攀 
਀  匀䔀吀 䀀搀愀琀攀猀琀礀氀攀 㴀 ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䄀匀 ✀䐀愀琀攀 匀琀礀氀攀✀ 
                      FROM base.global_settings_groups AS gsg਀ऀऀ             圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀  䀀搀漀挀甀洀攀渀琀椀搀                                   䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
					 ddfn.doc_date_name_id                         AS 'Document Date Field Name ID',਀ऀऀऀऀऀ 搀搀昀渀⸀洀渀攀洀                                     䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					 ddfn.descr                                    AS 'Description',਀ऀऀऀ         搀搀昀渀⸀愀琀琀爀开渀愀洀攀                                䄀匀 ✀䐀漀挀甀洀攀渀琀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
                     CONVERT(NVARCHAR(25), ddv.date_value, @datestyle) AS 'Date'਀ऀऀऀ   䘀刀伀䴀  搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀搀昀渀 
         INNER JOIN  doc_attr.doc_date_values AS ddv਀ऀऀऀ     伀一     搀搀瘀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
				     = ddfn.doc_date_name_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一  戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
				 ON    dil.doc_id ਀ऀऀऀऀ     㴀 搀搀瘀⸀搀漀挀开椀搀 
			  WHERE  dil.doc_id = @documentid਀ऀ       伀刀䐀䔀刀 䈀夀 ✀䐀漀挀甀洀攀渀琀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀✀㬀 
  		IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @zerorecordsmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开昀椀氀攀开昀漀爀洀开瘀愀氀甀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-07-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 愀氀氀 昀漀爀洀 昀椀攀氀搀猀 愀渀搀 瘀愀氀甀攀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 愀渀搀 昀椀氀攀 瀀愀椀爀⸀ 
-- Either the document id or file id may be null, but not both.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 昀甀渀挀琀椀漀渀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开昀椀氀攀开昀漀爀洀开瘀愀氀甀攀猀崀  
਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	  @documentid nvarchar(50)         = NULL,਀ऀ  䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀               㴀 ✀搀洀礀✀Ⰰ  
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀ    洀愀渀搀愀琀漀爀礀 渀挀栀愀爀⠀㌀⤀Ⰰ 
	    field_length smallint,਀        昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	    attribute1 nvarchar(50),਀ऀ    愀琀琀爀椀戀甀琀攀㈀ 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	    attribute3 nvarchar(50)਀  ⤀ 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 愀渀搀 昀椀氀攀 䤀䐀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  ਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 䄀一䐀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoIDs', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIDs.');਀ऀऀ 䔀一䐀 
	-- Either a document ID or file ID has been supplied਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	  BEGIN਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
			END਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
਀   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 攀砀椀猀琀猀⸀   
	  IF @fileid = 0਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	  IF @fileid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一 ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
				EXEC [internal].[usp_AUTHENTICATE_user_file_id] ਀ ऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
					@user_authentication_result = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
						BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
							SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
								@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  							IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
							ELSE ਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						END਀ऀऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 昀椀氀攀 椀搀 攀砀椀猀琀猀 
਀    䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀ऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
-- ================================================================================਀   
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䈀䔀䜀䤀一 
	BEGIN TRY਀ 
-- ===============================================================================਀ 
਀       ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ  
	             mandatory, field_length, form_position, attribute1, attribute2, attribute3)਀ऀऀ⠀匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.record_field_name_id AS record_field_name_id,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.mandatory      AS mandatory,਀ऀऀऀ搀漀挀开搀愀琀愀⸀氀攀渀最琀栀         䄀匀 昀椀攀氀搀开氀攀渀最琀栀Ⰰ 
			doc_data.form_position  AS form_position,਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀椀戀甀琀攀㄀     䄀匀 愀琀琀爀椀戀甀琀攀㄀Ⰰ 
			doc_data.attribute2     AS attribute2,਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀椀戀甀琀攀㌀     䄀匀 愀琀琀爀椀戀甀琀攀㌀ 
			਀ऀऀ䘀刀伀䴀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀愀琀愀开昀漀爀开攀搀椀琀开昀漀爀洀开䤀吀嘀䘀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
			 SELECT @formid                       AS 'Form ID',਀ऀऀऀ        䀀搀漀挀甀洀攀渀琀椀搀                   䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
					@fileid                       AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Form Field Name ID', -- The ID of the form field name.  Will be NULL if the Form Field Name a fixed value. ਀ऀऀऀऀऀ愀搀⸀爀攀挀漀爀搀开昀椀攀氀搀开渀愀洀攀开椀搀ऀऀ  䄀匀 ✀刀攀挀漀爀搀 一愀洀攀 䤀䐀✀Ⰰ ⴀⴀ 吀栀攀 爀攀挀漀爀搀 昀爀漀洀 琀栀攀 氀椀渀欀猀 琀愀戀氀攀 氀椀渀欀椀渀最 琀漀 琀栀攀 搀漀挀 漀爀 昀椀氀攀⸀ 圀椀氀氀 戀攀 一唀䰀䰀 椀昀 渀漀 爀攀挀漀爀搀 昀漀爀 琀栀愀琀 搀漀挀 漀爀 昀椀氀攀⸀  
					ISNULL(ad.field_name, '')     AS 'Form Field Name',  -- The name associed with the field_name_id਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䘀漀爀洀 䘀椀攀氀搀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Record Attribute ID',  -- The ID of the attribute, where applicable, linked to the doc or file਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀洀愀渀搀愀琀漀爀礀Ⰰ ✀✀⤀      䄀匀 ✀䴀愀渀搀愀琀漀爀礀✀Ⰰ 
					ISNULL(ad.form_position, '')  AS 'Position',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开氀攀渀最琀栀Ⰰ ✀✀⤀   䄀匀 ✀䘀椀攀氀搀 䰀攀渀最琀栀✀Ⰰ 
					ISNULL(ad.attribute1, '')     AS 'Attribute 1',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀椀戀甀琀攀㈀Ⰰ ✀✀⤀     䄀匀 ✀䄀琀琀爀椀戀甀琀攀 ㈀✀Ⰰ 
					ISNULL(ad.attribute3, '')     AS 'Attribute 3'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY 'Field Type';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 䤀䐀 甀猀攀搀 
		  SET @outputformid = @formid;਀ऀऀ  匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀 
		                     FROM forms.form_identifier_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀㬀 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END  -- End IF @transaction_ready = 'Ready'਀ 
    SET @numrows   = ISNULL(@numrows, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_group_names_rstr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀Ⰰ 椀渀挀氀甀搀椀渀最 琀栀漀猀攀 琀栀愀琀 愀爀攀 甀渀爀攀猀琀爀椀挀琀攀搀  
-- Output is a table of document groups, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_group_names_rstr] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT dgn.doc_group_id       AS 'Doc Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	            dgn.attr_name          AS 'Doc Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀  䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				CASE਀ऀऀऀऀ   圀䠀䔀一 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀 吀䠀䔀一 䌀䄀匀吀⠀✀唀渀爀攀猀琀爀椀挀琀攀搀✀ 䄀匀 嘀䄀刀䌀䠀䄀刀⠀㈀　⤀⤀ 
				   ELSE CAST('Restricted' AS VARCHAR(20))਀ऀऀऀऀ䔀一䐀 䄀匀 ✀刀攀猀琀爀椀挀琀椀漀渀✀ 
		   FROM xref.doc_group_names AS dgn਀ऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
	       ON    dgn.doc_group_id਀ऀऀ      㴀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
    LEFT JOIN user_restr.sid_list AS sl਀ऀ       伀一   搀最瘀瀀⸀猀椀搀开椀搀 
		      =   sl.sid_id਀ऀ    圀䠀䔀刀䔀 ⠀搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
			  OR਀ऀऀऀ  ⠀搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
			    AND sl.sid = @connectedusersid਀ऀऀऀ         ⤀  
	   ORDER BY 'Doc Group ID';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_groups_by_doc_rstr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 
-- Only applies to documents for which the connected has has rights to਀ⴀⴀ 愀渀搀 漀渀氀礀 氀椀猀琀猀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀⸀ 
-- Output is a table of document groups, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_groups_by_doc_rstr] ਀ 
     @documentid nvarchar(50)         = '', ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)        = '', -- Communicates that the transaction failed due to data validation਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀       㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@nodocumentidmessage nvarchar(200)      = '', -- Communicates that no document id was supplied਀ऀऀ䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@docauthenticationstatus nchar(10)      = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
		-- Data validation਀ 
		  IF @documentid = ''਀ऀऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
਀ऀऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document id has not been supplied਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDocID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀渀漀搀漀挀甀洀攀渀琀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
			 END਀ 
਀ऀऀ   䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			 BEGIN -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 						@doc_id_to_check =  @documentid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @docidinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
								SET @docidinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			  ELSE ਀ऀऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
			END਀ऀऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT @documentid            AS 'Document ID',਀ऀऀ        搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀       䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(dgn.mnem, '')   AS 'Mnemonic',਀ऀ            搀最渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(dgn.descr, '')  AS 'Description'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
	LEFT JOIN  xref.doc_group_links AS dgl਀ऀ       伀一     搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		        = dgl.doc_group_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
	       ON    dgn.doc_group_id਀ऀऀ      㴀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
    LEFT JOIN user_restr.sid_list AS sl਀ऀ       伀一   搀最瘀瀀⸀猀椀搀开椀搀 
		      =   sl.sid_id਀ऀ    圀䠀䔀刀䔀 搀最氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		      AND਀ऀऀ      ⠀⠀搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
			  OR਀ऀऀऀ  ⠀搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
			    AND sl.sid = @connectedusersid਀ऀऀऀ         ⤀⤀  
					       -- Note that this will not list document groups that the connected user is not a member of. ਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀ             匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	          ELSE ਀ऀऀऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@nodocumentidmessage <> '')        SET @message = @message + ' | ' + @nodocumentidmessage;਀    䤀䘀 ⠀䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀搀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开椀搀开挀漀渀琀愀椀渀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 23-11-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs where the doc id contains a given string.਀ⴀⴀ 䤀渀挀氀甀搀攀猀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀  䄀瀀瀀氀椀攀猀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_id_contains] ਀     
      @likestring nvarchar(50)         = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                                  ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
਀ऀऀⴀⴀ 䔀猀挀愀瀀攀 琀栀攀 猀琀爀椀渀最 猀漀 甀猀攀爀猀 搀漀渀✀琀 最攀琀 眀椀氀搀挀愀爀搀 爀攀猀甀氀琀猀 
		 SET @likestring = REPLACE(@likestring, '\', '\\');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀─✀Ⰰ ✀尀─✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '_', '\_');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀嬀✀Ⰰ ✀尀嬀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, ']', '\]');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀帀✀Ⰰ ✀尀帀✀⤀㬀 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id    AS docid਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀⤀ ⴀⴀ 䘀椀氀琀攀爀 戀礀 䀀氀椀欀攀猀琀爀椀渀最 
 ਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_id_equals]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀 搀漀挀甀洀攀渀琀 䤀䐀 眀椀琀栀 愀渀 攀砀愀挀琀 洀愀琀挀栀⸀ 
-- Includes the associated files.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开椀搀开攀焀甀愀氀猀崀  
    ਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),   ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
 -- Document id validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Doc id was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀऀ䔀一䐀 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id    AS docid਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀  ⠀猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀⤀ ⴀⴀ 䘀椀渀搀 攀砀愀挀琀 洀愀琀挀栀 
 ਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_int_values_by_doc]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Lists integer values for a document਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- Output is the list of the integer value, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_int_values_by_doc] ਀ 
	 @documentid nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)   = '', -- Communicates that the doc id was invalid਀ऀऀ䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records were retrieved਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                         -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @documentid = ''਀     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a doc id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoDocID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 				@doc_id_to_check =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @docinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT @documentid          AS 'Document ID',਀ऀऀऀ        搀椀昀渀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀渀琀攀最攀爀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ 
					difn.mnem            AS 'Mnemonic',਀ऀऀऀ        搀椀昀渀⸀愀琀琀爀开渀愀洀攀       䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀渀琀攀最攀爀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
					difn.descr           AS 'Description',਀ऀऀऀऀऀ椀渀琀开瘀愀氀甀攀            䄀匀 ✀䤀渀琀攀最攀爀 嘀愀氀甀攀✀Ⰰ 
		            ISNULL(uom.unit, '') AS 'Units'਀ऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀椀昀渀 
		 INNER JOIN doc_attr.doc_integer_values AS div਀ऀऀऀऀ 伀一    搀椀瘀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀  
				    = difn.doc_int_name_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
				 ON    dil.doc_id ਀ऀऀऀऀ     㴀 搀椀瘀⸀搀漀挀开椀搀 
		 LEFT JOIN base.units_of_measure AS uom਀ऀऀ         伀一   搀椀昀渀⸀甀渀椀琀开椀搀  
				     = uom.unit_id਀ऀऀऀ  圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		   ORDER BY 'Document Integer Field Name';਀  ऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开洀猀开愀琀琀爀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 
-- Input is a document id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 琀栀攀 氀椀猀琀 漀昀 愀琀琀爀椀戀甀琀攀猀Ⰰ 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开洀猀开愀琀琀爀开戀礀开搀漀挀崀  
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀        䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nodocidmessage nvarchar(200)      = '', -- Communicates that no document id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@docauthenticationstatus nchar(10) = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                         ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Validation checks਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
     SET @documentid = NULL;਀   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀渀✀琀⸀ 
  IF @documentid IS NULL਀     䈀䔀䜀䤀一 
	   SET @data_validation_status = 'Fail';਀ऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
       EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
		    @message_text = @tempmessage OUTPUT;਀  ऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	      SET @nodocidmessage = @tempmessage;਀ऀ   䔀䰀匀䔀  
		   SET @nodocidmessage = 'A database level message error occurred on NoDocID.';਀ऀ 䔀一䐀 
  ELSE -- A doc id has been supplied਀     䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
			EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
				@user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀ ⬀ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀ ⬀ ✀⸀⸀⸀ ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
					END਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀      䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @validationmessage = @tempmessage;਀ऀ  䔀䰀匀䔀  
		   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀ䔀一䐀 
਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT @documentid         AS 'Document ID',਀ऀऀऀ        搀洀猀氀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 䄀匀 ✀䄀琀琀爀椀戀甀琀攀 一愀洀攀 䤀䐀✀Ⰰ 
                    dmsln.attr_name     AS 'Attribute Name',਀ऀऀऀऀऀ搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 䄀匀 ✀䄀琀琀爀椀戀甀琀攀 嘀愀氀甀攀 䤀䐀✀Ⰰ 
					dmsa.attr_name      AS 'Attribute Value'਀ऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
		 INNER JOIN doc_attr.doc_multi_select_list_names AS dmsln਀ऀऀऀऀ 伀一    搀洀猀氀⸀搀漀挀开洀猀开氀椀猀琀开椀搀  
				    = dmsln.doc_ms_list_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 搀洀猀愀 
				 ON   dmsl.doc_ms_attr_id ਀ऀऀऀऀ    㴀 搀洀猀愀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
			  WHERE dmsl.doc_id = @documentid਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䄀琀琀爀椀戀甀琀攀 一愀洀攀✀㬀 
  		IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @zerorecordsmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_ms_attr_by_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists multi-select attributes by list name਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_ms_attr_by_list] ਀ 
  @docmslistid bigint              = NULL,਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@doc_ms_listname nvarchar(50)	    = '', -- The name value from the doc radio button list name id. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)   = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
  IF @docmslistid = 0 ਀     匀䔀吀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
  IF @docmslistid IS NULL਀     䈀䔀䜀䤀一 
         SET @data_validation_status = 'Fail';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
		      @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀ  䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 攀砀椀猀琀猀  
  IF @docmslistid IS NOT NULL਀     䈀䔀䜀䤀一   
         IF NOT EXISTS (SELECT doc_ms_list_id਀                          䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
                         WHERE doc_ms_list_id = @docmslistid) ਀             䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀ         䔀一䐀 
	 END ਀ 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀      䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ  䔀䰀匀䔀  
	     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀ䔀一䐀 
  -- End data validation਀   
  -- Execute the query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
     BEGIN਀       䈀䔀䜀䤀一 吀刀夀 
	        SELECT ਀ ऀ               搀洀猀愀⸀搀漀挀开洀猀开愀琀琀爀开椀搀      䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
	               ISNULL(dmsa.mnem, '')    AS Mnemonic, ਀ऀऀ     ऀ   搀洀猀愀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ  
	               ISNULL(dmsa.descr, '')   AS Description, ਀ऀ               搀洀猀愀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	          FROM doc_attr.doc_multi_select_attributes AS dmsa਀ऀऀ     圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀 
		  ORDER BY 'List Position', 'Doc Multi-Select Attribute Name';਀ 
  	         IF (@@ROWCOUNT = 0)਀ऀ           䈀䔀䜀䤀一 
	             EXEC internal.usp_SEL_message ਀                      䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                      @message_text = @tempmessage OUTPUT;਀  ऀ              䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
					 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀ       䔀一䐀 
	         EXEC internal.usp_SEL_message ਀                  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
                  @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ         匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
       END TRY਀       䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
             SET @transaction_status = 'Bad';਀             䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                  @message_id   = 'SelectError', ਀                  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	         IF @tempmessage IS NOT NULL ਀ऀऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		        CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀  ऀऀ     䔀䰀匀䔀  
		         SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀       䔀一䐀 䌀䄀吀䌀䠀 
	 END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_ms_attr_fg_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Lists document multi-select attribute to filter group links.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 愀琀琀爀椀戀甀琀攀ⴀ昀椀氀琀攀爀 最爀漀甀瀀 瀀愀椀爀猀Ⰰ 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开洀猀开愀琀琀爀开昀最开氀椀渀欀猀崀 
     ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀    
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀洀猀愀昀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀  䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
		        dmsa.attr_name         AS 'Doc Multi-Select Attribute Name',਀ऀऀ        搀洀猀愀昀氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
                fg.attr_name           AS 'Filter Group Name'਀ऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀氀 
		   JOIN doc_attr.doc_multi_select_attributes AS dmsa਀ऀऀ     伀一 搀洀猀愀昀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
			    = dmsa.doc_ms_attr_id਀ऀऀ   䨀伀䤀一 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
		     ON dmsafl.filter_group_id਀ऀऀऀ    㴀   昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀㬀ऀऀऀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开洀猀开氀椀猀琀开渀漀琀开氀椀渀欀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 
-- which are not already linked to the document਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- Output is the list of attributes, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_ms_list_not_linkd] ਀ 
	 @documentid nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)   = '', -- Communicates that the doc id was invalid਀ऀऀ䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records were retrieved਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                         -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @documentid = ''਀     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a doc id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoDocID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 				@doc_id_to_check =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @docinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀  䀀搀漀挀甀洀攀渀琀椀搀          䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
			         dmsln.doc_ms_list_id AS 'Doc Multi-Select List ID',਀ऀऀऀ         搀洀猀氀渀⸀愀琀琀爀开渀愀洀攀      䄀匀 ✀䐀漀挀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 一愀洀攀✀ 
			   FROM doc_attr.doc_multi_select_list_names AS dmsln਀ऀऀऀ  圀䠀䔀刀䔀 一伀吀 䔀堀䤀匀吀匀 
					(SELECT dmsl.doc_ms_list_id਀ऀऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
					  WHERE dmsl.doc_id = @documentid਀ऀऀऀऀऀऀऀ䄀一䐀    搀洀猀氀⸀搀漀挀开洀猀开氀椀猀琀开椀搀  
							    = dmsln.doc_ms_list_id);਀  ऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开戀礀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 25-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀猀 戀礀 氀椀猀琀 渀愀洀攀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开爀愀搀椀漀戀开愀琀琀爀开戀礀开氀椀猀琀崀  
਀  䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀऀ䀀搀漀挀开爀愀搀椀漀戀开氀椀猀琀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ऀ㴀 ✀✀Ⰰ ⴀⴀ 吀栀攀 渀愀洀攀 瘀愀氀甀攀 昀爀漀洀 琀栀攀 搀漀挀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀⸀  
		@rblistnameidinvalid nvarchar(200)  = '', -- Communicates that the document radio button name list id is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)   = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
  IF @doc_radioblistid = 0 ਀     匀䔀吀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
  IF @doc_radioblistid IS NULL਀     䈀䔀䜀䤀一 
         SET @data_validation_status = 'Fail';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
		      @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀ  䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 攀砀椀猀琀猀  
  IF @doc_radioblistid IS NOT NULL਀     䈀䔀䜀䤀一   
         IF NOT EXISTS (SELECT doc_radiob_list_id਀                          䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
                         WHERE doc_radiob_list_id = @doc_radioblistid) ਀             䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	              SET @message = CONCAT_WS(' | ', @message, CONVERT(nvarchar(15), @doc_radioblistid), @tempmessage); ਀ऀ           䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀ         䔀一䐀 
	 END ਀ 
਀ 
  -- Output the data validation status failed message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF (@tempmessage IS NOT NULL) ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	  ELSE ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
	END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  ਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀     䈀䔀䜀䤀一 
       BEGIN TRY਀ऀ        匀䔀䰀䔀䌀吀 䀀搀漀挀开爀愀搀椀漀戀氀椀猀琀椀搀        䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
	               drba.doc_radiob_attr_id  AS 'Doc Radio Button Attribute ID', ਀ऀ               䤀匀一唀䰀䰀⠀搀爀戀愀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
		     	   drba.attr_name           AS 'Doc Radio Button Attribute Name', ਀ऀ               䤀匀一唀䰀䰀⠀搀爀戀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	               drba.list_position       AS 'List Position'਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 搀爀戀愀 
  		     WHERE drba.doc_radiob_list_id = @doc_radioblistid਀          伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀㬀 
਀  ऀ         䤀䘀 ⠀䀀䀀刀伀圀䌀伀唀一吀 㴀 　⤀ 
	           BEGIN਀ऀ             䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                      @message_id   = 'ZeroRecords', ਀                      䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	              IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				  ELSE ਀ऀऀऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
		       END਀ऀ         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                  @message_id   = 'Success', ਀                  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	         SET @transaction_status = 'Good';਀       䔀一䐀 吀刀夀 
       BEGIN CATCH਀             匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
             EXEC internal.usp_SEL_message ਀                  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
                  @message_text = @tempmessage OUTPUT;਀ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		        SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ        䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
  		     ELSE ਀ऀऀ         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
       END CATCH਀ऀ 䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开爀戀开愀琀琀爀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 29-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 
-- Input is a document id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 琀栀攀 氀椀猀琀 漀昀 愀琀琀爀椀戀甀琀攀猀Ⰰ 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开爀戀开愀琀琀爀开戀礀开搀漀挀崀  
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀        䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nodocidmessage nvarchar(200)      = '', -- Communicates that no document id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@docauthenticationstatus nchar(10) = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                         ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Validation checks਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
     SET @documentid = NULL;਀   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀渀✀琀⸀ 
  IF @documentid IS NULL਀     䈀䔀䜀䤀一 
	   SET @data_validation_status = 'Fail';਀ऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
       EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
		    @message_text = @tempmessage OUTPUT;਀  ऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	      SET @nodocidmessage = @tempmessage;਀ऀ   䔀䰀匀䔀  
		   SET @nodocidmessage = 'A database level message error occurred on NoDocID.';਀ऀ 䔀一䐀 
  ELSE -- A doc id has been supplied਀     䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
			EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
				@user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀ ⬀ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀ ⬀ ✀⸀⸀⸀ ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
					END਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀      䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @validationmessage = @tempmessage;਀ऀ  䔀䰀匀䔀  
		   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀ䔀一䐀 
਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT @documentid             AS 'Document ID',਀ऀऀऀ        搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
                    drbln.attr_name         AS 'Doc Radio Button List Name',਀ऀऀऀऀऀ搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
					drba.attr_name          AS 'Doc Radio Button Attribute Name'਀ऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
		 INNER JOIN doc_attr.doc_radio_button_list_names AS drbln਀ऀऀऀऀ 伀一    搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
				    = drbln.doc_radiob_list_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 搀爀戀愀 
				 ON   drbl.doc_radiob_attr_id ਀ऀऀऀऀ    㴀 搀爀戀愀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
			  WHERE drbl.doc_id = @documentid;਀  ऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_rb_attr_fg_links]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description: Lists document radio button attribute to filter group links.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 愀琀琀爀椀戀甀琀攀ⴀ昀椀氀琀攀爀 最爀漀甀瀀 瀀愀椀爀猀Ⰰ 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开爀戀开愀琀琀爀开昀最开氀椀渀欀猀崀 
     ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
	DECLARE਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀 攀砀挀琀爀愀挀琀攀搀 昀爀漀洀    
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀爀戀愀昀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀  䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
		        drba.attr_name             AS 'Doc Radio Button Attribute Name',਀ऀऀ        搀爀戀愀昀氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
                fg.attr_name               AS 'Filter Group Name'਀ऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀爀戀愀昀氀 
		   JOIN doc_attr.doc_radio_button_attributes AS drba਀ऀऀ     伀一 搀爀戀愀昀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
			    = drba.doc_radiob_attr_id਀ऀऀ   䨀伀䤀一 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
		     ON drbafl.filter_group_id਀ऀऀऀ    㴀   昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀㬀ऀऀऀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ          䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		   CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开爀戀开氀椀猀琀开渀漀琀开氀椀渀欀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 29-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 
-- which are not already linked to the document਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- Output is the list of attributes, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_rb_list_not_linkd] ਀ 
	 @documentid nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)   = '', -- Communicates that the doc id was invalid਀ऀऀ䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records were retrieved਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                         -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @documentid = ''਀     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a doc id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoDocID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 				@doc_id_to_check =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @docinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀              䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
			        drbln.doc_radiob_list_id AS 'Doc Radio Button List ID',਀ऀऀऀ        搀爀戀氀渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䐀漀挀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 一愀洀攀✀ 
			   FROM doc_attr.doc_radio_button_list_names AS drbln਀ऀऀऀ  圀䠀䔀刀䔀 一伀吀 䔀堀䤀匀吀匀 
					(SELECT drbl.doc_radiob_list_id਀ऀऀऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
					  WHERE drbl.doc_id = @documentid਀ऀऀऀऀऀऀऀ䄀一䐀    搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
							    = drbln.doc_radiob_list_id);਀  ऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_doc_real_values_by_doc]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Lists real number values for a document਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀 
-- Output is the list of the integer value, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_doc_real_values_by_doc] ਀ 
	 @documentid nvarchar(50)         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @docinvalidmessage nvarchar(200)   = '', -- Communicates that the doc id was invalid਀ऀऀ䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀漀挀甀洀攀渀琀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records were retrieved਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                         -- or alternatively if the document does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @documentid = ''਀     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a doc id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoDocID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the document ID exists and the user has permission to access the document਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 				@doc_id_to_check =  @documentid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						SET @docinvalidmessage = 'Document ID: ' + LEFT(@documentid, 20) + '... ' + @tempmessage;਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @docinvalidmessage = 'A database level message error occurred on DocIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT @documentid            AS 'Document ID',਀ऀऀऀऀ    搀爀渀昀渀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 䄀匀 ✀䐀漀挀甀洀攀渀琀 刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ 
					drnfn.mnem             AS 'Mnemonic',਀ऀऀऀ        搀爀渀昀渀⸀愀琀琀爀开渀愀洀攀        䄀匀 ✀䐀漀挀甀洀攀渀琀 刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
					drnfn.descr            AS 'Description',਀ऀऀऀऀऀ爀攀愀氀开瘀愀氀甀攀             䄀匀 ✀刀攀愀氀 一甀洀戀攀爀 嘀愀氀甀攀✀Ⰰ 
		            ISNULL(uom.unit, '')   AS 'Units'਀ऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀爀渀昀渀 
		 INNER JOIN doc_attr.doc_real_number_values AS drnv਀ऀऀऀऀ 伀一    搀爀渀瘀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
				    = drnfn.doc_real_name_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
				 ON    dil.doc_id ਀ऀऀऀऀ    㴀 搀爀渀瘀⸀搀漀挀开椀搀 
		 LEFT JOIN base.units_of_measure AS uom਀ऀऀ         伀一  搀爀渀昀渀⸀甀渀椀琀开椀搀  
				    =  uom.unit_id਀ऀऀऀ  圀䠀䔀刀䔀 搀椀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		   ORDER BY 'Document Real Number Field Name';਀  ऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nodocidmessage <> '')             SET @message = @message + ' | ' + @nodocidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开琀攀砀琀开瘀愀氀甀攀猀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-09-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀攀砀琀 瘀愀氀甀攀猀 昀漀爀 愀 搀漀挀甀洀攀渀琀 
-- Input is a document id਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 琀栀攀 氀椀猀琀 漀昀 琀栀攀 昀爀攀攀 琀攀砀琀 瘀愀氀甀攀Ⰰ 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀开琀攀砀琀开瘀愀氀甀攀猀开戀礀开搀漀挀崀  
਀ऀ 䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀        䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nodocidmessage nvarchar(200)      = '', -- Communicates that no document id was supplied਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀攀爀攀 爀攀琀爀椀攀瘀攀搀 
		@docauthenticationstatus nchar(10) = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                         ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
-- Validation checks਀  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
     SET @documentid = NULL;਀   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀渀✀琀⸀ 
  IF @documentid IS NULL਀     䈀䔀䜀䤀一 
	   SET @data_validation_status = 'Fail';਀ऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
       EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
		    @message_text = @tempmessage OUTPUT;਀  ऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	      SET @nodocidmessage = @tempmessage;਀ऀ   䔀䰀匀䔀  
		   SET @nodocidmessage = 'A database level message error occurred on NoDocID.';਀ऀ 䔀一䐀 
  ELSE -- A doc id has been supplied਀     䈀䔀䜀䤀一   ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
			EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀऀऀऀ䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
				@user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䐀漀挀甀洀攀渀琀 䤀䐀㨀 ✀ ⬀ 䰀䔀䘀吀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ ㈀　⤀ ⬀ ✀⸀⸀⸀ ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀搀漀挀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
					END਀ऀ 䔀一䐀 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀      䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @validationmessage = @tempmessage;਀ऀ  䔀䰀匀䔀  
		   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀ䔀一䐀 
਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀                 䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
					dftfn.doc_free_text_name_id AS 'Document Free Text Field Name ID',਀ऀऀऀऀऀ搀昀琀昀渀⸀洀渀攀洀                  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			        dftfn.attr_name             AS 'Document Free Text Field Name',਀ऀऀऀऀऀ搀昀琀昀渀⸀搀攀猀挀爀                 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		            ISNULL(text_value, '')      AS 'Text'਀ऀऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀昀琀昀渀 
		 INNER JOIN doc_attr.doc_free_text_values AS dftv਀ऀऀऀऀ 伀一    搀昀琀瘀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
				    = dftfn.doc_free_text_name_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
				 ON    dil.doc_id ਀ऀऀऀऀ    㴀 搀昀琀瘀⸀搀漀挀开椀搀 
			  WHERE dil.doc_id = @documentid਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䐀漀挀甀洀攀渀琀 䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀 一愀洀攀✀㬀 
  		IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @zerorecordsmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@docinvalidmessage <> '')          SET @message = @message + ' | ' + @docinvalidmessage;਀    䤀䘀 ⠀䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀搀漀挀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_br_tree_node]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 戀爀漀眀猀椀渀最 琀愀最⸀ 
-- The search comprises a logical AND of all of the ancestors of the given tag, including the tag.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
-- If no tag tree ID is supplied then the default is retrieved from the global settings table.਀ⴀⴀ 䤀昀 䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 椀猀 愀渀礀 瘀愀氀甀攀 漀琀栀攀爀 琀栀愀渀 ✀伀一✀ 琀栀攀渀 琀栀攀 琀愀最 搀攀猀挀攀渀搀愀渀琀猀 眀椀氀氀 渀漀琀 戀攀 爀攀琀爀椀攀瘀攀搀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开戀爀开琀爀攀攀开渀漀搀攀崀  
਀      䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀Ⰰ     
	  @tag_treeid bigint               = NULL,   -- An optional tag tree to be applied to the tag to retrieve descendants of the tag.਀ऀ  䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 渀瘀愀爀挀栀愀爀⠀㌀⤀     㴀 ✀伀一✀Ⰰ   ⴀⴀ 䄀 猀眀椀琀挀栀 眀栀椀挀栀 搀攀琀攀爀洀椀渀攀猀 眀栀攀琀栀攀爀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 最椀瘀攀渀 琀愀最 愀爀攀 椀渀挀氀甀搀攀搀⸀ 
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ 
 -- Data validation	਀ 
  -- Check the tag browsing tree node ID਀ 䤀䘀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 㴀 　 
    SET @tag_br_tree_node_id = NULL;਀ 䤀䘀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 䤀匀 一唀䰀䰀 
 	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一漀搀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀  䔀䰀匀䔀 ⴀⴀ 䄀 渀漀搀攀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
    BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
		                 FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @tag_br_tree_node_id)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TreeNodeNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
	   END਀ 
    -- Validate the tag tree਀ ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag tree id has not been supplied.਀ऀऀऀ   ⴀⴀ 䜀攀琀 琀栀攀 搀攀昀愀甀氀琀 琀愀最 琀爀攀攀 䤀䐀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 
					SELECT @tag_treeid = default_tag_tree_id਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
					 WHERE setting_group_name = 'Master';਀ऀ          䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀        䈀䔀䜀䤀一 吀刀夀 
਀        ⴀⴀ 匀攀氀攀挀琀 琀栀攀 琀愀最 愀琀 琀栀攀 最椀瘀攀渀 戀爀漀眀猀椀渀最 琀爀攀攀 渀漀搀攀Ⰰ 瀀氀甀猀 愀氀氀 椀琀猀 愀渀挀攀猀琀漀爀猀⸀ 
        -- For each of those tags, if @tag_descendants = 'ON' then retrieve all of their਀        ⴀⴀ 搀攀猀挀攀渀搀愀渀琀猀 昀爀漀洀 琀栀攀 最椀瘀攀渀 琀愀最 琀爀攀攀⸀ 
        -- If the invert_tag flag is true, then exclude all document IDs which are linked to the ਀        ⴀⴀ 椀渀瘀攀爀琀攀搀 琀愀最Ⰰ 瀀氀甀猀 愀氀氀 椀琀猀 搀攀猀挀攀渀搀愀渀琀 琀愀最猀⸀  
        -- Select all the documents linked to ALL of the tags (logical AND). ਀ 
            WITH BrowsingTreeAncestors AS (਀                 ⴀⴀ 䜀攀琀 琀栀攀 猀瀀攀挀椀昀椀攀搀 渀漀搀攀 愀渀搀 愀氀氀 椀琀猀 愀渀挀攀猀琀漀爀猀Ⰰ 攀砀挀氀甀搀椀渀最 琀栀攀 爀漀漀琀 渀漀搀攀 
                 SELECT tbtna.tag_id, tbtna.invert_tag਀                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 琀戀琀渀愀 
                 JOIN tagging.tag_browsing_tree_nodes tbtn਀                      伀一 琀戀琀渀愀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
                     AND tbtn.browsing_tree_hierarchyid.IsDescendantOf(tbtna.browsing_tree_hierarchyid) = 1਀                圀䠀䔀刀䔀 琀戀琀渀⸀戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 
				  AND tbtna.browsing_tree_hierarchyid <> hierarchyid::GetRoot()਀             ⤀Ⰰ 
             TagTreeDescendants AS (਀                 ⴀⴀ 䜀攀琀 愀氀氀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 琀愀最猀 ⠀椀渀挀氀甀搀椀渀最 琀栀攀 琀愀最猀 琀栀攀洀猀攀氀瘀攀猀⤀ 椀昀 䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 椀猀 ✀伀一✀ 
                 -- IMPORTANT: Preserve the originating ancestor tag_id and invert_tag flag਀                 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 戀琀愀⸀琀愀最开椀搀 䄀匀 愀渀挀攀猀琀漀爀开琀愀最开椀搀Ⰰ 䤀匀一唀䰀䰀⠀戀琀愀⸀椀渀瘀攀爀琀开琀愀最Ⰰ 　⤀ 䄀匀 椀渀瘀攀爀琀开琀愀最Ⰰ 琀琀搀⸀琀愀最开椀搀 
                 FROM BrowsingTreeAncestors bta਀                 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 琀琀渀 伀一 戀琀愀⸀琀愀最开椀搀 㴀 琀琀渀⸀琀愀最开椀搀 䄀一䐀 琀琀渀⸀琀愀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀椀搀 
                 JOIN tagging.tag_tree_nodes ttd਀                     伀一 琀琀搀⸀琀愀最开琀爀攀攀开椀搀 㴀 琀琀渀⸀琀愀最开琀爀攀攀开椀搀 
                    AND (ttd.tag_id = ttn.tag_id਀                     伀刀 ⠀䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 㴀 ✀伀一✀ 䄀一䐀 琀琀搀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀⤀⤀ 
             ),਀             ⴀⴀ 䌀漀甀渀琀 漀昀 搀椀猀琀椀渀挀琀 渀漀渀ⴀ椀渀瘀攀爀琀攀搀 愀渀挀攀猀琀漀爀 琀愀最猀 ⠀琀栀攀 渀甀洀戀攀爀 漀昀 䄀一䐀 挀漀渀搀椀琀椀漀渀猀⤀ 
             NonInvertedAncestorCount AS (਀                 匀䔀䰀䔀䌀吀 䌀伀唀一吀⠀䐀䤀匀吀䤀一䌀吀 愀渀挀攀猀琀漀爀开琀愀最开椀搀⤀ 䄀匀 琀愀最开挀漀甀渀琀 
                 FROM TagTreeDescendants਀                 圀䠀䔀刀䔀 椀渀瘀攀爀琀开琀愀最 㴀 　 
             ),਀             䤀渀挀氀甀搀攀搀䐀漀挀猀 䄀匀 ⠀ 
                 -- Get documents linked to ALL non-inverted tag groups (logical AND)਀                 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀猀琀 愀瀀瀀攀愀爀 椀渀 攀瘀攀爀礀 渀漀渀ⴀ椀渀瘀攀爀琀攀搀 愀渀挀攀猀琀漀爀✀猀 琀愀最 最爀漀甀瀀 
                 SELECT tdl.doc_id਀                 䘀刀伀䴀 吀愀最吀爀攀攀䐀攀猀挀攀渀搀愀渀琀猀 琀琀搀 
                 JOIN tagging.tag_to_document_links tdl ON ttd.tag_id = tdl.tag_id਀                 圀䠀䔀刀䔀 琀琀搀⸀椀渀瘀攀爀琀开琀愀最 㴀 　 
                 GROUP BY tdl.doc_id਀                 䠀䄀嘀䤀一䜀 䌀伀唀一吀⠀䐀䤀匀吀䤀一䌀吀 琀琀搀⸀愀渀挀攀猀琀漀爀开琀愀最开椀搀⤀ 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开挀漀甀渀琀 䘀刀伀䴀 一漀渀䤀渀瘀攀爀琀攀搀䄀渀挀攀猀琀漀爀䌀漀甀渀琀⤀ 
             ),਀             䔀砀挀氀甀搀攀搀䐀漀挀猀 䄀匀 ⠀ 
                 -- Get all documents linked to ANY inverted tag (or its descendants)਀                 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 琀搀氀⸀搀漀挀开椀搀 
                 FROM TagTreeDescendants ttd਀                 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 琀搀氀 伀一 琀琀搀⸀琀愀最开椀搀 㴀 琀搀氀⸀琀愀最开椀搀 
                 WHERE ttd.invert_tag = 1਀             ⤀Ⰰ 
             TaggedDocs AS (਀                 ⴀⴀ 䘀椀渀愀氀 爀攀猀甀氀琀㨀 搀漀挀甀洀攀渀琀猀 椀渀挀氀甀搀攀搀 戀礀 䄀一䐀 氀漀最椀挀Ⰰ 戀甀琀 渀漀琀 攀砀挀氀甀搀攀搀 戀礀 椀渀瘀攀爀琀攀搀 琀愀最猀 
                 SELECT doc_id਀                 䘀刀伀䴀 䤀渀挀氀甀搀攀搀䐀漀挀猀 
                 WHERE doc_id NOT IN (SELECT doc_id FROM ExcludedDocs)਀             ⤀Ⰰ 
਀ 
਀     ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
            docidsCTE AS (਀            匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
              FROM TaggedDocs AS searchtable  --### The search criteria table਀        䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
            ON searchtable.doc_id = perm.doc_id  -- Apply permission filtering਀               圀䠀䔀刀䔀 一伀吀 䔀堀䤀匀吀匀 ⠀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
            -- Radio button attribute failure਀            匀䔀䰀䔀䌀吀 ㄀ 
            FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀            圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
              AND NOT EXISTS (਀                  匀䔀䰀䔀䌀吀 ㄀ 
                  FROM doc_attr.doc_radio_button_links AS drbl਀                  圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                    AND drbl.doc_id = searchtable.doc_id਀              ⤀ 
            )਀        䄀一䐀 
            NOT EXISTS (਀                ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
                SELECT 1਀                䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
                WHERE dmsafgl.filter_group_id = @filtergroupid਀                  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
                      SELECT 1਀                      䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
                      WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀                        䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
                  )਀            ⤀ 
        ),      ਀           
਀    ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
    --      Retrieve the fileid for the document according to the filter group     ਀ 
            docidfileidCTE AS (਀                匀䔀䰀䔀䌀吀  
                    docid                                                    AS documentid, ਀                    昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
                    DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀                    䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
                FROM docidsCTE ਀                伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
            )਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀            䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀   匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numrecords = ISNULL(@numrecords, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开挀漀开洀猀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document and associated file metadata by document common object multi-select link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀Ⰰ 愀渀 漀瀀琀椀漀渀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀 
-- and an optional form id.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开挀漀开洀猀开愀琀琀爀崀  
      @commonobjlistid bigint          = NULL,਀ऀ  䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	--  Check the search criteria name field id਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀  ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM com_obj.doc_to_com_obj_ms_list_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE     searchtable.common_object_list_id = @commonobjlistid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
-- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 		਀ऀऀ   
	਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ  
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
   ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀            䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
  -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
     SET @outputfiltergroupid = @filtergroupid਀ऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
	                           FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀   匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numrecords = ISNULL(@numrecords, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开挀漀开爀戀开愀琀琀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document and associated file metadata by document common object radio button link.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 椀搀 愀渀搀 愀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀Ⰰ 愀渀 漀瀀琀椀漀渀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 椀搀 
-- and an optional form id.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开挀漀开爀戀开愀琀琀爀崀  
      @commonobjlistid bigint          = NULL,਀ऀ  䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	--  Check the search criteria name field id਀ऀऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 氀椀猀琀 爀攀昀攀爀攀渀挀攀 
		IF @commonobjlistid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjlistid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀䰀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);					਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObjList.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_list_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀  
							WHERE common_object_list_id  = @commonobjlistid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjlistid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjListNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀ऀⴀⴀ 䌀栀攀挀欀 琀栀攀 挀漀洀洀漀渀 漀戀樀攀挀琀 椀搀 爀攀昀攀爀攀渀挀攀 
	    IF @commonobjectid = 0਀ऀऀ   匀䔀吀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 一唀䰀䰀㬀 
		IF @commonobjectid IS NULL਀ऀऀऀ䈀䔀䜀䤀一 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䌀漀洀伀戀樀攀挀琀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoComObject.');਀ऀऀऀ䔀一䐀 
        ELSE਀ऀऀ  䈀䔀䜀䤀一 
			IF NOT EXISTS (SELECT common_object_id ਀ऀऀ ऀऀ ऀऀऀ 䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  
							WHERE common_object_id  = @commonobjectid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @commonobjectid), ' | ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ComObjectNotExist');਀ऀऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀一䐀 
		  END਀ 
਀  ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM com_obj.doc_to_com_obj_radiob_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE     searchtable.common_object_list_id = @commonobjlistid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀      㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀऀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_doc_xref]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Lists the metadata for documents and also files linked to the documents, for a given document, by cross reference.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 搀漀挀甀洀攀渀琀 椀搀⸀  䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_doc_xref] ਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ   
	  @xref_typeid bigint              = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                                  ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㐀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@fileid bigint,਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
	      IF @documentid = ''਀ऀऀ     匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @documentid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀऀ 䔀一䐀 
਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 搀漀挀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN -- Check if the document ID exists and the user has edit permission for the document਀ऀऀऀऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀   
 							@doc_id_to_check =  @documentid,਀ऀऀऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
						   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							  SET @message = CONCAT(@message, ' | ', 'Document ID: ', LEFT(@documentid, 20), '... ', @tempmessage);਀ऀऀऀऀऀऀ   䔀䰀匀䔀  
							  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀऀऀ 䔀一䐀 
				END਀ 
 	      -- Check the cross reference id਀ऀऀ  䤀䘀 䀀砀爀攀昀开琀礀瀀攀椀搀 㴀 　 
			 SET @xref_typeid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 挀爀漀猀猀ⴀ爀攀昀攀爀攀渀挀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @xref_typeid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀堀爀攀昀吀礀瀀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoXrefTypeID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A cross reference id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT xref_type_id਀ऀऀऀ                 䘀刀伀䴀 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀 
							WHERE xref_type_id = @xref_typeid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀堀爀攀昀吀礀瀀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, (@tempmessage + '  ID:' + CONVERT(nvarchar(10), @xref_typeid)));਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on XrefTypeIDNotExist.');਀ऀऀऀऀ 䔀一䐀   
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀砀爀攀昀开搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM xref.doc_cross_references AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.xref_doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.xref_type_id = @xref_typeid     --### The search criteria਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.xref_doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀砀爀攀昀开搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 			  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_duty_function]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_duty_function] ਀      䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ     
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀   ⴀⴀ 䐀甀琀礀 昀甀渀挀琀椀漀渀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @functionid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
		  IF @functionid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䐀甀琀礀 昀甀渀挀琀椀漀渀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @functionid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT function_id਀ऀऀऀऀऀऀऀऀऀ 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
									WHERE function_id = @functionid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_function_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.function_id਀ऀऀ               㴀 䀀昀甀渀挀琀椀漀渀椀搀      ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㜀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 昀椀氀攀 䤀䐀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_file] ਀      䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
	  @formid bigint                   = NULL, -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),    ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileauthenticationstatus nchar(10) = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ ऀ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	   ELSE  ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
 -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM xref.file_to_document_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.file_id = @fileid     --### The search criteria਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 		਀           ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document      ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                            AS documentid, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE AS f਀ऀऀ⤀ 
   ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
   ਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_filter_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㜀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_filter_group] ਀     
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀  
 -- Apply filter group filtering਀    一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 		਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_funct_fld_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_funct_fld_name] ਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ     
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_function_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀      ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀऀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_function_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_function_list] ਀      䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀   ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @functionlistid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @functionlistid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @functionlistid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT function_list_id਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 
									WHERE function_list_id = @functionlistid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_function_list_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.function_list_id = @functionlistid     --### The search criteria਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 		਀ऀऀ   
	਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ  
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
   ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀            䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
  -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
     SET @outputfiltergroupid = @filtergroupid਀ऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
	                           FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀   匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numrecords = ISNULL(@numrecords, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according to a people list.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀崀  
      @peoplelistid bigint             = NULL,    ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                                  ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㐀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;  ਀ 
 -- Data validation	਀ 
਀ऀऀ  ⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
   -- People list validation਀ऀऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　  
			 SET @peoplelistid = NULL;਀ऀऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN  -- People list not supplied਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoAttrID', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀  
				BEGIN  -- Check if the people list is valid਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									 FROM people.people_list_names਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀  
						BEGIN -- People list does not exist਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE  ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						END਀ऀऀऀ䔀一䐀 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		               = @peoplelistid      --### The search criteria਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	਀ऀऀ   
	਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ  
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
   ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀            䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
  -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
     SET @outputfiltergroupid = @filtergroupid਀ऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
	                           FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀   匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numrecords = ISNULL(@numrecords, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开爀愀搀椀漀开戀甀琀琀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs according to a radio button attribute.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开爀愀搀椀漀开戀甀琀琀漀渀崀  
      @docradiobattrid bigint          = NULL,    ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                                  ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㐀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀ऀऀ䤀䘀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一唀䰀䰀  
			BEGIN  -- The search criteria was not supplied਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrID',  -- ###਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE  ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			END ਀ऀऀ䔀䰀匀䔀 ⴀⴀ 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀  
				BEGIN -- A document search criteria name field id has been supplied   ###਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀        
									FROM doc_attr.doc_radio_button_attributes  ਀ऀऀऀ  ऀ ऀऀऀऀऀ圀䠀䔀刀䔀 搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
					BEGIN -- Field is invalid.਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 䀀搀漀挀爀愀搀椀漀戀愀琀琀爀椀搀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀऀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_tag]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 琀愀最⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀ⴀⴀ 䤀昀 渀漀 琀愀最 琀爀攀攀 䤀䐀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 琀栀攀 搀攀昀愀甀氀琀 椀猀 爀攀琀爀椀攀瘀攀搀 昀爀漀洀 琀栀攀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 琀愀戀氀攀⸀ 
-- If @tag_descendants is any value other than 'ON' then the tag descendants will not be retrieved. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_tag] ਀      䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ     
	  @tag_treeid bigint               = NULL,   -- An optional tag tree to be applied to the tag to retrieve descendants of the tag.਀ऀ  䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 渀瘀愀爀挀栀愀爀⠀㌀⤀     㴀 ✀伀一✀Ⰰ   ⴀⴀ 䄀 猀眀椀琀挀栀 眀栀椀挀栀 搀攀琀攀爀洀椀渀攀猀 眀栀攀琀栀攀爀 搀攀猀挀攀渀搀愀渀琀猀 漀昀 琀栀攀 最椀瘀攀渀 琀愀最 愀爀攀 椀渀挀氀甀搀攀搀⸀ 
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ 
 -- Data validation	਀ 
  -- Validate the tag tree਀ ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag tree id has not been supplied.਀ऀऀऀ   ⴀⴀ 䜀攀琀 琀栀攀 搀攀昀愀甀氀琀 琀愀最 琀爀攀攀 䤀䐀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 
					SELECT @tag_treeid = default_tag_tree_id਀ऀऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
					 WHERE setting_group_name = 'Master';਀ऀ          䔀一䐀 
		  ELSE਀ऀऀऀ 䈀䔀䜀䤀一   
				 IF NOT EXISTS (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀  
								 WHERE    tag_tree_id ਀ऀऀऀऀऀऀऀऀ       㴀 䀀琀愀最开琀爀攀攀椀搀⤀ 
					 BEGIN -- tag group id does not exist਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TagTreeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最吀爀攀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					 END਀ऀऀऀ 䔀一䐀 
਀ 
		  --  Check the search criteria name field id਀ ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
			 BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 END਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		-- Select all the documents linked to the given tag਀ऀऀऀ圀䤀吀䠀 䈀愀猀攀吀愀最 䄀匀 ⠀ 
				SELECT tag_id, tag_tree_hierarchyid਀ऀऀऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
				WHERE tag_id = @tag_id਀ऀऀऀऀ䄀一䐀 琀愀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀椀搀 
			),਀ऀऀऀ吀愀最最攀搀䐀漀挀猀 䄀匀 ⠀ 
				SELECT DISTINCT tdl.doc_id਀ऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 䄀匀 琀琀渀 
				     INNER JOIN BaseTag AS bt਀ऀऀऀऀऀ         伀一 ⠀䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 㴀 ✀伀一✀  
				            AND ttn.tag_tree_hierarchyid.IsDescendantOf(bt.tag_tree_hierarchyid) = 1)਀ऀऀऀऀऀ         伀刀  琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀  
							    = bt.tag_tree_hierarchyid਀ऀऀऀऀ     䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 琀搀氀 
					         ON ttn.tag_id = tdl.tag_id਀ 
				UNION਀ 
				SELECT DISTINCT tdl.doc_id਀ऀऀऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 琀搀氀 
				WHERE tdl.tag_id = @tag_id਀ऀऀऀ⤀Ⰰ 
 --==============================================਀ऀऀ搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 吀愀最最攀搀䐀漀挀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id    	਀ऀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最              
     WHERE NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ 
	਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ  
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
   ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀            䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
  -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
     SET @outputfiltergroupid = @filtergroupid਀ऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
	                           FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀   匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numrecords = ISNULL(@numrecords, 0);਀   匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开琀攀砀琀开昀椀攀氀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs and metadata according to the content of a text field using the LIKE operator.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀   
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_text_field] ਀      䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @likestring nvarchar(max)        = '',਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                               ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀ 
		  -- Check the doc text name field id਀ऀऀ  䤀䘀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 㴀 　 
		     SET @doctextnameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		     BEGIN -- A document doc text name field id has been supplied਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_free_text_values਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀琀攀砀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN -- Doc text name field is invalid.਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀✀⤀㬀 
					END਀ऀऀऀ 䔀一䐀 
		  ELSE -- No doc text name field ID has been supplied਀ऀऀऀ䈀䔀䜀䤀一 
			   SET @doctextnameid = (SELECT default_doc_free_text_name_id ਀ऀऀऀ            䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ    䤀䘀  䀀搀漀挀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			        BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DefFrTextIdNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE  ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀爀吀攀砀琀䤀搀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀ     䔀一䐀 ⴀⴀ 䔀一䐀 挀栀攀挀欀椀渀最 琀栀攀 搀攀昀愀甀氀琀 搀漀挀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_free_text_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_free_text_name_id = @doctextnameid     --### The search criteria਀ऀऀ  䄀一䐀  
		  (਀ऀऀ    ⠀䀀氀椀欀攀猀琀爀椀渀最 䤀匀 一唀䰀䰀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀琀攀砀琀开瘀愀氀甀攀 䤀匀 一唀䰀䰀⤀  ⴀⴀ 䌀愀琀攀爀猀 昀漀爀 猀攀愀爀挀栀椀渀最 昀漀爀 爀攀挀漀爀搀猀 眀栀攀爀攀 猀攀愀爀挀栀 猀琀爀椀渀最 椀猀 一唀䰀䰀 
		    OR (searchtable.text_value LIKE '%' + @likestring + '%' ESCAPE '\')਀ऀऀ  ⤀ 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count)    from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
    SET @numrows    = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ　⤀㬀 
	SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开琀爀愀渀猀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-07-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects document id with a given transaction group਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开戀礀开琀爀愀渀猀开最爀漀甀瀀崀  
਀     䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @transactiongroup bigint         = NULL,਀  ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numdocs bigint                  = NULL OUTPUT, ਀ऀ 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)    = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀             㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@transaction_ready nchar(10)        = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
  -- Check that the transaction group exists.  Fail if it doesn't. But allow NULLs.਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 　  
     SET @transactiongroup = NULL;਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一伀吀 一唀䰀䰀 
     BEGIN਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
                          FROM base.transaction_groups ਀                         圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀  
             BEGIN਀               䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                    @message_id = 'TGNotExist', ਀ऀऀऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	           IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	         END਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀      䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  	     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ  䔀䰀匀䔀  
	     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀ䔀一䐀 
  -- End data validation਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀  ⴀⴀ 匀攀氀攀挀琀 搀漀挀甀洀攀渀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 愀 最椀瘀攀渀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀⸀   
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一唀䰀䰀 
਀ऀऀ   䈀䔀䜀䤀一 
	WITH docidsCTE AS (਀ऀ  ऀऀऀ匀䔀䰀䔀䌀吀  
					   searchtable.doc_id           AS ID ਀ऀऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ 圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 䤀匀 一唀䰀䰀 
					 )਀ 
    -- Extract the data according to the form id਀ 
			 INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀऀ  ⠀匀䔀䰀䔀䌀吀  
					  DENSE_RANK() OVER (ORDER BY docidsCTE.ID) AS doc_count, ਀ऀऀऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀䤀䐀            䄀匀 搀漀挀椀搀Ⰰ  
					  doc_data.field_type     AS field_type, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
					  doc_data.field_name     AS field_name, ਀ऀऀऀ          搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
					  doc_data.attr_id        AS attr_id, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
					  doc_data.units          AS units,਀ऀऀऀ          搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
				 FROM docidsCTE AS df਀ऀऀ  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀䤀䐀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
		   RIGHT JOIN docidsCTE਀ऀऀऀऀ   伀一 搀漀挀椀搀猀䌀吀䔀⸀䤀䐀 
						  = doc_data.doc_id);਀ 
				SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ   ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                  -- each row in this table is a field.਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
           END -- END  IF @transactiongroup IS NULL਀ 
		ELSE਀ऀ      䈀䔀䜀䤀一 
	WITH docidsCTE AS (਀ऀऀऀऀ匀䔀䰀䔀䌀吀  
					   searchtable.doc_id           AS ID ਀ऀऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀऀ圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 
					)਀ऀऀऀ  
       -- Extract the data according to the form id਀ 
			 INSERT INTO @AttData  (doc_count, docid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀऀ  ⠀匀䔀䰀䔀䌀吀  
					  DENSE_RANK() OVER (ORDER BY docidsCTE.ID) AS doc_count, ਀ऀऀऀऀऀ  搀漀挀椀搀猀䌀吀䔀⸀䤀䐀            䄀匀 搀漀挀椀搀Ⰰ  
					  doc_data.field_type     AS field_type, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 渀愀洀攀开椀搀Ⰰ  
					  doc_data.field_name     AS field_name,  ਀ऀऀऀ          搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
					  doc_data.attr_id        AS attr_id, ਀ऀऀऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
					  doc_data.units          AS units,਀ऀऀऀ          搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
				 FROM docidsCTE AS df਀ऀऀ  䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀䤀䐀Ⰰ 一唀䰀䰀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀  
		   RIGHT JOIN docidsCTE਀ऀऀऀऀ   伀一 搀漀挀椀搀猀䌀吀䔀⸀䤀䐀 
						  = doc_data.doc_id);਀ 
				SELECT @numdocs = MAX(doc_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀搀漀挀开挀漀甀渀琀                  䄀匀 ✀刀攀挀漀爀搀✀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                -- each row in this table is a field.਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name',  ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ऀऀ  䔀一䐀 ⴀⴀ 䔀一䐀 䔀䰀匀䔀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一唀䰀䰀 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
        SET @numrows = @@ROWCOUNT;਀ 
  -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀  ऀ    䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	      BEGIN਀ऀ        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                 @message_id   = 'ZeroRecords', ਀                 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF (@tempmessage IS NOT NULL) ਀  ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		     ELSE ਀ऀऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀✀⤀㬀 
		  END਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'Success', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	    IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	    SET @transaction_status = 'Good';਀ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	      SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ      䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	    ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀   匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀    
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_user]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 甀猀攀爀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_user] ਀      䀀猀椀搀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ    
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
		  --  Check the search criteria name field id਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
		  IF @sidid = 0਀ऀऀऀ 匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			                 FROM user_restr.sid_list AS SL਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_user_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.sid_id਀ऀऀ               㴀 䀀猀椀搀椀搀      ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_by_user_fgn]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 昀漀爀 愀 甀猀攀爀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_by_user_fgn] ਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ     
	  @filtergroupid bigint            = NULL,   -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(400)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀 
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀   
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM people.doc_to_user_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀      ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
          AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ  
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_created_between]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 椀昀 愀 搀漀挀甀洀攀渀琀 挀爀攀愀琀攀搀 搀愀琀攀 瘀愀氀甀攀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 搀愀琀攀猀⸀  一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀ 
-- Doesn't retrieve associated files. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开挀爀攀愀琀攀搀开戀攀琀眀攀攀渀崀  
  ਀ऀ  䀀攀愀爀氀椀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀           㴀 一唀䰀䰀Ⰰ 
	  @later_date datetime             = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ   
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
 -- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
਀ऀ      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀愀琀攀 瘀愀氀甀攀 椀猀 瘀愀氀椀搀 
		  IF (@earlier_date IS NOT NULL AND @earlier_date <> '')਀ऀऀ     䈀䔀䜀䤀一 
			   IF ISDATE(@earlier_date) <> 1਀ऀऀऀ      䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateInvalid.');਀ऀऀऀऀ  䔀一䐀 
			 END਀ऀऀ  䔀䰀匀䔀 匀䔀吀 䀀攀愀爀氀椀攀爀开搀愀琀攀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ऀऀ  䤀䘀 ⠀䀀氀愀琀攀爀开搀愀琀攀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀氀愀琀攀爀开搀愀琀攀 㰀㸀 ✀✀⤀ 
		     BEGIN਀ऀऀऀ   䤀䘀 䤀匀䐀䄀吀䔀⠀䀀氀愀琀攀爀开搀愀琀攀⤀ 㰀㸀 ㄀ 
			      BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DateInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				  END਀ऀऀऀ 䔀一䐀 
		  ELSE SET @later_date = NULL;਀ 
  ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id              AS docid ਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀挀爀攀愀琀攀搀 㰀㴀 䀀氀愀琀攀爀开搀愀琀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀挀爀攀愀琀攀搀 㸀㴀 䀀攀愀爀氀椀攀爀开搀愀琀攀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀ऀ 
			-- Filter group is not applicable for the case of retrieving document ids acording to create date. ਀ऀऀ  ⤀        
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀     䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
      (SELECT ਀ऀऀ      䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀ 䄀匀 搀漀挀开挀漀甀渀琀Ⰰ 
			  docidsCTE.docid         AS docid, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			  doc_data.field_name_id  AS name_id, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			  doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			  doc_data.attr_value     AS attr_value, ਀ऀऀऀ  搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			  doc_data.form_position  AS form_position਀ऀऀ 䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀昀 
  CROSS APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.docid, NULL, @formid) AS doc_data਀   刀䤀䜀䠀吀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 
	       ON docidsCTE.docid਀ऀऀऀ      㴀 搀漀挀开搀愀琀愀⸀搀漀挀开椀搀⤀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀 㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀     匀䔀䰀䔀䌀吀  
		    ad.doc_count                  AS 'Record',਀ऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
			ad.field_type                 AS 'Field Type', ਀ऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
			ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
			ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
			ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
	   FROM @AttData AS ad਀   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ ✀刀攀挀漀爀搀✀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
	  -- Return the actual form details applied.  ਀ऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
		 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
						   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ 
	SET @numrows = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_date_after]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 搀愀琀攀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开搀愀琀攀开愀昀琀攀爀崀  
      @docdatenameid bigint            = NULL,    ਀ऀ  䀀搀愀琀攀瘀愀氀甀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀          㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                               -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass'; ਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docdatenameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docdatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_date_name_id = @docdatenameid) -- Check if the doc date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 䤀䐀 
		  AND ਀ऀऀ  ⠀ 
		    (searchtable.date_value > @datevalue)   --### The search criteria value਀ऀऀ  ⤀ 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ  
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count)    from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
    SET @numrows    = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ　⤀㬀 
	SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开搀愀琀攀开戀攀昀漀爀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects document IDs and metadata before a given date.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
CREATE PROCEDURE [reading].[usp_SEL_docs_date_before] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                               ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
		  -- Check the doc date name field id਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 　 
		     SET @docdatenameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_date_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_date_name_id = @docdatenameid     --### The search criteria ID਀ऀऀ  䄀一䐀  
		  (਀ऀऀ    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㰀 䀀搀愀琀攀瘀愀氀甀攀⤀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀 
		  )਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	 ਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀    昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_date_between]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 戀攀琀眀攀攀渀 最椀瘀攀渀 搀愀琀攀猀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开搀愀琀攀开戀攀琀眀攀攀渀崀  
      @docdatenameid bigint            = NULL,    ਀ऀ  䀀攀愀爀氀椀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀       㴀 一唀䰀䰀Ⰰ 
	  @later_date datetime2(7)         = NULL, ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                               ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
		  -- Check the doc date name field id਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 　 
		     SET @docdatenameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_date_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_date_name_id = @docdatenameid     --### The search criteria ID਀ऀऀ  䄀一䐀  
		  (਀ऀऀ    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㰀㴀 䀀氀愀琀攀爀开搀愀琀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㸀㴀 䀀攀愀爀氀椀攀爀开搀愀琀攀⤀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀 
		  )਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	 ਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀    昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_date_equals]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 搀愀琀攀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_date_equals] ਀      䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                               ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
		  -- Check the doc date name field id਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 　 
		     SET @docdatenameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_date_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_date_name_id = @docdatenameid     --### The search criteria਀ऀऀ  䄀一䐀  
		  (਀ऀऀ    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀 㴀 䀀搀愀琀攀瘀愀氀甀攀⤀ 
		  )਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	 ਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀    昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_date_expired]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 搀攀昀愀甀氀琀 搀漀挀甀洀攀渀琀 搀愀琀攀 昀椀攀氀搀 栀愀猀 攀砀瀀椀爀攀搀⸀   
-- Typically used for listing documents for which the reivew date has expired. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
CREATE PROCEDURE [reading].[usp_SEL_docs_date_expired] ਀ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                               -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),   ਀        䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ  ऀ 
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
   -- Read the default document date name ID from global settings.਀         匀䔀䰀䔀䌀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 最猀最⸀搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 
           FROM base.global_settings_groups AS gsg਀ऀऀ  圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docdatenameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docdatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀攀昀䐀漀挀䐀愀琀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDefDocDate.');਀ऀऀऀ 䔀一䐀  ⴀⴀ 吀栀攀 昀椀攀氀搀 椀渀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 椀猀 爀攀昀攀爀攀渀挀攀 挀漀渀猀琀爀愀椀渀攀搀 琀漀 琀栀攀 搀漀挀 搀愀琀攀 昀椀攀氀搀 琀愀戀氀攀 愀渀搀 栀攀渀挀攀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 戀攀 瘀攀爀椀昀椀攀搀 椀昀 椀琀 攀砀椀猀琀猀⸀ 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀搀漀挀搀愀琀攀渀愀洀攀椀搀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 䤀䐀 
		  AND ਀ऀऀ  ⠀ 
		    (searchtable.date_value < SYSDATETIME())   --### The search criteria value਀ऀऀ  ⤀ 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count)    from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
    SET @numrows    = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ　⤀㬀 
	SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开椀渀琀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the designated integer field is two given values.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_int_between] ਀ऀ  䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ    
	  @lower_int_value bigint          = NULL,਀ऀ  䀀甀瀀瀀攀爀开椀渀琀开瘀愀氀甀攀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                               -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass'; ਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docintnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc integer name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		  AND   (searchtable.int_value > @lower_int_value AND searchtable.int_value < @upper_int_value)		  ਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	  ਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀    昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_int_equals]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 椀渀琀攀最攀爀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开椀渀琀开攀焀甀愀氀猀崀  
	  @docintnameid bigint             = NULL,   ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                               -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass'; ਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docintnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc integer name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		  AND ਀ऀऀ  ⠀ 
		    (searchtable.int_value = @integervalue)਀ऀऀ  ⤀ 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count)    from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
    SET @numrows    = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ　⤀㬀 
	SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开椀渀琀开最爀攀愀琀攀爀开琀栀愀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the designated integer field is greater than a given value.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_int_greater_than] ਀ऀ  䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ    
	  @integervalue bigint             = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                               ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docintnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docintnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䤀渀琀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoIntNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc integer name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_int_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_int_name_id = @docintnameid) -- Check if the doc integer name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IntIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		  AND ਀ऀऀ  ⠀ 
		    (searchtable.int_value > @integervalue)਀ऀऀ  ⤀ 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count)    from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
    SET @numrows    = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ　⤀㬀 
	SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开椀渀琀开氀攀猀猀开琀栀愀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files where the designated integer field is less than a given value.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_int_less_than] ਀ऀ  䀀搀漀挀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ    
	  @integervalue bigint             = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                               ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
		  -- Check the doc integer name field id਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @docintnameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀渀琀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀搀漀挀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the integer value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_integer_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_int_name_id = @docintnameid     --### The search criteria਀ऀऀ  䄀一䐀  
		  (਀ऀऀ    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㰀 䀀椀渀琀攀最攀爀瘀愀氀甀攀⤀ 
		  )਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	 ਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀    昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_multi_sel_attr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀 洀攀琀愀搀愀琀愀 戀礀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 氀椀渀欀⸀ 
-- Input is a common object list id and a common object id, an optional filter group id਀ⴀⴀ 愀渀搀 愀渀 漀瀀琀椀漀渀愀氀 昀漀爀洀 椀搀⸀ 
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_multi_sel_attr] ਀ऀ  䀀搀漀挀洀猀氀椀猀琀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
	  @docmsattrid bigint              = NULL,   ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                                  ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㐀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;  ਀ 
 -- Data validation	਀ 
 --==============================਀ऀⴀⴀ  䌀栀攀挀欀 琀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  -- Check the multi-select list਀ऀऀ  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 㴀 　 
		     SET @docmslistid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document multi-select list id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开氀椀猀琀开椀搀  
								  FROM doc_attr.doc_multi_select_list_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开洀猀开氀椀猀琀开椀搀 㴀 䀀搀漀挀洀猀氀椀猀琀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀  
		  -- Check if a doc multi-select attribute id was supplied. ਀ऀऀ  䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 㴀 　 
		     SET @docmsattrid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ 
          -- Check that the multi-select attribute and multi-select list id pair exists਀ऀऀ  䤀䘀 䀀搀漀挀洀猀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开洀猀开愀琀琀爀开椀搀 
								  FROM doc_attr.doc_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
									   AND doc_ms_list_id = @docmslistid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ 
਀  ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 -- ============================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_multi_select_links AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE     searchtable.doc_ms_list_id = @docmslistid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 䀀搀漀挀洀猀愀琀琀爀椀搀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀऀ 
		  ਀ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows, ਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀    
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount            AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count) from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
   SET @numrows    = ISNULL(@numrows, 0);਀   匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ 　⤀㬀 
   SET @numdocs    = ISNULL(@numdocs, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_real_between]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 戀攀椀渀最 戀攀琀眀攀攀渀 琀眀漀 瘀愀氀甀攀猀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开爀攀愀氀开戀攀琀眀攀攀渀崀  
	  @docrealnameid bigint            = NULL,   ਀ऀ  䀀氀漀眀攀爀开爀攀愀氀开瘀愀氀甀攀 爀攀愀氀           㴀 一唀䰀䰀Ⰰ 
	  @upper_real_value real           = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                               ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
		  -- Check the doc real number name field id਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 　 
		     SET @docrealnameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_real_number_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_real_name_id = @docrealnameid     --### The search criteria਀ऀऀ  䄀一䐀  
		  ਀ऀऀ    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀 㸀 䀀氀漀眀攀爀开爀攀愀氀开瘀愀氀甀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀 㰀 䀀甀瀀瀀攀爀开爀攀愀氀开瘀愀氀甀攀⤀ऀ 
		  ਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	 ਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀    昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_real_equals]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开爀攀愀氀开攀焀甀愀氀猀崀  
	  @docrealnameid bigint            = NULL,   ਀ऀ  䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀            㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                               -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docrealnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docrealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_real_name_id = @docrealnameid) -- Check if the doc real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		  AND   (searchtable.real_value = @realnumbervalue)਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	 ਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀    昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_docs_real_greater_than]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 洀攀琀愀搀愀琀愀 昀漀爀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 戀攀椀渀最 最爀攀愀琀攀爀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开爀攀愀氀开最爀攀愀琀攀爀开琀栀愀渀崀  
	  @docrealnameid bigint            = NULL,   ਀ऀ  䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀 爀攀愀氀            㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                               -- Each record is a document-file pair.਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀  一漀琀椀渀最 琀栀愀琀 攀愀挀栀 搀漀挀甀洀攀渀琀 眀椀氀氀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀搀漀挀甀洀攀渀琀椀搀 戀椀最椀渀琀Ⰰ 
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ搀漀挀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @docrealnameid = 0਀ऀऀ     匀䔀吀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @docrealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A document doc real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT doc_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE doc_real_name_id = @docrealnameid) -- Check if the doc real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id     AS docid਀ऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply the permission filter਀ऀऀ    伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			    = perm.doc_id਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀     ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 
		  AND ਀ऀऀ  ⠀ 
		    (searchtable.real_value > @realnumbervalue)਀ऀऀ  ⤀ 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = searchtable.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀Ⰰ ऀ   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileid for the document according to the filter group     ਀ 
		docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				docid                                                    AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                                䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid, f.file_id)  AS numrows,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀⤀             䄀匀 搀漀挀挀漀甀渀琀 
			FROM docidsCTE ਀ऀऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
		)਀   
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Extract the data according to the form id਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀开挀漀甀渀琀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
		    df.doccount             AS doc_count, -- This informs the calling application how to parse the data into rows ਀ऀऀऀ                                     ⴀⴀ 猀椀渀挀攀 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numdocs    = MAX(doc_count)    from @AttData;਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	  END  -- END IF @transaction_ready = 'Ready'਀    
    SET @numrows    = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ　⤀㬀 
	SET @numdocs    = ISNULL(@numdocs, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀猀开爀攀愀氀开氀攀猀猀开琀栀愀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects metadata for document IDs and associated files according to a given real number field being less than a given value.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to document IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_docs_real_less_than] ਀ऀ  䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ    
	  @realnumbervalue real            = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                               ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @numdocs bigint                  = NULL OUTPUT,  -- This is the number of documents.  Noting that each document will have zero or more associated files.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@documentid bigint,਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
  		doc_count bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numdocs = 0;਀ 
 -- Data validation	਀ 
		  -- Check the doc real number name field id਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 㴀 　 
		     SET @docrealnameid = NULL;਀ऀऀ  䤀䘀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A document real number name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoRealNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀刀攀愀氀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 搀漀挀甀洀攀渀琀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
								  FROM doc_attr.doc_real_number_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 搀漀挀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀搀漀挀爀攀愀氀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀漀挀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'RealIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
	IF @transaction_ready = 'Ready'਀ऀ  䈀䔀䜀䤀一 
		BEGIN TRY਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀     䄀匀 搀漀挀椀搀 
		  FROM doc_attr.doc_real_number_values AS searchtable  --### The search criteria table਀ऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
		    ON    searchtable.doc_id਀ऀऀऀ    㴀 瀀攀爀洀⸀搀漀挀开椀搀 
		WHERE searchtable.doc_real_name_id = @docrealnameid     --### The search criteria਀ऀऀ  䄀一䐀  
		  (਀ऀऀ    ⠀猀攀愀爀挀栀琀愀戀氀攀⸀爀攀愀氀开瘀愀氀甀攀 㰀 䀀爀攀愀氀渀甀洀戀攀爀瘀愀氀甀攀⤀ 
		  )਀ 
 -- Apply filter group filtering਀     䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
        -- Radio button attribute failure਀        匀䔀䰀䔀䌀吀 ㄀ 
        FROM doc_attr.doc_radiob_attr_fgroup_links AS fgl਀        圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
          AND NOT EXISTS (਀              匀䔀䰀䔀䌀吀 ㄀ 
              FROM doc_attr.doc_radio_button_links AS drbl਀              圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
                AND drbl.doc_id = searchtable.doc_id਀          ⤀ 
		)਀ऀ䄀一䐀 
		NOT EXISTS (਀ऀऀऀⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
			SELECT 1਀ऀऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
			WHERE dmsafgl.filter_group_id = @filtergroupid਀ऀऀऀ  䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
				  SELECT 1਀ऀऀऀऀ  䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
				  WHERE dmsl.doc_ms_attr_id = dmsafgl.doc_ms_attr_id਀ऀऀऀऀऀ䄀一䐀 搀洀猀氀⸀搀漀挀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  )਀ऀऀ⤀ 
	), 	਀ 
-- ================================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀      
਀ऀऀ搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 ⠀ 
			SELECT ਀ऀऀऀऀ搀漀挀椀搀                                                    䄀匀 搀漀挀甀洀攀渀琀椀搀Ⰰ  
				f.file_id                                                AS fileid,਀ऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 搀漀挀椀搀猀䌀吀䔀⸀搀漀挀椀搀Ⰰ 昀⸀昀椀氀攀开椀搀⤀  䄀匀 渀甀洀爀漀眀猀Ⰰ 
				DENSE_RANK() OVER (ORDER BY docidsCTE.docid)             AS doccount਀ऀऀऀ䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀  
			OUTER APPLY internal.ufn_SEL_file_by_doc_fgroup_TVF(docidsCTE.docid, @filtergroupid) AS f਀ऀऀ⤀ 
  ਀ 
-- ================================================================================਀ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
	INSERT INTO @AttData  (num_records, doc_count, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀ    搀昀⸀搀漀挀挀漀甀渀琀             䄀匀 搀漀挀开挀漀甀渀琀Ⰰ ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀  
			                                     -- since each row in this table is a field.਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀搀漀挀猀    㴀 䴀䄀堀⠀搀漀挀开挀漀甀渀琀⤀    昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ 
-- ===================================================਀ 
		  SET @numrows = @@ROWCOUNT;਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ऀ匀䔀吀 䀀渀甀洀搀漀挀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀搀漀挀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_document_details]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 琀栀攀 搀愀琀愀 氀椀渀欀攀搀 琀漀 愀 猀椀渀最氀攀 搀漀挀甀洀攀渀琀⸀ 
-- Output is a status message and a transaction status਀ⴀⴀ 瀀氀甀猀 琀栀攀 氀椀猀琀 漀昀 洀攀琀愀搀愀琀愀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开搀漀挀甀洀攀渀琀开搀攀琀愀椀氀猀崀  
਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀椀搀 戀椀最椀渀琀                       㴀 一唀䰀䰀Ⰰ ⴀⴀ 唀猀攀爀 䤀䐀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
	    @docauthenticationstatus nchar(10)   = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀ऀऀ㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- ====================================================਀ 
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
			END਀ 
		-- End document id validation਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀  
਀ 
WITH DocData AS (਀ 
      SELECT   'Common Object Multi-Select' AS Type,਀ऀ            挀漀氀渀⸀氀椀猀琀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
				co.object_name AS Value,਀ऀऀऀऀ✀✀             䄀匀 唀渀椀琀猀 
		   FROM com_obj.doc_to_com_obj_ms_list_links AS comsll਀ऀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
			 ON      col.common_object_list_id ਀ऀऀऀ    㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			    AND  col.common_object_id ਀ऀऀऀऀ㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
	 INNER JOIN com_obj.common_object_list_names AS coln਀ऀऀऀ 伀一  挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			    = col.common_object_list_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 挀漀 
	 		 ON    co.common_object_id ਀ऀऀऀ    㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
		  WHERE comsll.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Common Object Radio Button' AS Type,਀ऀ            挀漀氀渀⸀氀椀猀琀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
				co.object_name AS Value,਀ऀऀऀऀ✀✀             䄀匀 唀渀椀琀猀 
		FROM com_obj.doc_to_com_obj_radiob_links AS comrbl਀  䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀  
	  	  ON      col.common_object_list_id ਀ऀऀ     㴀 挀漀洀爀戀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		     AND  col.common_object_id ਀ऀऀऀ 㴀 挀漀洀爀戀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
  INNER JOIN com_obj.common_object_list_names AS coln਀ऀ  ऀ  伀一  挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		     = col.common_object_list_id਀  䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 挀漀 
		  ON    co.common_object_id ਀ऀऀ     㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
	   WHERE comrbl.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Date Field'          AS Type,਀ऀ           昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀   䄀匀 一愀洀攀Ⰰ 
               CONVERT(NVARCHAR(30), val.date_value, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀⤀   䄀匀 嘀愀氀甀攀Ⰰ 
				''             AS Units਀ऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
  INNER JOIN doc_attr.doc_date_field_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
		     =     val.doc_date_name_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀✀   䄀匀 吀礀瀀攀Ⰰ 
	           fieldname.attr_name AS Name,਀               瘀愀氀⸀琀攀砀琀开瘀愀氀甀攀      䄀匀 嘀愀氀甀攀Ⰰ 
				''                 AS Units਀ऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
  INNER JOIN doc_attr.doc_free_text_field_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
		     =     val.doc_free_text_name_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䤀渀琀攀最攀爀 䘀椀攀氀搀✀     䄀匀 吀礀瀀攀Ⰰ 
	           fieldname.attr_name AS Name,਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀椀渀琀开瘀愀氀甀攀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
               uom.unit AS Units਀ऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
  INNER JOIN doc_attr.doc_integer_field_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开椀渀琀开渀愀洀攀开椀搀  
		     =     val.doc_int_name_id਀   䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
          ON fieldname.unit_id = uom.unit_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀ऀ   唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀漀挀甀洀攀渀琀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            fieldname.attr_name    AS Name,਀ऀऀऀऀ瘀愀氀⸀愀琀琀爀开渀愀洀攀          䄀匀 嘀愀氀甀攀Ⰰ 
				''                     AS Units਀ऀऀ   䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
	 INNER JOIN doc_attr.doc_multi_select_attributes AS val਀ऀऀऀ 伀一    搀洀猀氀⸀搀漀挀开洀猀开氀椀猀琀开椀搀  
			    = val.doc_ms_list_id਀ऀऀऀ    䄀一䐀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀  
			    =    val.doc_ms_attr_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
			 ON  val.doc_ms_list_id ਀ऀऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀搀漀挀开洀猀开氀椀猀琀开椀搀 
		  WHERE dmsl.doc_id = @documentid਀ 
	   UNION ALL਀ 
      SELECT   'Document Radio Button' AS Type,਀ऀ            昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀    䄀匀 一愀洀攀Ⰰ 
				val.attr_name          AS Value,਀ऀऀऀऀ✀✀                     䄀匀 唀渀椀琀猀 
		   FROM doc_attr.doc_radio_button_links AS drbl਀ऀ 䤀一一䔀刀 䨀伀䤀一 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 瘀愀氀 
			 ON  drbl.doc_radiob_list_id ਀ऀऀऀ    㴀 瘀愀氀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
			    AND drbl.doc_radiob_attr_id ਀ऀऀऀ    㴀    瘀愀氀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
	 INNER JOIN doc_attr.doc_radio_button_list_names AS fieldname਀ऀऀऀ 伀一         瘀愀氀⸀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
			    = fieldname.doc_radiob_list_id਀ऀऀ  圀䠀䔀刀䔀 搀爀戀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀✀ 䄀匀 吀礀瀀攀Ⰰ 
	           fieldname.attr_name AS Name,਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀爀攀愀氀开瘀愀氀甀攀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
               uom.unit            AS Units਀ऀऀ䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
  INNER JOIN doc_attr.doc_real_number_field_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开爀攀愀氀开渀愀洀攀开椀搀  
		     =     val.doc_real_name_id਀   䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
          ON fieldname.unit_id = uom.unit_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            gfn.name       AS Name,਀ऀऀऀऀ瘀愀氀⸀渀愀洀攀       䄀匀 嘀愀氀甀攀Ⰰ 
				''             AS Units਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 搀琀昀氀 
	 INNER JOIN people.duty_functions AS val਀ऀऀऀ 伀一  搀琀昀氀⸀昀甀渀挀琀椀漀渀开椀搀  
			    = val.function_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
	         ON  dtfl.general_field_name_id਀ऀऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		  WHERE dtfl.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Duty Function List' AS Type,਀ऀ            最昀渀⸀渀愀洀攀       䄀匀 一愀洀攀Ⰰ 
				val.name       AS Value,਀ऀऀऀऀ✀✀                  䄀匀 唀渀椀琀猀 
		   FROM people.doc_to_function_list_links AS dtfll਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 瘀愀氀 
			 ON  dtfll.function_list_id ਀ऀऀऀ    㴀  瘀愀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
	 INNER JOIN people.general_field_names AS gfn਀ऀ         伀一 搀琀昀氀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			    = gfn.general_field_name_id਀ऀऀ  圀䠀䔀刀䔀 搀琀昀氀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀倀攀漀瀀氀攀 䰀椀猀琀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            gfn.name       AS Name,਀ऀऀऀऀ瘀愀氀⸀渀愀洀攀       䄀匀 嘀愀氀甀攀Ⰰ 
				''           AS Units਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 搀琀瀀氀氀 
	 INNER JOIN people.people_list_names AS val਀ऀऀऀ 伀一  搀琀瀀氀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
			    =  val.people_list_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
	         ON dtpll.general_field_name_id਀ऀऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		  WHERE dtpll.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Transaction Group'       AS Type,਀ऀ            ✀✀                       䄀匀 一愀洀攀Ⰰ 
			   (CONVERT(NVARCHAR(10), tg.transaction_group_id) + ' - ' + LEFT(tg.transaction_group_note, 25)) AS Value,਀ऀऀऀऀ✀✀                       䄀匀 唀渀椀琀猀 
		   FROM base.document_id_list AS dil਀ऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀 䄀匀 琀最 
	         ON  dil.transaction_group_id਀ऀऀऀ    㴀 琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
		  WHERE dil.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'ID Lock Status' AS Type,਀ऀ            ✀✀              䄀匀 一愀洀攀Ⰰ 
				val.lock_status AS Value,਀ऀऀऀऀ✀✀              䄀匀 唀渀椀琀猀 
		   FROM base.document_id_list AS val਀ऀऀ  圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀爀攀愀琀攀搀 䈀礀✀     䄀匀 吀礀瀀攀Ⰰ 
	            ''              AS Name,਀ऀऀऀऀ䤀匀一唀䰀䰀⠀瘀愀氀⸀挀爀攀愀琀攀搀开戀礀开甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
				''              AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 瘀愀氀 
		  WHERE val.doc_id = @documentid਀ 
        UNION ALL਀ 
      SELECT   'Created'     AS Type,਀ऀ            ✀✀           䄀匀 一愀洀攀Ⰰ 
				ISNULL(CONVERT(NVARCHAR(30), val.created, 120), '')  AS Value,਀ऀऀऀऀ✀✀           䄀匀 唀渀椀琀猀 
		   FROM base.document_id_list AS val਀ऀऀ  圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀吀愀最✀         䄀匀 吀礀瀀攀Ⰰ 
	            ''           AS Name,਀ऀऀऀऀ瘀愀氀⸀琀愀最开渀愀洀攀 䄀匀 嘀愀氀甀攀Ⰰ 
				''           AS Units਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 琀琀搀氀 
	 INNER JOIN tagging.doc_tags AS val਀ऀ            伀一  琀琀搀氀⸀琀愀最开椀搀 
				   = val.tag_id਀ऀऀ  圀䠀䔀刀䔀 琀琀搀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀爀漀猀猀 刀攀昀攀爀攀渀挀攀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            crt.attr_name    AS Name,਀ऀऀऀऀ搀挀爀⸀砀爀攀昀开搀漀挀开椀搀  䄀匀 嘀愀氀甀攀Ⰰ 
				''               AS Units਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀 䄀匀 搀挀爀 
	 INNER JOIN xref.cross_reference_types AS crt਀ऀ         伀一   搀挀爀⸀砀爀攀昀开琀礀瀀攀开椀搀  
			    = crt.xref_type_id਀ऀऀ  圀䠀䔀刀䔀 搀挀爀⸀猀漀甀爀挀攀开搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀爀漀猀猀 刀攀昀攀爀攀渀挀攀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            crt.attr_name    AS Name,਀ऀऀऀऀ搀挀爀⸀猀漀甀爀挀攀开搀漀挀开椀搀  䄀匀 嘀愀氀甀攀Ⰰ 
				''               AS Units਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀 䄀匀 搀挀爀 
	 INNER JOIN xref.cross_reference_types AS crt਀ऀ         伀一   搀挀爀⸀砀爀攀昀开琀礀瀀攀开椀搀  
			    = crt.xref_type_id਀ऀऀ  圀䠀䔀刀䔀 搀挀爀⸀砀爀攀昀开搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀✀    䄀匀 吀礀瀀攀Ⰰ 
	           ''                  AS Name,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 嘀愀氀甀攀Ⰰ 
               ''                  AS Units਀ऀऀ䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 瘀愀氀 
  INNER JOIN xref.doc_group_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀搀漀挀开最爀漀甀瀀开椀搀 
		     =     val.doc_group_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀漀渀琀爀漀氀氀攀爀 䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀✀ 䄀匀 吀礀瀀攀Ⰰ 
	           ''                  AS Name,਀ऀऀऀ   昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀 䄀匀 嘀愀氀甀攀Ⰰ 
               ''                  AS Units਀ऀऀ䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 瘀愀氀 
  INNER JOIN xref.controller_doc_group_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀 
		     =     val.controller_doc_group_name_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀ऀऀ⤀ 
਀    匀䔀䰀䔀䌀吀 ⨀ 䘀刀伀䴀 䐀漀挀䐀愀琀愀 
਀ 
			  ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_duty_fnctns_for_user]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 搀甀琀礀 昀甀渀挀琀椀漀渀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀⸀ 
-- Output is a list of duty functions, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists all duty functions from people.duty_functions which the connected user is linked to.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* -None਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 搀甀琀礀 昀甀渀挀琀椀漀渀 搀攀琀愀椀氀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_duty_fnctns_for_user] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 df.function_id             AS 'Duty Function ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 df.name                    AS 'Duty Function Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 df.list_position           AS 'List Position'਀ऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀   
       LEFT JOIN people.duty_function_sid_links AS dfsl਀ऀ          伀一      搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			      = dfsl.function_id਀ऀ   䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	          ON  dfsl.sid_id਀ऀऀऀ     㴀  猀氀⸀猀椀搀开椀搀 
	       WHERE sl.sid = @connectedusersid   			      ਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_duty_functions_by_sid]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 搀甀琀礀 昀甀渀挀琀椀漀渀猀 昀漀爀 愀 最椀瘀攀渀 猀椀搀 爀攀挀漀爀搀 椀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀⸀ 
-- Output is a list of records, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists duty functions for a given sid record id from people.duty_function_sid_links.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @sidrecordid਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 爀攀挀漀爀搀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_duty_functions_by_sid] ਀ 
     @sidrecordid bigint              = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 	 -- Validate @sidrecordid਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 猀椀搀 椀猀 瘀愀氀椀搀 
		 IF @sidrecordid = 0਀ऀऀ    匀䔀吀 䀀猀椀搀爀攀挀漀爀搀椀搀 㴀 一唀䰀䰀㬀 
		 IF @sidrecordid IS NULL ਀ऀऀ    䈀䔀䜀䤀一 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀唀猀攀爀匀椀搀䤀䐀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoUserSidID');	਀ऀऀऀ䔀一䐀 
		ELSE -- @sidrecordid is not NULL਀ऀऀ  䈀䔀䜀䤀一 
			   IF NOT EXISTS (SELECT sid_id ਀ऀऀऀऀ  ऀऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀  
								WHERE sid_id = @sidrecordid) ਀ऀऀऀऀ   䈀䔀䜀䤀一 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀猀攀爀䤀搀一漀琀䔀砀椀猀琀✀Ⰰ  
						  @message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ', ISNULL(CONVERT(nvarchar, @sidrecordid), 'NULL'), '.  ', @tempmessage);਀ऀऀऀऀऀ 䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UserIdNotExist');਀ऀऀऀऀ   䔀一䐀 
		   END਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT @sidrecordid                    AS 'User ID',਀ऀऀऀऀ 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀                䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ  
				 df.mnem                         AS 'Mnemonic',਀ऀऀऀऀ 搀昀⸀渀愀洀攀                         䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
				 df.description                  AS 'Description',਀ऀऀऀऀ 搀昀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀                䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
		         CONVERT(NVARCHAR(30), dfsl.created, 120) AS 'Created',਀ऀऀऀऀ 搀昀猀氀⸀最爀愀渀琀攀搀开戀礀                 䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ऀ 
		    FROM people.duty_function_sid_links AS dfsl਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
	          ON dfsl.function_id਀ऀऀऀऀ 㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		   WHERE dfsl.sid_id = @sidrecordid਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开攀甀氀愀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Returns the current end user license agreement.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀ 
CREATE PROCEDURE [reading].[usp_SEL_eula] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @eula nvarchar(max)              = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀ 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  匀䔀吀 䀀攀甀氀愀 㴀  
	    (SELECT TOP 1਀ऀऀ       攀⸀搀漀挀开挀漀渀琀攀渀琀 䄀匀 嘀愀氀甀攀 
		  FROM base.eula AS e਀ऀऀ 圀䠀䔀刀䔀 攀⸀猀琀愀琀甀猀 㴀 ✀䌀甀爀爀攀渀琀✀⤀ 
਀ 
	        ਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ 
	  END CATCH਀ 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 吀栀椀猀 瀀爀漀挀攀搀甀爀攀 爀攀愀搀猀 琀栀攀 挀漀渀琀攀渀琀猀 漀昀 愀 昀椀氀攀⸀ 
-- Input is the file ID.  Output is the binary file,਀ⴀⴀ 琀栀攀 昀椀氀攀渀愀洀攀Ⰰ 愀渀搀 愀 洀攀猀猀愀最攀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀崀 
਀    䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	@filename nvarchar(255)          = NULL OUTPUT,਀ऀ䀀昀椀氀攀猀椀稀攀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
    @message nvarchar(1000)          = NULL OUTPUT,਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀ऀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. 		਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀         㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@sidid bigint                            = NULL,  ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
  IF @fileid IS NULL਀     䈀䔀䜀䤀一 
	   SET @data_validation_status = 'Fail';਀ऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
       EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
	        @message_text = @tempmessage OUTPUT;਀  ऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ   䔀䰀匀䔀   
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀ 䔀一䐀 
  ELSE਀     䈀䔀䜀䤀一 ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
			EXEC [internal].[usp_AUTHENTICATE_user_file_id] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀ                    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 椀昀 昀椀氀攀 椀搀 攀砀椀猀琀猀 
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	  ELSE  ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
	END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀渀愀洀攀Ⰰ 昀椀氀攀 猀椀稀攀 愀渀搀 挀漀渀琀攀渀琀⸀  伀琀栀攀爀 洀攀琀愀搀愀琀愀 挀愀渀 戀攀 爀攀琀爀椀攀瘀攀搀 攀氀猀攀眀栀攀爀攀⸀   
-- Select the filename and file size separate from the content so that they will be in a separate਀ⴀⴀ 挀甀爀猀漀爀 攀氀攀洀攀渀琀⸀  吀栀椀猀 爀攀搀甀挀攀猀 琀栀攀 爀椀猀欀 琀栀愀琀 愀渀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀漀最爀愀洀洀椀渀最 攀爀爀漀爀 眀椀氀氀 
-- embed the metadata into the file content.  It is expected that the transaction load on਀ⴀⴀ 琀栀椀猀 搀愀琀愀戀愀猀攀 眀椀氀氀 最攀渀攀爀愀氀氀礀 戀攀 氀漀眀⸀ 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀      䈀䔀䜀䤀一 吀刀夀 
	  ਀  ⴀⴀ 匀攀氀攀挀琀 琀栀攀 匀䤀䐀 䤀䐀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	  SELECT @sidid = sl.sid_id਀ऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	   WHERE sl.sid = @connectedusersid;਀ 
		   SELECT @filename = filename,਀ऀऀ          䀀昀椀氀攀猀椀稀攀 㴀 昀椀氀攀开猀椀稀攀 
			 FROM base.file_metadata਀ऀऀऀ圀䠀䔀刀䔀 昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀 
਀           䤀䘀 䀀昀椀氀攀渀愀洀攀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀渀愀洀攀 㴀 ✀✀ ⴀⴀ 䤀昀 琀栀攀 昀椀氀攀开渀愀洀攀 昀椀攀氀搀 眀愀猀 一唀䰀䰀 漀爀 攀洀瀀琀礀 琀栀攀渀 猀甀戀猀琀椀琀甀琀攀 琀栀攀 昀椀氀攀 椀搀⸀ 
			    SET @filename = CONCAT('FileID', CONVERT(nvarchar(255),@fileid), '.unknown');਀ 
	   --   Write an entry in the file read log if it is enabled.਀ऀ  䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最猀最⸀昀椀氀攀开爀攀愀搀开氀漀最  
	               FROM base.global_settings_groups AS gsg਀ऀऀ          圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
				    AND gsg.file_read_log = 'On')਀ऀऀ   䈀䔀䜀䤀一 
		     INSERT INTO base.file_read_log਀ऀऀऀ             ⠀昀椀氀攀开椀搀Ⰰ  昀椀氀攀渀愀洀攀Ⰰ  爀攀愀搀开戀礀开猀椀搀开椀搀⤀ 
				  VALUES (@fileid, @filename, @sidid)  -- read_by_username is populated by the table column binding to (original_login())਀ 
		   END਀ 
           SELECT file_content AS 'File Content' ਀             䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开猀琀漀爀愀最攀  
	        WHERE file_id = @fileid;਀ 
	   IF @@ROWCOUNT > 0 -- If rowcount = 0 the TRY will still not be failed਀ऀ      䈀䔀䜀䤀一 
	         EXEC internal.usp_SEL_message ਀                  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ 
                  @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀   
			   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ         匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ      䔀一䐀 
	   ELSE਀ऀ      䈀䔀䜀䤀一 
            SET @transaction_status = 'Bad';਀           䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                @message_id   = 'NotExist',਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀  
  	         IF @tempmessage IS NOT NULL ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE  ਀ऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		  END਀ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀ 
	END -- End if transaction ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_date_values_by_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Lists date values for a file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 
-- Output is the list of dates, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_date_values_by_file] ਀  
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)   = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)   = '', -- Communicates that zero records were retrieved਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀                㴀 ✀搀洀礀✀Ⰰ 
		@datestyle int                      = 105,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @fileinvalidmessage = 'File ID: ' + CONVERT(nvarchar(20), @fileid) + '.  ' + @tempmessage;਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀  ⴀⴀ 匀攀琀 琀栀攀 搀愀琀攀 猀琀礀氀攀 
਀  匀䔀吀 䀀搀愀琀攀猀琀礀氀攀 㴀 ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䄀匀 ✀䐀愀琀攀 匀琀礀氀攀✀ 
                      FROM base.global_settings_groups AS gsg਀ऀऀ             圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                                       䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ       
			        ISNULL(fdfn.attr_name, '')                    AS 'File Date Field Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀搀昀渀⸀洀渀攀洀Ⰰ ✀✀⤀                         䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(fdfn.descr, '')                        AS 'Description',਀                    䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀Ⰰ 昀搀瘀⸀搀愀琀攀开瘀愀氀甀攀Ⰰ 䀀搀愀琀攀猀琀礀氀攀⤀ 䄀匀 ✀䐀愀琀攀✀Ⰰ 
			        fdfn.file_date_name_id                        AS 'File Date Field Name ID'਀ऀ           䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀搀昀渀 
		 INNER JOIN file_attr.file_date_values AS fdv਀ऀऀऀऀ 伀一    昀搀瘀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
				    = fdfn.file_date_name_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
				 ON    fm.file_id ਀ऀऀऀऀ    㴀 昀搀瘀⸀昀椀氀攀开椀搀 
			  WHERE fm.file_id = @fileid਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䘀椀氀攀 䐀愀琀攀 䘀椀攀氀搀 一愀洀攀✀㬀 
  		IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @zerorecordsmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@fileinvalidmessage <> '')         SET @message = @message + ' | ' + @fileinvalidmessage;਀    䤀䘀 ⠀䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_details]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ　㤀ⴀ㈀　㈀㔀 
-- This procedure reads the data and the thumbnail for a single file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 䤀䐀 愀渀搀 昀漀爀洀 䤀䐀⸀  伀甀琀瀀甀琀 椀猀 琀栀攀 搀愀琀愀Ⰰ 琀栀甀洀戀渀愀椀氀Ⰰ 
-- the filename, and a message.  Corresponds to reading.usp_SEL_document_details.   ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开搀攀琀愀椀氀猀崀 
਀ऀ  䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	  @thumbnail varbinary(max)        = NULL OUTPUT,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	@transactionmessage nvarchar(300)  = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username ਀ऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. 		਀ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
   -- Check that the file id exists.  Fail if it doesn't.਀  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
     SET @fileid = NULL;਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	   ELSE  ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
	 END਀  䔀䰀匀䔀 
     BEGIN 	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
		                    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
	 END   -- End checking if file id exists਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀圀䤀吀䠀 䘀椀氀攀䐀愀琀愀 䄀匀 ⠀ 
਀      匀䔀䰀䔀䌀吀   ✀䘀椀氀攀渀愀洀攀✀  䄀匀 吀礀瀀攀Ⰰ 
	            ''         AS Name,਀ऀऀऀ   昀洀⸀昀椀氀攀渀愀洀攀 䄀匀 嘀愀氀甀攀Ⰰ 
				''         AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
		  WHERE fm.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Common Object Multi-Select' AS Type,਀ऀ            挀漀氀渀⸀氀椀猀琀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
				co.object_name AS Value,਀ऀऀऀऀ✀✀             䄀匀 唀渀椀琀猀 
		   FROM com_obj.file_to_com_obj_ms_list_links AS comsll਀ऀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
			 ON      col.common_object_list_id ਀ऀऀऀ    㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			    AND  col.common_object_id ਀ऀऀऀऀ㴀 挀漀洀猀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
	 INNER JOIN com_obj.common_object_list_names AS coln਀ऀऀऀ 伀一  挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
			    = col.common_object_list_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 挀漀 
	 		 ON    co.common_object_id ਀ऀऀऀ    㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
		  WHERE comsll.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Common Object Radio Button' AS Type,਀ऀ            挀漀氀渀⸀氀椀猀琀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
				co.object_name AS Value,਀ऀऀऀऀ✀✀             䄀匀 唀渀椀琀猀 
		FROM com_obj.file_to_com_obj_radiob_links AS comrbl਀  䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀  
	  	  ON      col.common_object_list_id ਀ऀऀ     㴀 挀漀洀爀戀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
		     AND  col.common_object_id ਀ऀऀऀ 㴀 挀漀洀爀戀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
  INNER JOIN com_obj.common_object_list_names AS coln਀ऀ  ऀ  伀一  挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		     = col.common_object_list_id਀  䤀一一䔀刀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀 䄀匀 挀漀 
		  ON    co.common_object_id ਀ऀऀ     㴀 挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
	   WHERE comrbl.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Date Field'          AS Type,਀ऀ           昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀   䄀匀 一愀洀攀Ⰰ 
               CONVERT(NVARCHAR(30), val.date_value, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀⤀   䄀匀 嘀愀氀甀攀Ⰰ 
				''             AS Units਀ऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
  INNER JOIN file_attr.file_date_field_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
		     =     val.file_date_name_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䘀爀攀攀 吀攀砀琀 䘀椀攀氀搀✀   䄀匀 吀礀瀀攀Ⰰ 
	           fieldname.attr_name AS Name,਀               瘀愀氀⸀琀攀砀琀开瘀愀氀甀攀      䄀匀 嘀愀氀甀攀Ⰰ 
				''                 AS Units਀ऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
  INNER JOIN file_attr.file_free_text_field_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
		     =     val.file_free_text_name_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䤀渀琀攀最攀爀 䘀椀攀氀搀✀     䄀匀 吀礀瀀攀Ⰰ 
	           fieldname.attr_name AS Name,਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀椀渀琀开瘀愀氀甀攀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
               uom.unit AS Units਀ऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
  INNER JOIN file_attr.file_integer_field_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
		     =     val.file_int_name_id਀   䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
          ON fieldname.unit_id = uom.unit_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀ऀ   唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            fieldname.attr_name    AS Name,਀ऀऀऀऀ瘀愀氀⸀愀琀琀爀开渀愀洀攀          䄀匀 嘀愀氀甀攀Ⰰ 
				''                     AS Units਀ऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 昀洀猀氀 
	 INNER JOIN file_attr.file_multi_select_attributes AS val਀ऀऀऀ 伀一    昀洀猀氀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀  
			    = val.file_ms_list_id਀ऀऀऀ    䄀一䐀 昀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀  
			    =    val.file_ms_attr_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀椀攀氀搀渀愀洀攀 
			 ON  val.file_ms_list_id ਀ऀऀऀ    㴀 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
		  WHERE fmsl.file_id = @fileid਀ 
	   UNION ALL਀ 
      SELECT   'File Radio Button' AS Type,਀ऀ            昀椀攀氀搀渀愀洀攀⸀愀琀琀爀开渀愀洀攀    䄀匀 一愀洀攀Ⰰ 
				val.attr_name          AS Value,਀ऀऀऀऀ✀✀                     䄀匀 唀渀椀琀猀 
		   FROM file_attr.file_radio_button_links AS frbl਀ऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 瘀愀氀 
			 ON  frbl.file_radiob_list_id ਀ऀऀऀ    㴀 瘀愀氀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
			    AND frbl.file_radiob_attr_id ਀ऀऀऀ    㴀    瘀愀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
	 INNER JOIN file_attr.file_radio_button_list_names AS fieldname਀ऀऀऀ 伀一         瘀愀氀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀  
			    = fieldname.file_radiob_list_id਀ऀऀ  圀䠀䔀刀䔀 昀爀戀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀✀ 䄀匀 吀礀瀀攀Ⰰ 
	           fieldname.attr_name AS Name,਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㄀　⤀Ⰰ 瘀愀氀⸀爀攀愀氀开瘀愀氀甀攀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
               uom.unit            AS Units਀ऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀 䄀匀 瘀愀氀 
  INNER JOIN file_attr.file_real_number_field_names AS fieldname ਀ऀ  ऀ  伀一 昀椀攀氀搀渀愀洀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
		     =     val.file_real_name_id਀   䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀 䄀匀 甀漀洀  
          ON fieldname.unit_id = uom.unit_id਀ऀ   圀䠀䔀刀䔀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            gfn.name       AS Name,਀ऀऀऀऀ瘀愀氀⸀渀愀洀攀       䄀匀 嘀愀氀甀攀Ⰰ 
				''             AS Units਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 昀琀昀氀 
	 INNER JOIN people.duty_functions AS val਀ऀऀऀ 伀一  昀琀昀氀⸀昀甀渀挀琀椀漀渀开椀搀  
			    = val.function_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
	         ON  ftfl.general_field_name_id਀ऀऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		  WHERE ftfl.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Duty Function List' AS Type,਀ऀ            最昀渀⸀渀愀洀攀            䄀匀 一愀洀攀Ⰰ 
				val.name            AS Value,਀ऀऀऀऀ✀✀                  䄀匀 唀渀椀琀猀 
		   FROM people.file_to_function_list_links AS ftfll਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 瘀愀氀 
			 ON  ftfll.function_list_id ਀ऀऀऀ    㴀  瘀愀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
	 INNER JOIN people.general_field_names AS gfn਀ऀ         伀一 昀琀昀氀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			    = gfn.general_field_name_id਀ऀऀ  圀䠀䔀刀䔀 昀琀昀氀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀倀攀漀瀀氀攀 䰀椀猀琀✀ 䄀匀 吀礀瀀攀Ⰰ 
	            gfn.name     AS Name,਀ऀऀऀऀ瘀愀氀⸀渀愀洀攀     䄀匀 嘀愀氀甀攀Ⰰ 
				''           AS Units਀ऀऀ   䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀琀瀀氀氀 
	 INNER JOIN people.people_list_names AS val਀ऀऀऀ 伀一  昀琀瀀氀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
			    =  val.people_list_id਀ऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
	         ON ftpll.general_field_name_id਀ऀऀऀ    㴀 最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		  WHERE ftpll.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'File Group'   AS Type,਀ऀ            昀最渀⸀愀琀琀爀开渀愀洀攀 䄀匀 一愀洀攀Ⰰ 
				''            AS Value,਀ऀऀऀऀ✀✀            䄀匀 唀渀椀琀猀 
		   FROM xref.file_group_links as fgl਀ऀ 䤀一一䔀刀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 愀猀 昀最渀 
			 ON    fgl.file_group_id ਀ऀऀऀ    㴀  昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
		  WHERE fgl.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Transaction Group'       AS Type,਀ऀ            ✀✀                       䄀匀 一愀洀攀Ⰰ 
			   (CONVERT(NVARCHAR(10), tg.transaction_group_id) + ' - ' + LEFT(tg.transaction_group_note, 25)) AS Value,਀ऀऀऀऀ✀✀                       䄀匀 唀渀椀琀猀 
		   FROM base.file_metadata AS fm਀ऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀 䄀匀 琀最 
	         ON   fm.transaction_group_id਀ऀऀऀ    㴀 琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 
		  WHERE fm.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Created By'     AS Type,਀ऀ            ✀✀              䄀匀 一愀洀攀Ⰰ 
				ISNULL(val.created_by_username, '') AS Value,਀ऀऀऀऀ✀✀              䄀匀 唀渀椀琀猀 
		   FROM base.file_metadata AS val਀ऀऀ  圀䠀䔀刀䔀 瘀愀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀        唀一䤀伀一 䄀䰀䰀 
਀      匀䔀䰀䔀䌀吀   ✀䌀爀攀愀琀攀搀✀     䄀匀 吀礀瀀攀Ⰰ 
	            ''           AS Name,਀ऀऀऀऀ䤀匀一唀䰀䰀⠀䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瘀愀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀Ⰰ ✀✀⤀  䄀匀 嘀愀氀甀攀Ⰰ 
				''           AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 瘀愀氀 
		  WHERE val.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'Retention Date'       AS Type,਀ऀ            ✀✀                    䄀匀 一愀洀攀Ⰰ 
               ISNULL(CONVERT(NVARCHAR(30), fm.retention_date, ਀                    ⠀匀䔀䰀䔀䌀吀 搀愀琀攀开猀琀礀氀攀 䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 圀䠀䔀刀䔀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀䄀匀吀䔀刀✀⤀⤀Ⰰ ✀✀⤀   䄀匀 嘀愀氀甀攀Ⰰ 
				''                       AS Units਀ऀऀ   䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
		  WHERE fm.file_id = @fileid਀ 
        UNION ALL਀ 
      SELECT   'File Size'   AS Type,਀ऀ            ✀✀           䄀匀 一愀洀攀Ⰰ 
			   CONVERT(NVARCHAR(20), fm.file_size) AS Value,਀ऀऀऀऀ✀䈀礀琀攀猀✀      䄀匀 唀渀椀琀猀 
		   FROM base.file_metadata AS fm਀ऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
਀ 
		)਀ 
    SELECT * FROM FileData਀ 
਀ऀऀ   
		  SELECT @thumbnail = ft.thumbnail਀ऀऀ    䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀 䄀匀 昀琀 
		   WHERE ft.file_id = @fileid;਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
਀ऀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 最爀漀甀瀀 渀愀洀攀 爀攀挀漀爀搀猀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_group_names]਀ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀   
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	         attr_name               AS 'File Group Name',਀ऀ         䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(descr, '')       AS 'Description',਀ऀऀऀ 昀椀氀攀开最爀漀甀瀀开椀搀           䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
			 list_position           AS 'List Position'਀ऀ    䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 
    ORDER BY 'List Position';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_group_names_rstr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Selects all file group names which are linked to the connected user਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀开爀猀琀爀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT  -- Transaction status passed back to the application਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
        @usersid  varbinary(100) = SUSER_SID(ORIGINAL_LOGIN()); -- The SID of the connected user਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀   
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
	         attr_name             AS 'File Group Name',਀ऀ         䤀匀一唀䰀䰀⠀昀最渀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(fgn.descr, '') AS 'Description',਀ऀऀऀ 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
			 fgn.list_position     AS 'List Position'਀ऀ    䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
਀         䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀 ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 
		        ON      fgn.file_group_id਀ऀऀऀऀ   㴀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
        INNER JOIN people.function_lists AS fl਀                伀一 昀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
				     = fl.function_list_id਀        䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
                ON   fl.function_id ਀ऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
        INNER JOIN people.duty_function_sid_links AS dfsl਀                伀一     搀昀⸀昀甀渀挀琀椀漀渀开椀搀  
				   = dfsl.function_id਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                ON dfsl.sid_id ਀ऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
             WHERE sl.sid = @usersid ਀  ऀऀऀ             
        UNION਀ऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
	         attr_name             AS 'File Group Name',਀ऀ         䤀匀一唀䰀䰀⠀昀最渀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(fgn.descr, '') AS 'Description',਀ऀऀऀ 昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
			 fgn.list_position     AS 'List Position'਀ऀ    䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
਀         䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开瀀瀀氀开氀猀琀 䄀匀 昀最攀瀀瀀氀 ⴀⴀ 䌀栀攀挀欀 琀栀爀漀甀最栀 瀀攀漀瀀氀攀 氀椀猀琀猀 
		        ON      fgn.file_group_id਀ऀऀऀऀ   㴀 昀最攀瀀瀀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
        INNER JOIN people.people_lists AS pl਀                伀一  昀最攀瀀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀  
				   =    pl.people_list_id਀        䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
                ON   pl.sid_id ਀ऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
             WHERE sl.sid = @usersid਀  ऀऀऀ         
਀    伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		       SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀漀甀瀀猀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Reads file groups from xref.file_group_links for a given file id.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 䤀䐀⸀   
-- Output is a list of file group details, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Reads file groups from xref.file_group_links for a given file id.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @fileid bigint  Must be a non-null and non-empty valid identifier.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀椀氀攀 最爀漀甀瀀 搀攀琀愀椀氀猀 
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 䘀愀椀氀㨀 刀攀琀甀爀渀猀 洀攀猀猀愀最攀猀 昀漀爀 洀椀猀猀椀渀最 漀爀 椀渀瘀愀氀椀搀 昀椀氀攀 最爀漀甀瀀 䤀䐀⸀ 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀椀氀攀椀搀 洀甀猀琀 戀攀 瀀爀漀瘀椀搀攀搀 愀渀搀 戀攀 瘀愀氀椀搀 
* - The connected user must have viewing permission for the file਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开最爀漀甀瀀猀开戀礀开昀椀氀攀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)  = '',     -- Status of authorisation for the connected user to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ  
	 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 椀搀 
	  IF @fileid = 0  ਀ऀऀ 匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
	  IF @fileid IS NULL -- Check if a file id was supplied਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀✀⤀㬀 
		 END -- End responding to no file id supplied਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀   
		 BEGIN	-- Check if the file id exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status    = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀         㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid),  '.  ',  @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
				            SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist');਀ऀऀऀऀऀ䔀一䐀 
		 END   -- End checking if file id is valid and the user has permission to access it਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
	     SELECT @fileid                  AS 'File ID',਀ऀऀ        昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀        䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
                ISNULL(fgn.mnem, '')     AS 'Mnemonic',਀ऀऀऀऀ昀最渀⸀愀琀琀爀开渀愀洀攀            䄀匀 ✀䘀椀氀攀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(fgn.descr, '')    AS 'Description',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最氀⸀渀漀琀攀猀Ⰰ ✀✀⤀    䄀匀 ✀刀攀挀漀爀搀 一漀琀攀猀✀Ⰰ 
				list_position            AS 'List Position'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀  䄀匀 昀最渀 
	 INNER JOIN xref.file_group_links AS fgl਀ऀ         伀一   昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
			    = fgl.file_group_id਀ऀऀ  圀䠀䔀刀䔀 昀最氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
	   ORDER BY 'List Position';਀ऀऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_int_values_by_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Lists integer values for a file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 
-- Output is the list of the integer value, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_int_values_by_file] ਀ 
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)   = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)   = '', -- Communicates that zero records were retrieved਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN 	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @fileinvalidmessage = 'File ID: ' + CONVERT(nvarchar(20), @fileid) + '.  ' + @tempmessage;਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT @fileid                AS 'File ID',਀ऀऀऀ        昀椀昀渀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  䄀匀 ✀䘀椀氀攀 䤀渀琀攀最攀爀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀Ⰰ 
			        fifn.attr_name         AS 'File Integer Field Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀椀昀渀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ISNULL(fifn.descr, '') AS 'Description',਀ऀऀऀऀऀ昀椀瘀⸀椀渀琀开瘀愀氀甀攀          䄀匀 ✀䤀渀琀攀最攀爀 嘀愀氀甀攀✀Ⰰ 
		            ISNULL(uom.unit, '')   AS 'Units'਀ऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀椀昀渀 
		 INNER JOIN file_attr.file_integer_values AS fiv਀ऀऀऀऀ 伀一    昀椀瘀⸀昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
				    = fifn.file_int_name_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
				 ON     fm.file_id ਀ऀऀऀऀ     㴀 昀椀瘀⸀昀椀氀攀开椀搀 
		 LEFT JOIN base.units_of_measure AS uom਀ऀऀ         伀一  昀椀昀渀⸀甀渀椀琀开椀搀  
				   =  uom.unit_id਀ऀऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		   ORDER BY 'File Integer Field Name';਀  ऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nofileidmessage <> '')            SET @message = @message + ' | ' + @nofileidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_ms_attr_by_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists the multi-select attributes for a file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 
-- Output is the list of attributes, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_ms_attr_by_file] ਀ 
	 @fileid bigint	                  = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)   = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)   = '', -- Communicates that zero records were retrieved਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                          -- or alternatively if the file does not exist.  The result does not distinguish either. 	਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @fileinvalidmessage = 'File ID: ' + CONVERT(nvarchar(20), @fileid) + '.  ' + @tempmessage;਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                 䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
			        fmsl.file_ms_list_id    AS 'File Multi-Select List ID',਀                    昀洀猀氀渀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ 
					ISNULL(fmsln.mnem, '')  AS 'Attribute Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀洀猀氀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					fmsl.file_ms_attr_id    AS 'File Multi-Select Attribute ID',਀ऀऀऀऀऀ昀洀猀愀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀ 
			   FROM file_attr.file_multi_select_links AS fmsl਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀洀猀氀渀 
				 ON    fmsl.file_ms_list_id ਀ऀऀऀऀ    㴀 昀洀猀氀渀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
		 INNER JOIN file_attr.file_multi_select_attributes AS fmsa਀ऀऀऀऀ 伀一   昀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀  
				    = fmsa.file_ms_attr_id਀ऀऀऀ  圀䠀䔀刀䔀 昀洀猀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		   ORDER BY 'File Multi-Select Attribute Name';਀  ऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nofileidmessage <> '')            SET @message = @message + ' | ' + @nofileidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_ms_attr_by_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists multi-select attributes by list name਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_ms_attr_by_list] ਀ 
  @file_mslistid bigint            = NULL,਀  䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@file_ms_listname nvarchar(50)	    = '', -- The name value from the file radio button list name id. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)   = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
  IF @file_mslistid = 0 ਀     匀䔀吀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
  IF @file_mslistid IS NULL਀     䈀䔀䜀䤀一 
         SET @data_validation_status = 'Fail';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
		      @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrListID.');਀ऀ  䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
  IF @file_mslistid IS NOT NULL਀     䈀䔀䜀䤀一   
         IF NOT EXISTS (SELECT file_ms_list_id਀                          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀  
                         WHERE file_ms_list_id = @file_mslistid) ਀             䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrListNameNotExist.');਀ऀ         䔀一䐀 
	 END ਀ 
਀  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀      䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ  䔀䰀匀䔀  
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀ䔀一䐀 
  -- End data validation਀   
  -- Execute the query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
     BEGIN਀       䈀䔀䜀䤀一 吀刀夀 
	        SELECT ਀ऀ               昀洀猀愀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀     䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
	               ISNULL(fmsa.mnem, '')    AS Mnemonic, ਀ऀऀ     ऀ   昀洀猀愀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ  
	               ISNULL(fmsa.descr, '')   AS Description, ਀ऀ               昀洀猀愀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	          FROM file_attr.file_multi_select_attributes AS fmsa਀ऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀开洀猀氀椀猀琀椀搀 
		  ORDER BY 'List Position', 'File Multi-Select Attribute Name';਀  ऀ         䤀䘀 ⠀䀀䀀刀伀圀䌀伀唀一吀 㴀 　⤀ 
	           BEGIN਀ऀ             䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                      @message_id   = 'ZeroRecords', ਀                      䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	              IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				  ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
		       END਀ऀ         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                  @message_id   = 'Success', ਀                  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	         IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	         SET @transaction_status = 'Good';਀       䔀一䐀 吀刀夀 
       BEGIN CATCH਀             匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
             EXEC internal.usp_SEL_message ਀                  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
                  @message_text = @tempmessage OUTPUT;਀ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			   SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
			 ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
       END CATCH਀ऀ 䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开洀猀开愀琀琀爀开昀最开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䰀椀猀琀猀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀猀⸀ 
-- Output is a list of attribute-filter group pairs, message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_ms_attr_fg_links]਀      
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username exctracted from   ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT fmsafl.file_ms_attr_id AS 'File Multi-Select Attribute ID',਀ऀऀ        昀洀猀愀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				ISNULL(fmsa.mnem, '')  AS 'Attribute Mnemonic',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀洀猀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		        fmsafl.filter_group_id AS 'Filter Group ID',਀                昀最⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(fg.mnem, '')    AS 'Filter Group Mnemonic',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM file_attr.file_ms_attr_fgroup_links AS fmsafl਀ऀऀ   䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀洀猀愀 
		     ON fmsafl.file_ms_attr_id਀ऀऀऀ    㴀 昀洀猀愀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
		   JOIN forms.filter_groups AS fg਀ऀऀ     伀一 昀洀猀愀昀氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
			    =   fg.filter_group_id;			਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开洀猀开氀椀猀琀开渀漀琀开氀椀渀欀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 21-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 渀愀洀攀猀 昀漀爀 愀 昀椀氀攀 
-- which are not already linked to the file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 
-- Output is the list of attributes, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_ms_list_not_linkd] ਀ 
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)  = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records were retrieved਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @fileinvalidmessage = 'File ID: ' + CONVERT(nvarchar(20), @fileid) + '.  ' + @tempmessage;਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                 䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			        fmsln.file_ms_list_id   AS 'File Multi-Select List ID',਀ऀऀऀ        昀洀猀氀渀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀氀攀 䴀甀氀琀椀ⴀ匀攀氀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ 
					ISNULL(fmsln.mnem, '')  AS 'Attribute Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀洀猀氀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					fmsln.list_position     AS 'List Position'਀ऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀洀猀氀渀 
			  WHERE NOT EXISTS਀ऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 昀洀猀氀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀 
					   FROM file_attr.file_multi_select_links AS fmsl਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀洀猀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
							AND    fmsl.file_ms_list_id ਀ऀऀऀऀऀऀऀ    㴀 昀洀猀氀渀⸀昀椀氀攀开洀猀开氀椀猀琀开椀搀⤀㬀 
  		IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @zerorecordsmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@fileinvalidmessage <> '')          SET @message = @message + ' | ' + @fileinvalidmessage;਀    䤀䘀 ⠀䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开戀礀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 02-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀猀 戀礀 氀椀猀琀 渀愀洀攀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开戀礀开氀椀猀琀崀  
਀  䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@zerorecordsmessage nvarchar(200)   = '', -- Communicates that zero records where retrieved਀ऀऀ䀀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ऀ㴀 ✀✀Ⰰ ⴀⴀ 吀栀攀 渀愀洀攀 瘀愀氀甀攀 昀爀漀洀 琀栀攀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀⸀  
		@rblistnameidinvalid nvarchar(200)  = '', -- Communicates that the file radio button name list id is invalid਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)   = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
  IF @file_radioblistid = 0 ਀     匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
  IF @file_radioblistid IS NULL਀     䈀䔀䜀䤀一 
         SET @data_validation_status = 'Fail';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䰀椀猀琀䤀䐀✀Ⰰ  
		      @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @rblistnameidinvalid = @tempmessage;਀ऀ     䔀䰀匀䔀  
		    SET @rblistnameidinvalid = 'A database level message error occurred on NoAttrListID.';਀ऀ  䔀一䐀 
਀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 攀砀椀猀琀猀  
  IF @file_radioblistid IS NOT NULL਀     䈀䔀䜀䤀一   
         IF NOT EXISTS (SELECT file_radiob_list_id਀                          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀  
                         WHERE file_radiob_list_id = @file_radioblistid) ਀             䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	              SET @rblistnameidinvalid = @tempmessage;਀ऀ           䔀䰀匀䔀  
				    SET @rblistnameidinvalid = 'A database level message error occurred on NotExist.';਀ऀ         䔀一䐀 
	 END ਀ 
਀ 
  -- Output the data validation status failed message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF (@tempmessage IS NOT NULL) ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  ਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀     䈀䔀䜀䤀一 
       BEGIN TRY਀             匀䔀䰀䔀䌀吀 
	                frba.file_radiob_attr_id AS 'File Radio Button Attribute ID', ਀ऀ                䤀匀一唀䰀䰀⠀昀爀戀愀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 䴀渀攀洀漀渀椀挀Ⰰ  
		     	    frba.attr_name           AS 'File Radio Button Attribute Name', ਀ऀ                䤀匀一唀䰀䰀⠀昀爀戀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 䐀攀猀挀爀椀瀀琀椀漀渀Ⰰ  
	                frba.list_position       AS 'List Position'਀ऀ           䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀爀戀愀 
 	          WHERE frba.file_radiob_list_id = @file_radioblistid਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀㬀 
  	         IF (@@ROWCOUNT = 0)਀ऀ           䈀䔀䜀䤀一 
	             EXEC internal.usp_SEL_message ਀                      䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                      @message_text = @tempmessage OUTPUT;਀  ऀ              䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	                 SET @zerorecordsmessage = @tempmessage;਀ऀ              䔀䰀匀䔀  
		              SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀ       䔀一䐀 
	         EXEC internal.usp_SEL_message ਀                  䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
                  @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	            SET @transactionmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
		          SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ         匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
       END TRY਀       䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
             SET @transaction_status = 'Bad';਀             䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                  @message_id   = 'SelectError', ਀                  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	         IF @tempmessage IS NOT NULL ਀ऀऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		        CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀  ऀऀ     䔀䰀匀䔀  
		         SET @transactionmessage = 'A database level message error occurred on SelectError';਀       䔀一䐀 䌀䄀吀䌀䠀 
	 END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀爀戀氀椀猀琀渀愀洀攀椀搀椀渀瘀愀氀椀搀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀爀戀氀椀猀琀渀愀洀攀椀搀椀渀瘀愀氀椀搀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;	਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_rb_attr_by_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Lists the radio button attributes for a file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 
-- Output is the list of attributes, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_rb_attr_by_file] ਀ 
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)   = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)   = '', -- Communicates that zero records were retrieved਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                          -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @fileinvalidmessage = 'File ID: ' + CONVERT(nvarchar(20), @fileid) + '.  ' + @tempmessage;਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                  䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			        frbl.file_radiob_list_id AS 'File Radio Button List ID',਀ऀऀऀ        昀爀戀氀渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
					ISNULL(frbln.mnem, '')   AS 'Name Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀爀戀氀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀  䄀匀 ✀一愀洀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					frbl.file_radiob_attr_id AS 'File Radio Button Attribute ID',਀ऀऀऀऀऀ昀爀戀愀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
					ISNULL(frba.mnem, '')    AS 'Attribute Value Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀爀戀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀䄀琀琀爀椀戀甀琀攀 嘀愀氀甀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
			   FROM file_attr.file_radio_button_links AS frbl਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀爀戀氀渀 
				 ON frbl.file_radiob_list_id = frbln.file_radiob_list_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀爀戀愀 
				 ON frbl.file_radiob_attr_id = frba.file_radiob_attr_id਀ऀऀऀ  圀䠀䔀刀䔀 昀爀戀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀 
  		IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @zerorecordsmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@fileinvalidmessage <> '')          SET @message = @message + ' | ' + @fileinvalidmessage;਀    䤀䘀 ⠀䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开爀戀开愀琀琀爀开昀最开氀椀渀欀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀 䰀椀猀琀猀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀猀⸀ 
-- Output is a list of attribute-filter group pairs, message and transaction status਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_rb_attr_fg_links]਀      
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ऀ䐀䔀䌀䰀䄀刀䔀 
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username  ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT frbafl.file_radiob_attr_id AS 'File Radio Button Attribute ID',਀ऀऀ        昀爀戀愀⸀愀琀琀爀开渀愀洀攀             䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
			    ISNULL(frba.mnem, '')      AS 'Attribute Value Mnemonic',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀爀戀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀     䄀匀 ✀䄀琀琀爀椀戀甀琀攀 嘀愀氀甀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		        frbafl.filter_group_id     AS 'Filter Group ID',਀                昀最⸀愀琀琀爀开渀愀洀攀               䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(fg.mnem, '')        AS 'Filter Group Mnemonic',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀最⸀搀攀猀挀爀Ⰰ ✀✀⤀       䄀匀 ✀䘀椀氀琀攀爀 䜀爀漀甀瀀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM file_attr.file_radiob_attr_fgroup_links AS frbafl਀ऀऀ   䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀 䄀匀 昀爀戀愀 
		     ON frbafl.file_radiob_attr_id਀ऀऀऀ    㴀 昀爀戀愀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
		   JOIN forms.filter_groups AS fg਀ऀऀ     伀一 昀爀戀愀昀氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 
			    =   fg.filter_group_id;			਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	          IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		   SET @message = CONCAT(' | ', @message, ' | ', @tempmessage, ' | ', ਀ऀऀ   䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀开爀戀开氀椀猀琀开渀漀琀开氀椀渀欀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀猀 昀漀爀 愀 昀椀氀攀 
-- which are not already linked to the file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 
-- Output is the list of attributes, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_rb_list_not_linkd] ਀ 
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)  = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records were retrieved਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @fileinvalidmessage = 'File ID: ' + CONVERT(nvarchar(20), @fileid) + '.  ' + @tempmessage;਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ 匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀                   䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			        frbln.file_radiob_list_id AS 'File Radio Button List ID',਀ऀऀऀ        昀爀戀氀渀⸀愀琀琀爀开渀愀洀攀           䄀匀 ✀䘀椀氀攀 刀愀搀椀漀 䈀甀琀琀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
					ISNULL(frbln.mnem, '')    AS 'Attribute Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀爀戀氀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					frbln.list_position       AS 'List Position'਀ऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀爀戀氀渀 
			  WHERE NOT EXISTS਀ऀऀऀऀऀ⠀匀䔀䰀䔀䌀吀 昀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 
					   FROM file_attr.file_radio_button_links AS frbl਀ऀऀऀऀऀ  圀䠀䔀刀䔀 昀爀戀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
							AND    frbl.file_radiob_list_id ਀ऀऀऀऀऀऀऀ    㴀 昀爀戀氀渀⸀昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀⤀㬀 
  		IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @zerorecordsmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@fileinvalidmessage <> '')          SET @message = @message + ' | ' + @fileinvalidmessage;਀    䤀䘀 ⠀䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀             匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_real_values_by_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Lists real number values for a file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 
-- Output is the list of the integer value, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_real_values_by_file] ਀ 
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)  = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)  = '', -- Communicates that zero records were retrieved਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @fileinvalidmessage = 'File ID: ' + CONVERT(nvarchar(20), @fileid) + '.  ' + @tempmessage;਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT @fileid                 AS 'File ID',਀ऀऀऀ        昀爀渀昀渀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀氀攀 刀攀愀氀 一甀洀戀攀爀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
			        ISNULL(frnfn.mnem, '')  AS 'Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀爀渀昀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					real_value              AS 'Real Number Value',਀ऀऀ            䤀匀一唀䰀䰀⠀甀漀洀⸀甀渀椀琀Ⰰ ✀✀⤀    䄀匀 ✀唀渀椀琀猀✀Ⰰ 
                    frnfn.file_real_name_id AS 'File Real Number Field Name ID'਀ऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀爀渀昀渀 
		 INNER JOIN file_attr.file_real_number_values AS frnv਀ऀऀऀऀ 伀一    昀爀渀瘀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀  
				    = frnfn.file_real_name_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
				 ON     fm.file_id ਀ऀऀऀऀ    㴀 昀爀渀瘀⸀昀椀氀攀开椀搀 
		 LEFT JOIN base.units_of_measure AS uom਀ऀऀ         伀一  昀爀渀昀渀⸀甀渀椀琀开椀搀  
				    =  uom.unit_id਀ऀऀऀ  圀䠀䔀刀䔀 昀洀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
		   ORDER BY 'File Real Number Field Name';਀  ऀऀ䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'ZeroRecords', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀ऀ䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nofileidmessage <> '')            SET @message = @message + ' | ' + @nofileidmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_file_text_values_by_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㔀ⴀ　㤀ⴀ㈀　㈀㌀ 
-- Description:	Lists text values for a file਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀椀氀攀 椀搀 
-- Output is the list of the free text values, a message and transaction status.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_file_text_values_by_file] ਀ 
	 @fileid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @fileinvalidmessage nvarchar(200)   = '', -- Communicates that the file id was invalid਀ऀऀ䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@zerorecordsmessage nvarchar(200)   = '', -- Communicates that zero records were retrieved਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                          -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
  IF @fileid = 0਀     匀䔀吀 䀀昀椀氀攀椀搀 㴀 一唀䰀䰀㬀 
   -- Check if a file id has not been supplied.  Fail if it hasn't.਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀऀ    䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀ      匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	   ELSE ਀ऀऀ   匀䔀吀 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀㬀 
	 END਀  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
     BEGIN  -- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @fileinvalidmessage = 'File ID: ' + CONVERT(nvarchar(20), @fileid) + '.  ' + @tempmessage;਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @fileinvalidmessage = 'A database level message error occurred on FileIDNotExist.';਀ऀऀऀऀऀ䔀一䐀 
	 END਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀ 
  -- End data validation਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			 SELECT @fileid                 AS 'File ID',਀ऀऀऀ        昀昀琀昀渀⸀愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀椀攀氀搀 一愀洀攀✀Ⰰ 
			        ISNULL(fftfn.mnem, '')  AS 'Field Mnemonic',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀昀昀琀昀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀攀氀搀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		            ISNULL(text_value, '')  AS 'Text'਀ऀऀऀ   䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 昀昀琀昀渀 
		 INNER JOIN file_attr.file_free_text_values AS fftv਀ऀऀऀऀ 伀一    昀昀琀瘀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
				    = fftfn.file_free_text_name_id਀ऀऀ 䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
				 ON     fm.file_id ਀ऀऀऀऀ    㴀 昀昀琀瘀⸀昀椀氀攀开椀搀 
			  WHERE fm.file_id = @fileid਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䘀椀攀氀搀 一愀洀攀✀㬀 
  		IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				SET @zerorecordsmessage = @tempmessage;਀ऀऀऀऀ䔀䰀匀䔀  
					SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		     SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
	IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@fileinvalidmessage <> '')         SET @message = @message + ' | ' + @fileinvalidmessage;਀    䤀䘀 ⠀䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_by_co_ms_attr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given common object mulit-select attribute਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_co_ms_attr] ਀ 
਀      䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @commonobjectid  bigint          = NULL, ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
 		 -- Check the common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀ऀऀऀऀऀ 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN com_obj.file_to_com_obj_ms_list_links AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀    䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
        ON fm.file_id = perm.file_id  -- Apply permission filter਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.common_object_id      = @commonobjectid਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_by_co_rb_attr]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given common object radio button attribute਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_co_rb_attr] ਀ 
਀      䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @commonobjectid  bigint          = NULL, ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
 		 -- Check the common object list reference਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 㴀 　 
		   SET @commonobjlistid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoComObjList', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀ऀऀऀऀऀ 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀䰀椀猀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  
		 		 			 FROM com_obj.common_object_list_names ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjListNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀䰀椀猀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
਀ 
	-- Check the common object id reference਀ऀ    䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 㴀 　 
		   SET @commonobjectid = NULL;਀ऀऀ䤀䘀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 䤀匀 一唀䰀䰀 
			BEGIN਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoComObject', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䌀漀洀伀戀樀攀挀琀⸀✀⤀㬀 
			END਀        䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  
		 		 			 FROM com_obj.common_objects ਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀  㴀 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀  
				   BEGIN਀ऀऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						  @message_id   = 'ComObjectNotExist', ਀ऀऀऀऀऀऀ  䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					 IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀⤀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					 ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䌀漀洀伀戀樀攀挀琀一漀琀䔀砀椀猀琀✀⤀㬀 
					 SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   END਀ऀऀ  䔀一䐀 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN com_obj.file_to_com_obj_radiob_links AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 㴀 䀀挀漀洀洀漀渀漀戀樀氀椀猀琀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
		      AND searchtable.common_object_id      ਀ऀऀऀ      㴀          䀀挀漀洀洀漀渀漀戀樀攀挀琀椀搀 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                    -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_by_doc_by_radiob]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㠀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given document id for a given file radio button਀ⴀⴀ 䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 猀攀氀攀挀琀 愀氀氀 琀栀攀 猀甀瀀攀爀猀攀搀攀搀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀⸀   
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists file records for a given document id.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @documentid nvarchar(50)਀⨀ ⴀ 䀀昀漀爀洀椀搀 戀椀最椀渀琀 
* - @file_radiobattrid bigint.਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀椀氀攀 爀攀挀漀爀搀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
* - @numrows bigint OUTPUT: Number of rows਀⨀ ⴀ 䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀 伀唀吀倀唀吀㨀 一甀洀戀攀爀 漀昀 昀椀氀攀猀 
*਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/*਀吀栀攀 氀漀最椀挀 眀漀爀欀猀 愀猀 昀漀氀氀漀眀猀⸀ 
Files are listed which:਀  ⴀ 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀Ⰰ 
  - are linked to the document id via the table xref.file_to_document_links਀  ⴀ 愀渀搀 眀栀椀挀栀 栀愀瘀攀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 椀搀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_doc_by_radiob] ਀ 
਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
      @file_radiobattrid bigint        = NULL,  ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted'; ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
			END਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
  -- File radio button attribute validation਀ 
		  IF @file_radiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		  IF @file_radiobattrid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䘀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @file_radiobattrid IS NOT NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀猀 瘀愀氀椀搀 
				 IF NOT EXISTS (SELECT file_radiob_attr_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
								 WHERE file_radiob_attr_id = @file_radiobattrid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 椀搀⸀  
	WITH FileListCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀  
			fm.file_id AS ID਀ऀऀ䘀刀伀䴀  
			base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀  
			internal.ufn_SEL_files_by_doc_TVF(@documentid) AS tvf਀ऀऀ圀䠀䔀刀䔀  
			   fm.file_id ਀ऀऀऀ㴀 琀瘀昀⸀昀椀氀攀开椀搀 
			),਀ 
    -- Select files with the given radio button attribute, from the list of files for the given document id਀ऀ匀攀挀漀渀搀䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fl.ID,਀ऀऀऀ刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀氀⸀䤀䐀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 
	     FROM FileListCTE AS fl਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 昀爀氀 
           ON    fl.ID਀ऀऀ      㴀 昀爀氀⸀昀椀氀攀开椀搀 
	    WHERE frl.file_radiob_attr_id਀ऀऀ      㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.row_number, fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                             ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 匀攀挀漀渀搀䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_by_duty_function]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given duty function਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_duty_function] ਀ 
      @functionid bigint               = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀   ⴀⴀ 䐀甀琀礀 昀甀渀挀琀椀漀渀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @functionid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
		  IF @functionid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䐀甀琀礀 昀甀渀挀琀椀漀渀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @functionid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT function_id਀ऀऀऀऀऀऀऀऀऀ 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
									WHERE function_id = @functionid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.function_id਀ऀऀ               㴀 䀀昀甀渀挀琀椀漀渀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                    -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开昀椀氀攀渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file data according to filename search using the LIKE operator.਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀ 
-- A filter group is applied਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_filename] ਀ 
	  @likestring nvarchar(max)        = '', ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value.਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files.  ਀      䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
-- Connected user authentication਀  
਀ 
 -- Data validation਀ 
		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀    ऀ  ⴀⴀ 匀琀爀椀渀最 瘀愀氀椀搀愀琀椀漀渀   
਀ ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ  圀䤀吀䠀 昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
		  SELECT DISTINCT਀ऀऀऀऀ 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀              䄀匀 䤀䐀 
		    FROM base.file_metadata AS searchtable਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON searchtable.file_id = perm.file_id  -- Apply permission filtering਀ऀ    圀䠀䔀刀䔀 ⠀ 
					(@likestring IS NULL AND searchtable.filename IS NULL)  -- Caters for searching for records where filename is NULL਀ऀऀऀऀऀ伀刀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀渀愀洀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀ 䔀匀䌀䄀倀䔀 ✀尀✀⤀ 
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ऀऀ ⤀Ⰰ 
਀ऀऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				 SELECT DISTINCT fileidsCTE.ID,਀ऀऀऀऀ 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 ⴀⴀ 䤀渀挀氀甀搀椀渀最 琀栀椀猀 椀渀 昀椀氀攀椀搀猀䌀吀䔀 挀愀甀猀攀猀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀猀 琀漀 戀攀 挀爀攀愀琀攀搀 
				 FROM fileidsCTE)਀ 
਀ऀऀⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀攀 椀搀 
		   INSERT INTO @AttData  (num_records, file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀  
				        DENSE_RANK() OVER (ORDER BY fi.row_number) AS num_records,਀ऀऀऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀Ⰰ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
																						  -- each row in this table is a field. ਀ऀऀऀऀऀऀ搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀    䄀匀 昀椀氀攀开椀搀Ⰰ  
						file_data.field_type     AS field_type, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
						file_data.field_name     AS field_name,਀ऀऀऀऀऀ    昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
						file_data.attr_id        AS attr_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
						file_data.units          AS units,਀ऀऀऀऀऀ    昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
				   FROM distinctfileidsCTE AS fi਀ऀऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀 
			 RIGHT JOIN distinctfileidsCTE਀ऀऀऀऀऀ 伀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀  
						= fi.ID);਀ 
				 SELECT @numfiles   = MAX(file_count)  from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
				    ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
				    ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, 'Record', 'File ID';਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ऀⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
		SET @outputfiltergroupid = @filtergroupid਀ऀऀ匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
								FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		  SET @transaction_status = 'Good';਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀऀऀ䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		  ELSE਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		END CATCH਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   ਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开昀椀氀琀攀爀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-07-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 昀椀氀攀猀 戀礀 昀椀氀琀攀爀 最爀漀甀瀀⸀ 
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists file records for a given document id and filter group.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* @filter_group_id bigint, @formid bigint਀⨀ 䤀昀 䀀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 椀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀 昀爀漀洀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 眀椀氀氀 戀攀 甀猀攀搀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of file records.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀⼀⨀ 
The logic works as follows.਀䘀椀氀攀猀 愀爀攀 氀椀猀琀攀搀 眀栀椀挀栀㨀 
  - the user has viewing rights to,਀  ⴀ 愀爀攀 氀椀渀欀攀搀 琀漀 愀氀氀 琀栀攀 愀琀琀爀椀戀甀琀攀猀 眀栀椀挀栀 栀愀瘀攀 琀栀攀 最椀瘀攀渀 昀椀氀琀攀爀 最爀漀甀瀀 愀猀猀椀最渀攀搀⸀  
For multi-select lists, all the attributes with the filter group linked must be ਀氀椀渀欀攀搀 琀漀 琀栀攀 昀椀氀攀 昀漀爀 琀栀攀 昀椀氀攀 琀漀 戀攀 椀渀挀氀甀搀攀搀⸀  
The filter group link only applies to the links to files, not links to the document id. ਀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_filter_group] ਀ 
	  @filtergroupid bigint            = NULL, -- Optional.  The global default will be used if none supplied.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ ⴀⴀ 伀瀀琀椀漀渀愀氀⸀  吀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀 眀椀氀氀 戀攀 甀猀攀搀 椀昀 渀漀渀攀 猀甀瀀瀀氀椀攀搀⸀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass'਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0; ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀  
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ圀䤀吀䠀 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT DISTINCT ਀ऀऀऀ昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀Ⰰ 
			ROW_NUMBER() OVER (ORDER BY fm.file_id) AS row_number਀ऀऀ䘀刀伀䴀  
			base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = fm.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = fm.file_id਀      ⤀ 
)਀ऀ                      
			)਀ 
਀ऀऀ   䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
				(SELECT  ਀ऀऀऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀Ⰰ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
																						                  -- each row in this table is a field. ਀ऀऀऀऀऀऀ搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀    䄀匀 昀椀氀攀开椀搀Ⰰ  
						file_data.field_type     AS field_type, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
						file_data.field_name     AS field_name,਀ऀऀऀऀ        昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ  
						file_data.attr_id        AS attr_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
						file_data.units          AS units,਀ऀऀऀऀ        昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
				   FROM distinctfileidsCTE AS fi਀ऀऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀 
			 RIGHT JOIN distinctfileidsCTE਀ऀऀऀऀऀ 伀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀  
						= fi.ID);਀ 
				 SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开昀渀挀琀开昀氀搀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀挀挀漀爀搀椀渀最 琀漀 愀 搀甀琀礀 昀甀渀挀琀椀漀渀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀⸀ 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开昀渀挀琀开昀氀搀开渀愀洀攀崀  
਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
 -- Data Validation਀  
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                    -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_by_function_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given function list਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_function_list] ਀ 
      @functionlistid bigint           = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀   ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @functionlistid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 一唀䰀䰀㬀 
		  IF @functionlistid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䘀甀渀挀琀椀漀渀 氀椀猀琀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @functionlistid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT function_list_id਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 
									WHERE function_list_id = @functionlistid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.function_list_id਀ऀऀ               㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开洀猀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开洀猀开氀椀猀琀崀  
਀ऀ  䀀昀椀氀攀洀猀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @filemsattrid bigint             = NULL, ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 㴀 　 
			 SET @filemslistid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 㴀 　  
			 SET @filemsattrid = NULL;਀ 
		  -- Check the multi-select list਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file multi-select list id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开氀椀猀琀开椀搀  
								  FROM file_attr.file_multi_select_list_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开氀椀猀琀开椀搀 㴀 䀀昀椀氀攀洀猀氀椀猀琀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrListNameNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䰀椀猀琀一愀洀攀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀  
		  -- Check if a file multi-select attribute id was supplied. ਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file multi-select attribute id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoAttrID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ 
          -- Check that the multi-select attribute and multi-select list id pair exists਀ऀऀ  䤀䘀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 
								  FROM file_attr.file_multi_select_attributes ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 
									   AND file_ms_list_id = @filemslistid) ਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.file_ms_list_id = @filemslistid   --### The search criteria    ਀ऀऀ      䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 䀀昀椀氀攀洀猀愀琀琀爀椀搀 
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 瀀攀漀瀀氀攀 氀椀猀琀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀崀  
਀      䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
 -- Data Validation਀  
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
   -- People list validation਀ऀऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　  
			 SET @peoplelistid = NULL;਀ऀऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一唀䰀䰀  
			 BEGIN  -- People list not supplied਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoAttrID', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䄀琀琀爀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 䤀匀 一伀吀 一唀䰀䰀  
				BEGIN  -- Check if the people list is valid਀ऀऀऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									 FROM people.people_list_names਀ऀऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀 瀀攀漀瀀氀攀开氀椀猀琀开椀搀 㴀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀⤀  
						BEGIN -- Radio button attribute does not exist਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'AttrIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE  ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
						END਀ऀऀऀ䔀一䐀 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_people_list_links AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		               = @peoplelistid  --### The search criteria ਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                    -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_by_radio_button]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects file metadata for all the files for a given radio button attribute਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_radio_button] ਀ 
      @file_radiobattrid bigint        = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀   ⴀⴀ 䘀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 瘀愀氀椀搀愀琀椀漀渀 
		  IF @file_radiobattrid = 0 ਀ऀऀऀ 匀䔀吀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀 㴀 一唀䰀䰀㬀 
		  IF @file_radiobattrid IS NULL ਀ऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䘀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 渀漀琀 猀甀瀀瀀氀椀攀搀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䄀琀琀爀䤀䐀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoAttrID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- @file_radiobattrid IS NOT NULL ਀ऀऀऀऀ䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 椀猀 瘀愀氀椀搀 
					IF NOT EXISTS (SELECT file_radiob_attr_id਀ऀऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀  
									WHERE file_radiob_attr_id = @file_radiobattrid) ਀ऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䄀琀琀爀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀   
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on AttrIDNotExist.');਀ऀऀऀऀऀऀ䔀一䐀 
			END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.file_radiob_attr_id਀ऀऀ               㴀 䀀昀椀氀攀开爀愀搀椀漀戀愀琀琀爀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开琀攀砀琀开昀椀攀氀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀椀琀栀 愀 琀攀砀琀 昀椀攀氀搀 挀漀渀琀愀椀渀椀渀最 愀 最椀瘀攀渀 猀琀爀椀渀最⸀  
-- Applies a filter group. ਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_text_field] ਀ 
	  @filetextnameid bigint           = NULL,਀ऀ  䀀氀椀欀攀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀        㴀 ✀✀Ⰰ  
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
 -- Data Validation਀ 
 		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀ 
਀  
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
		  -- Check the file text name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 㴀 　 
		     SET @filetextnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file text name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTextNameId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀攀砀琀一愀洀攀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_free_text_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 琀攀砀琀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'TextIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀攀砀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
          -- There is no validation of the text value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀ 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given text field਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_free_text_values AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀琀攀砀琀渀愀洀攀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND ਀ऀऀऀ  ⠀ 
				(@likestring IS NULL AND searchtable.text_value IS NULL)  -- Caters for searching for records where search string is NULL਀ऀऀऀऀ伀刀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀琀攀砀琀开瘀愀氀甀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀ 䔀匀䌀䄀倀䔀 ✀尀✀⤀ 
			  )਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                    -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_by_trans_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Selects file data for a given transaction group id਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 愀渀搀 昀漀爀洀 椀搀⸀  伀甀琀瀀甀琀 椀猀 昀椀氀攀 洀攀琀愀搀愀琀愀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开琀爀愀渀猀开最爀漀甀瀀崀  
਀     䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @formid bigint                   = NULL,਀  ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ 䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numfiles bigint                 = NULL OUTPUT,਀ऀ 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @formname nvarchar(50)           = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)    = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)   = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀  
਀ 
  -- Check that the transaction group exists.  Fail if it doesn't. But allow NULLs.਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 　  
     SET @transactiongroup = NULL;਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一伀吀 一唀䰀䰀 
     BEGIN਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
                          FROM base.transaction_groups ਀                         圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀  
             BEGIN਀               䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                    @message_id = 'TGNotExist', ਀ऀऀऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	           IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	         END਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
  -- Output the failed data validation message਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	  ELSE  ਀ऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
	END਀ 
  -- End data validation਀ 
--========================================================਀  ⴀⴀ 匀攀氀攀挀琀 昀椀氀攀猀 洀攀琀愀搀愀琀愀 昀漀爀 愀 最椀瘀攀渀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀⸀   
  IF @transaction_ready  = 'Ready'਀    䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ    䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 䤀匀 一唀䰀䰀 
		   BEGIN਀ 
	  WITH fileidsCTE AS(਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 
					   fm.file_id              AS ID਀ऀऀऀऀ  䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
		WHERE fm.transaction_group_id IS NULL਀ऀऀऀऀ  ⤀Ⰰ 
਀ऀऀऀऀ 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
				 SELECT DISTINCT fileidsCTE.ID,਀ऀऀऀऀ 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 ⴀⴀ 䤀渀挀氀甀搀椀渀最 琀栀椀猀 椀渀 昀椀氀攀椀搀猀䌀吀䔀 挀愀甀猀攀猀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀猀 琀漀 戀攀 挀爀攀愀琀攀搀 
				 FROM fileidsCTE)਀ 
਀ऀऀⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀椀氀攀 椀搀 
		   INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀   
						DENSE_RANK() OVER (ORDER BY fi.row_number, fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ  ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
						fi.ID                    AS file_id,਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
						file_data.field_name_id  AS field_name_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
				        file_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
						file_data.attr_value     AS attr_value, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
				        file_data.form_position  AS position਀ऀऀऀऀ   䘀刀伀䴀 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀 昀椀 
			CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
          END਀ 
		   ਀ऀऀ䔀䰀匀䔀 ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 椀猀 渀漀琀 一唀䰀䰀 
	      BEGIN਀ऀ        圀䤀吀䠀 昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
	  			SELECT DISTINCT਀ऀऀऀऀऀ   昀洀⸀昀椀氀攀开椀搀              䄀匀 䤀䐀 
				  FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀऀ圀䠀䔀刀䔀 昀洀⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 
				  ),਀ 
				 distinctfileidsCTE AS(਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 昀椀氀攀椀搀猀䌀吀䔀⸀䤀䐀Ⰰ 
				 ROW_NUMBER() OVER (ORDER BY fileidsCTE.ID) AS row_number -- Including this in fileidsCTE causes duplicate records to be created਀ऀऀऀऀ           䘀刀伀䴀 昀椀氀攀椀搀猀䌀吀䔀⤀ 
਀ 
		-- Extract the data according to the file id਀ऀऀ   䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
				(SELECT  ਀ऀऀऀऀऀऀ䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀爀漀眀开渀甀洀戀攀爀Ⰰ 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
																						  -- each row in this table is a field. ਀ऀऀऀऀऀऀ昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ 
						file_data.field_type     AS field_type, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
						file_data.field_name     AS field_name, ਀ऀऀऀऀ        昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
						file_data.attr_id        AS attr_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
						file_data.units          AS units,਀ऀऀऀऀ        昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
				   FROM distinctfileidsCTE AS fi਀ऀऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ 
				 SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT  ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
		  END਀       
	  SET @numrows = @@ROWCOUNT;਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀ 
  	    IF @@ROWCOUNT = 0਀ऀ      䈀䔀䜀䤀一 
	        EXEC internal.usp_SEL_message ਀                 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
                 @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ 䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀ  䔀一䐀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
		   SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ䔀䰀匀䔀   
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id   = 'SelectError', ਀             䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
			CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ䔀䰀匀䔀 
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀  
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_by_user]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Selects file metadata for all the files for a given user਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_by_user] ਀ 
      @sidid bigint                    = NULL,   ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀   ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
		  IF @sidid = 0਀ऀऀऀ 匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			                 FROM user_restr.sid_list AS SL਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.sid_id਀ऀऀ               㴀 䀀猀椀搀椀搀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开甀猀攀爀开昀最渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 甀猀攀爀 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开戀礀开甀猀攀爀开昀最渀崀  
਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ      
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
 -- Data Validation਀  
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
 	      -- Check the general field name id਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 　 
			 SET @genfield_nameid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @genfield_nameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䜀䘀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoGFNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A general field name id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT general_field_name_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
							WHERE general_field_name_id = @genfield_nameid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on GFNameIDInvalid.');਀ऀऀऀऀ 䔀一䐀   
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given radio button਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN people.file_to_user_links AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀऀ圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
		               = @genfield_nameid      --### The search criteria਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                    -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_contains]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for all the files which contain the given text਀ⴀⴀ 甀猀椀渀最 琀栀攀 䌀伀一吀䄀䤀一匀 昀甀渀挀琀椀漀渀 愀渀搀 愀瀀瀀氀椀攀搀 琀漀 琀栀攀 猀琀漀爀攀搀 瀀氀愀椀渀 琀攀砀琀 挀漀渀琀攀渀琀 漀昀 琀栀攀 昀椀氀攀⸀  
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开挀漀渀琀愀椀渀猀崀  
਀ऀ  䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀㈀　　　⤀   㴀 ✀✀Ⰰ  
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
   	  -- String validation  ਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 㴀 ✀✀  
		 SET @containsstring = NULL;਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 䤀匀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoSearchString', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀攀愀爀挀栀匀琀爀椀渀最⸀✀⤀㬀 
		 END  ਀ 
਀ 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ 
          -- There is no validation of the text value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀ 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files ਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN base.file_plain_text_content AS searchtable  -- ## The search table਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀  䌀伀一吀䄀䤀一匀⠀猀攀愀爀挀栀琀愀戀氀攀⸀瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀Ⰰ 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最⤀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开挀漀渀琀愀椀渀猀琀愀戀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀栀椀挀栀 挀漀渀琀愀椀渀 琀栀攀 最椀瘀攀渀 琀攀砀琀 甀猀椀渀最 琀栀攀  
-- CONTAINSTABLE function as applied to the stored plain text content of the file. ਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_containstable] ਀ 
	  @containsstring nvarchar(2000)   = '', ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀洀愀砀爀漀眀猀 䤀一吀                       㴀 ㄀　　　　Ⰰ ⴀⴀ 䰀椀洀椀琀猀 琀栀攀 渀甀洀戀攀爀 漀昀 猀攀愀爀挀栀 爀攀猀甀氀琀猀 琀漀 愀瘀漀椀搀 攀砀挀攀猀猀椀瘀攀 洀攀琀愀搀愀琀愀 挀栀攀挀欀猀 愀渀搀 瀀爀漀琀攀挀琀 瀀攀爀昀漀爀洀愀渀挀攀 
		                                           -- ufn_CHK_filter_file_id_SVF(ft.[KEY], @filtergroupid) can't be inlined with CONTAINSTABLE਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;  ਀ 
 ਀   ऀ  ⴀⴀ 匀琀爀椀渀最 瘀愀氀椀搀愀琀椀漀渀   
	  IF @containsstring = '' ਀ऀऀ 匀䔀吀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 㴀 一唀䰀䰀㬀 
	  IF @containsstring IS NULL਀ऀऀ 䈀䔀䜀䤀一  
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀匀攀愀爀挀栀匀琀爀椀渀最✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoSearchString.');਀ऀऀ 䔀一䐀   
਀ 
਀  
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 琀攀砀琀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes.਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
			SELECT TOP (@maxrows) ft.[KEY] AS ID, ft.RANK਀ऀऀऀ䘀刀伀䴀 䌀伀一吀䄀䤀一匀吀䄀䈀䰀䔀⠀戀愀猀攀⸀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀Ⰰ 瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀Ⰰ 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最⤀ 䄀匀 昀琀 
			INNER JOIN base.file_metadata AS fm਀ऀऀऀऀ伀一 昀洀⸀昀椀氀攀开椀搀 㴀 昀琀⸀嬀䬀䔀夀崀 
        INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀                伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
			 WHERE internal.ufn_CHK_filter_file_id_SVF(ft.[KEY], @filtergroupid) <> 'Fail'਀ऀऀ⤀ 
਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.RANK DESC, fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY ad.file_count, ad.fileid;਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT(@tempmessage, ' | ', @message, ' | ', 'Results restricted to a maximum of ', @maxrows, ' files.')਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开挀爀攀愀琀攀搀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where the create date is between given dates.਀ⴀⴀ 一漀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_created_between] ਀ 
	  @earlier_date datetime           = NULL,਀ऀ  䀀氀愀琀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀             㴀 一唀䰀䰀Ⰰ  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ    䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
	    @temp_userauth_status nchar(10)         = 'Fail',਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ 
਀ऀ      ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 搀愀琀攀 瘀愀氀甀攀 椀猀 瘀愀氀椀搀 
		  IF (@earlier_date IS NOT NULL AND @earlier_date <> '')਀ऀऀ     䈀䔀䜀䤀一 
			   IF ISDATE(@earlier_date) <> 1਀ऀऀऀ      䈀䔀䜀䤀一 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateInvalid.');਀ऀऀऀऀ  䔀一䐀 
			 END਀ऀऀ  䔀䰀匀䔀 匀䔀吀 䀀攀愀爀氀椀攀爀开搀愀琀攀 㴀 一唀䰀䰀㬀 
਀ऀऀ  ऀऀ  䤀䘀 ⠀䀀氀愀琀攀爀开搀愀琀攀 䤀匀 一伀吀 一唀䰀䰀 䄀一䐀 䀀氀愀琀攀爀开搀愀琀攀 㰀㸀 ✀✀⤀ 
		     BEGIN਀ऀऀऀ   䤀䘀 䤀匀䐀䄀吀䔀⠀䀀氀愀琀攀爀开搀愀琀攀⤀ 㰀㸀 ㄀ 
			      BEGIN਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DateInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				  END਀ऀऀऀ 䔀一䐀 
		  ELSE SET @later_date = NULL;਀ 
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE ਀ऀऀ    ⠀昀洀⸀挀爀攀愀琀攀搀 㰀 䀀氀愀琀攀爀开搀愀琀攀 䄀一䐀 昀洀⸀挀爀攀愀琀攀搀 㸀 䀀攀愀爀氀椀攀爀开搀愀琀攀⤀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 瘀愀氀甀攀 
		  ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀    匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_date_after]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 搀愀琀攀 昀漀爀 愀 最椀瘀攀渀 搀愀琀攀 昀椀攀氀搀 椀猀 愀昀琀攀爀 愀 最椀瘀攀渀 搀愀琀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开搀愀琀攀开愀昀琀攀爀崀  
਀      䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass'; ਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filedatenameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_date_name_id = @filedatenameid) -- Check if the file date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀洀洀漀渀 漀戀樀攀挀琀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.file_date_name_id = @filedatenameid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀  㸀 䀀搀愀琀攀瘀愀氀甀攀 
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     ਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_date_before]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 搀愀琀攀 昀漀爀 愀 最椀瘀攀渀 搀愀琀攀 昀椀攀氀搀 椀猀 戀攀昀漀爀攀 愀 最椀瘀攀渀 搀愀琀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开搀愀琀攀开戀攀昀漀爀攀崀  
਀      䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @datevalue datetime2(7)          = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass'; ਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filedatenameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filedatenameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀攀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDateNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file date name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_date_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_date_name_id = @filedatenameid) -- Check if the file date name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DateIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_date_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.date_value  < @datevalue਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_date_between]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 琀栀攀 搀愀琀攀 昀漀爀 愀 最椀瘀攀渀 搀愀琀攀 昀椀攀氀搀 椀猀 戀攀琀眀攀攀渀 琀眀漀 最椀瘀攀渀 搀愀琀攀猀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开搀愀琀攀开戀攀琀眀攀攀渀崀  
਀      䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @earlier_date datetime2(7)       = NULL,਀ऀ  䀀氀愀琀攀爀开搀愀琀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀         㴀 一唀䰀䰀Ⰰ  
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
 -- Data validation	਀ 
		  -- Check the file date name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 　 
		     SET @filedatenameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM file_attr.file_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_date_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND (searchtable.date_value <= @later_date AND searchtable.date_value >= @earlier_date) ਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_date_equals]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 搀愀琀攀⸀ 
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_date_equals] ਀ 
      @filedatenameid bigint           = NULL,    ਀ऀ  䀀搀愀琀攀瘀愀氀甀攀 搀愀琀攀琀椀洀攀㈀⠀㜀⤀          㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀  
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
 -- Data validation	਀ 
		  -- Check the file date name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 㴀 　 
		     SET @filedatenameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file date name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoDateNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀攀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀  
								  FROM file_attr.file_date_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开搀愀琀攀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀搀愀琀攀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 搀愀琀攀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'DateIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀愀琀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀洀洀漀渀 漀戀樀攀挀琀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开搀愀琀攀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.file_date_name_id = @filedatenameid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀搀愀琀攀开瘀愀氀甀攀  㴀 䀀搀愀琀攀瘀愀氀甀攀 
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开昀漀爀开漀渀攀开搀漀挀甀洀攀渀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 昀椀氀攀猀 戀礀 搀漀挀甀洀攀渀琀 椀搀 愀渀搀 戀礀 昀椀氀琀攀爀 最爀漀甀瀀⸀ 
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists file records for a given document id and filter group.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @documentid nvarchar(50), @filter_group_id bigint, @formid bigint਀⨀ 䤀昀 䀀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 椀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀 昀爀漀洀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 眀椀氀氀 戀攀 甀猀攀搀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of file records.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀⼀⨀ 
The logic works as follows.਀䘀椀氀攀猀 愀爀攀 氀椀猀琀攀搀 眀栀椀挀栀㨀 
  - the user has viewing rights to,਀  ⴀ 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 瘀椀愀 琀栀攀 琀愀戀氀攀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀Ⰰ 
  - are linked to all the attributes which have the given filter group assigned. ਀䘀漀爀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀猀Ⰰ 愀氀氀 琀栀攀 愀琀琀爀椀戀甀琀攀猀 眀椀琀栀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀攀搀 洀甀猀琀 戀攀  
linked to the file for the file to be included. ਀吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀 漀渀氀礀 愀瀀瀀氀椀攀猀 琀漀 琀栀攀 氀椀渀欀猀 琀漀 昀椀氀攀猀Ⰰ 渀漀琀 氀椀渀欀猀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀⸀  
਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开昀漀爀开漀渀攀开搀漀挀甀洀攀渀琀崀  
਀ 
      @documentid nvarchar(50)         = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ ⴀⴀ 伀瀀琀椀漀渀愀氀⸀  吀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀 眀椀氀氀 戀攀 甀猀攀搀 椀昀 渀漀渀攀 猀甀瀀瀀氀椀攀搀⸀ 
	  @formid bigint                   = NULL, -- Optional.  The global default will be used if none supplied.਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀ 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀ 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀  
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀    
਀  
 -- Data Validation਀ 
 -- Document id validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Doc id was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀऀ䔀一䐀 
		-- End document id validation਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ 
	WITH distinctfileidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀  
			fm.file_id AS ID,਀ऀऀऀ刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀洀⸀昀椀氀攀开椀搀⤀ 䄀匀 爀漀眀开渀甀洀戀攀爀 
		FROM ਀ऀऀऀ戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
		CROSS APPLY ਀ऀऀऀ椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 琀瘀昀 
		WHERE ਀ऀऀऀ   昀洀⸀昀椀氀攀开椀搀  
			= tvf.file_id਀ऀऀऀ⤀ 
਀ 
		   INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀऀऀऀ⠀匀䔀䰀䔀䌀吀   
						DENSE_RANK() OVER (ORDER BY fi.row_number, distinctfileidsCTE.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀऀ                  ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
						distinctfileidsCTE.ID    AS file_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
						file_data.field_name_id  AS field_name_id, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ 
				        file_data.field_mnemonic AS field_mnemonic, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
						file_data.attr_value     AS attr_value, ਀ऀऀऀऀऀऀ昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
				        file_data.form_position  AS position਀ऀऀऀऀ   䘀刀伀䴀 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 䄀匀 昀椀 
			CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data਀ऀऀऀ 刀䤀䜀䠀吀 䨀伀䤀一 搀椀猀琀椀渀挀琀昀椀氀攀椀搀猀䌀吀䔀 
					 ON distinctfileidsCTE.ID ਀ऀऀऀऀऀऀ㴀 昀椀⸀䤀䐀⤀㬀 
਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_freetext]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for all the files which contain the given text using the ਀ⴀⴀ 䘀刀䔀䔀吀䔀堀吀 昀甀渀挀琀椀漀渀 愀猀 愀瀀瀀氀椀攀搀 琀漀 琀栀攀 猀琀漀爀攀搀 瀀氀愀椀渀 琀攀砀琀 挀漀渀琀攀渀琀 漀昀 琀栀攀 昀椀氀攀⸀  
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开昀爀攀攀琀攀砀琀崀  
਀ऀ  䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀㈀　　　⤀   㴀 ✀✀Ⰰ  
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
   	  -- String validation  ਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 㴀 ✀✀  
		 SET @containsstring = NULL;਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 䤀匀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoSearchString', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀攀愀爀挀栀匀琀爀椀渀最⸀✀⤀㬀 
		 END  ਀ 
਀ 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ 
          -- There is no validation of the text value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀ 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
		 --Select the files ਀ऀऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
		   SELECT fm.file_id AS ID਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
	   INNER JOIN base.file_plain_text_content AS searchtable  -- ## The search table਀ऀऀऀ   伀一            昀洀⸀昀椀氀攀开椀搀 
				  = searchtable.file_id਀       䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
               ON fm.file_id = perm.file_id  ਀ऀऀऀ圀䠀䔀刀䔀  䘀刀䔀䔀吀䔀堀吀⠀猀攀愀爀挀栀琀愀戀氀攀⸀瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀Ⰰ 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最⤀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开昀爀攀攀琀攀砀琀琀愀戀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 昀椀氀攀猀 眀栀椀挀栀 挀漀渀琀愀椀渀 琀栀攀 最椀瘀攀渀 琀攀砀琀 甀猀椀渀最 琀栀攀  
-- FREETEXTTABLE function as applied to the stored plain text content of the file. ਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_freetexttable] ਀ 
	  @containsstring nvarchar(2000)   = '', ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @validationmessage nvarchar(200)   = '',  -- Communicates that the transaction failed due to data validation਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀洀愀砀爀漀眀猀 䤀一吀                       㴀 ㄀　　　　Ⰰ ⴀⴀ 䰀椀洀椀琀猀 琀栀攀 渀甀洀戀攀爀 漀昀 猀攀愀爀挀栀 爀攀猀甀氀琀猀 琀漀 愀瘀漀椀搀 攀砀挀攀猀猀椀瘀攀 洀攀琀愀搀愀琀愀 挀栀攀挀欀猀 愀渀搀 瀀爀漀琀攀挀琀 瀀攀爀昀漀爀洀愀渀挀攀 
		                                           -- ufn_CHK_filter_file_id_SVF(ft.[KEY], @filtergroupid) can't be inlined with FREETEXTTABLE਀ 
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
   	  -- String validation  ਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 㴀 ✀✀  
		 SET @containsstring = NULL;਀ऀ  䤀䘀 䀀挀漀渀琀愀椀渀猀猀琀爀椀渀最 䤀匀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NoSearchString', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀攀愀爀挀栀匀琀爀椀渀最⸀✀⤀㬀 
		 END  ਀ 
਀ 
 ਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default from global settings and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
 ਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form ID ਀ 
਀ 
          -- There is no validation of the text value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀ 
		 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @validationmessage = @tempmessage;਀ऀऀ  䔀䰀匀䔀  
			   SET @validationmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
		WITH FileListCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀 吀伀倀 ⠀䀀洀愀砀爀漀眀猀⤀ 昀琀⸀嬀䬀䔀夀崀 䄀匀 䤀䐀Ⰰ 昀琀⸀刀䄀一䬀 
			FROM FREETEXTTABLE(base.file_plain_text_content, plain_text_content, @containsstring) AS ft਀ऀऀऀ䤀一一䔀刀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
				ON fm.file_id = ft.[KEY]਀            䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
                    ON fm.file_id = perm.file_id  ਀ऀऀऀ     圀䠀䔀刀䔀 椀渀琀攀爀渀愀氀⸀甀昀渀开䌀䠀䬀开昀椀氀琀攀爀开昀椀氀攀开椀搀开匀嘀䘀⠀昀琀⸀嬀䬀䔀夀崀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 㰀㸀 ✀䘀愀椀氀✀ 
		)਀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀刀䄀一䬀 䐀䔀匀䌀Ⰰ 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                    -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 愀搀⸀昀椀氀攀开挀漀甀渀琀Ⰰ 愀搀⸀昀椀氀攀椀搀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀刀攀猀甀氀琀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 愀 洀愀砀椀洀甀洀 漀昀 ✀Ⰰ 䀀洀愀砀爀漀眀猀Ⰰ ✀ 昀椀氀攀猀⸀✀⤀ 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_int_between]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 眀栀攀爀攀 愀渀 椀渀琀攀最攀爀 昀椀攀氀搀 椀猀 戀攀琀眀攀攀渀 最椀瘀攀渀 椀渀琀攀最攀爀 瘀愀氀甀攀猀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开椀渀琀开戀攀琀眀攀攀渀崀  
਀      䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ     
	  @lower_int_value bigint          = NULL,਀ऀ  䀀甀瀀瀀攀爀开椀渀琀开瘀愀氀甀攀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
 -- Data validation	਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀洀洀漀渀 漀戀樀攀挀琀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.file_int_name_id = @fileintnameid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 ⠀猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㸀 䀀氀漀眀攀爀开椀渀琀开瘀愀氀甀攀 䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀 㰀 䀀甀瀀瀀攀爀开椀渀琀开瘀愀氀甀攀⤀ऀ 
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开椀渀琀开攀焀甀愀氀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata according to a given integer value.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_int_equals] ਀ 
      @fileintnameid bigint            = NULL,    ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
 -- Data validation	਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking form id ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 愀琀琀爀椀戀甀琀攀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.file_int_name_id = @fileintnameid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀  㴀 䀀椀渀琀攀最攀爀瘀愀氀甀攀 
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开椀渀琀开最爀攀愀琀攀爀开琀栀愀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where an integer field is greater than a given integer value.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_int_greater_than] ਀ 
      @fileintnameid bigint            = NULL,    ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
 -- Data validation	਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀洀洀漀渀 漀戀樀攀挀琀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.file_int_name_id = @fileintnameid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀  㸀 䀀椀渀琀攀最攀爀瘀愀氀甀攀 
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开椀渀琀开氀攀猀猀开琀栀愀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata where an integer field is less than a given integer value.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_int_less_than] ਀ 
      @fileintnameid bigint            = NULL,    ਀ऀ  䀀椀渀琀攀最攀爀瘀愀氀甀攀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT, -- This is the number of rows in the output table of this procedure.਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @outputfiltergroupid bigint      = NULL OUTPUT,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀    㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)         = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		@transaction_ready nchar(10)       = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numfiles = 0;਀ 
 -- Data validation	਀ 
		  -- Check the file integer name field id਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 㴀 　 
		     SET @fileintnameid = NULL;਀ऀऀ  䤀䘀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A file integer name field id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoIntNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䤀渀琀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 昀椀氀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    BEGIN਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀  
								  FROM file_attr.file_integer_field_names਀ऀऀऀ  ऀ ऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀攀开椀渀琀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀椀渀琀渀愀洀攀椀搀⤀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 椀猀 椀渀瘀愀氀椀搀 
				   BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'IntIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀琀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀऀऀ䔀一䐀 
਀          ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 瘀愀氀椀搀愀琀椀漀渀 漀昀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀 猀椀渀挀攀 椀昀 愀渀 椀渀瘀愀氀椀搀 瘀愀氀甀攀 椀猀 瀀愀猀猀攀搀 愀渀 攀爀爀漀爀 眀椀氀氀 戀攀 爀愀椀猀攀搀 
		  -- before the procedure executes. ਀ 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	      -- This means that the calling function does not need to know what filter group to use. ਀ऀऀ  ⴀⴀ 䈀甀琀 椀琀 愀氀猀漀 洀攀愀渀猀 琀栀愀琀 琀栀攀爀攀 椀猀 渀漀 漀瀀琀椀漀渀 琀漀 猀攀愀爀挀栀 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀   
		  -- Searching without a filter group is handled by a differerent procedure. ਀ऀ     䈀䔀䜀䤀一 
		     SET @filtergroupid = (SELECT default_filter_group_id ਀ऀऀऀ                         䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                        WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFGroupNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
		  ਀ ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 挀漀洀洀漀渀 漀戀樀攀挀琀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开椀渀琀攀最攀爀开瘀愀氀甀攀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.file_int_name_id = @fileintnameid   --### The search criteria    ਀ऀऀऀ  䄀一䐀 猀攀愀爀挀栀琀愀戀氀攀⸀椀渀琀开瘀愀氀甀攀  㰀 䀀椀渀琀攀最攀爀瘀愀氀甀攀 
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                              ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
			 SET @outputformid = @formid;਀ऀऀऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
								FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
									 = @outputformid)਀   
		  -- Return the actual filter group details applied.਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			 SET @filtergroupname = (SELECT fg.attr_name਀ऀऀऀऀऀऀऀऀऀ   䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
									  WHERE fg.filter_group_id = @filtergroupid)਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开爀攀愀氀开戀攀琀眀攀攀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ伀爀椀最椀渀愀氀 䌀爀攀愀琀椀漀渀 
-- Selects file IDs and metadata according where a real number between two given values.਀ⴀⴀ 䄀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀瀀瀀氀椀攀搀⸀  
-- The search is restricted to file IDs which the user has viewing rights to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_files_real_between] ਀ 
      @filerealnameid bigint           = NULL,    ਀ऀ  䀀氀漀眀攀爀开爀攀愀氀开瘀愀氀甀攀 爀攀愀氀           㴀 一唀䰀䰀Ⰰ 
	  @upper_real_value real	       = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filerealnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filerealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_real_name_id = @filerealnameid) -- Check if the file real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND (searchtable.real_value  > @lower_real_value AND searchtable.real_value < @upper_real_value)਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_real_equals]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开爀攀愀氀开攀焀甀愀氀猀崀  
਀      䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @realnumbervalue real            = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filerealnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filerealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_real_name_id = @filerealnameid) -- Check if the file real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.real_value  = @realnumbervalue਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_real_greater]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 愀挀挀漀爀搀椀渀最 眀栀攀爀攀 愀 爀攀愀氀 渀甀洀戀攀爀 漀昀 最爀攀愀琀攀爀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开爀攀愀氀开最爀攀愀琀攀爀崀  
਀      䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @realnumbervalue real            = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filerealnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filerealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_real_name_id = @filerealnameid) -- Check if the file real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.real_value  > @realnumbervalue਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_files_real_less_than]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀椀氀攀 䤀䐀猀 愀渀搀 洀攀琀愀搀愀琀愀 愀挀挀漀爀搀椀渀最 眀栀攀爀攀 愀 爀攀愀氀 渀甀洀戀攀爀 漀昀 氀攀猀猀 琀栀愀渀 愀 最椀瘀攀渀 瘀愀氀甀攀⸀ 
-- A filter group is applied. ਀ⴀⴀ 吀栀攀 猀攀愀爀挀栀 椀猀 爀攀猀琀爀椀挀琀攀搀 琀漀 昀椀氀攀 䤀䐀猀 眀栀椀挀栀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀椀氀攀猀开爀攀愀氀开氀攀猀猀开琀栀愀渀崀  
਀      䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ     
	  @realnumbervalue real            = NULL,਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 爀漀眀猀 椀渀 琀栀攀 漀甀琀瀀甀琀 琀愀戀氀攀 漀昀 琀栀椀猀 瀀爀漀挀攀搀甀爀攀⸀ 
	  @numfiles bigint                 = NULL OUTPUT,  -- This is the number of files਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@fileid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
  		file_count bigint,਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  );਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀ऀ 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀椀氀攀 爀攀愀氀 渀愀洀攀 昀椀攀氀搀 椀搀 
		  IF @filerealnameid = 0਀ऀऀ     匀䔀吀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  IF @filerealnameid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 昀椀氀攀 爀攀愀氀 渀甀洀戀攀爀 渀愀洀攀 昀椀攀氀搀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀刀攀愀氀一愀洀攀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoRealNameID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A file file real number name field id has been supplied਀ऀऀ    䈀䔀䜀䤀一 
				 IF NOT EXISTS (SELECT file_real_name_id ਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀 
			  	 				 WHERE file_real_name_id = @filerealnameid) -- Check if the file real number name field id is invalid਀ऀऀऀऀ   䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀愀氀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RealIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
			END਀ 
          -- There is no validation of the real number value since if an invalid value is passed an error will be raised਀ऀऀ  ⴀⴀ 戀攀昀漀爀攀 琀栀攀 瀀爀漀挀攀搀甀爀攀 攀砀攀挀甀琀攀猀⸀  
਀  ⴀⴀ 䘀椀氀琀攀爀 最爀漀甀瀀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the filter group exists  ਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　  
		 SET @filtergroupid = NULL;਀ऀ  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
							  FROM forms.filter_groups ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
				 BEGIN  -- The filter group does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FGNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no filter group supplied then retrieve the default and then check the default਀ऀ      ⴀⴀ 吀栀椀猀 洀攀愀渀猀 琀栀愀琀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 眀栀愀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀漀 甀猀攀⸀  
		  -- But it also means that there is no option to search without a filter group.  ਀ऀऀ  ⴀⴀ 匀攀愀爀挀栀椀渀最 眀椀琀栀漀甀琀 愀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 栀愀渀搀氀攀搀 戀礀 愀 搀椀昀昀攀爀攀爀攀渀琀 瀀爀漀挀攀搀甀爀攀⸀  
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ऀऀ   
 -- End data validation਀ 
 -- ==================================================================਀ 
IF @transaction_ready = 'Ready'਀䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
	-- Select the files for the given common object਀ऀ圀䤀吀䠀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 ⠀ 
	   SELECT fm.file_id AS ID਀ऀ     䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 䄀匀 昀洀 
   INNER JOIN file_attr.file_real_number_values AS searchtable਀           伀一            昀洀⸀昀椀氀攀开椀搀 
		      = searchtable.file_id਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
           ON fm.file_id = perm.file_id  ਀ऀ    圀䠀䔀刀䔀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开爀攀愀氀开渀愀洀攀开椀搀 㴀 䀀昀椀氀攀爀攀愀氀渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀     
			  AND searchtable.real_value  < @realnumbervalue਀ 
-- Apply filter group filtering.਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Radio button attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_radiob_attr_fgroup_links AS fgl਀    圀䠀䔀刀䔀 昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_radio_button_links AS drbl਀          圀䠀䔀刀䔀 搀爀戀氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 㴀 昀最氀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开椀搀 
            AND drbl.file_id = searchtable.file_id਀      ⤀ 
)਀䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
    -- Multi-select attribute failure਀    匀䔀䰀䔀䌀吀 ㄀ 
    FROM file_attr.file_ms_attr_fgroup_links AS dmsafgl਀    圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
      AND NOT EXISTS (਀          匀䔀䰀䔀䌀吀 ㄀ 
          FROM file_attr.file_multi_select_links AS dmsl਀          圀䠀䔀刀䔀 搀洀猀氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀昀椀氀攀开洀猀开愀琀琀爀开椀搀 
            AND dmsl.file_id = searchtable.file_id਀      ⤀ 
)਀ऀ                     ⤀ 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀昀椀氀攀开挀漀甀渀琀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 瀀漀猀椀琀椀漀渀⤀ 
	(SELECT  ਀ऀऀ     䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 昀椀⸀䤀䐀⤀ 䄀匀 昀椀氀攀开挀漀甀渀琀Ⰰ  ⴀⴀ 吀栀椀猀 椀渀昀漀爀洀猀 琀栀攀 挀愀氀氀椀渀最 愀瀀瀀氀椀挀愀琀椀漀渀 栀漀眀 琀漀 瀀愀爀猀攀 琀栀攀 搀愀琀愀 椀渀琀漀 爀漀眀猀 猀椀渀挀攀  
			                                                              -- each row in this table is a field. ਀ऀऀऀ 昀椀⸀䤀䐀                    䄀匀 昀椀氀攀开椀搀Ⰰ  
			 file_data.field_type     AS field_type, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			 file_data.field_name     AS field_name, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			 file_data.attr_id        AS attr_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			 file_data.units          AS units,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 瀀漀猀椀琀椀漀渀 
		FROM FileListCTE AS fi਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开昀氀开搀愀琀愀开戀礀开昀爀洀开吀嘀䘀⠀昀椀⸀䤀䐀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 昀椀氀攀开搀愀琀愀⤀㬀 
਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䴀䄀堀⠀昀椀氀攀开挀漀甀渀琀⤀ 昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
					ad.file_count                 AS 'Record',਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ  
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀ        䤀匀一唀䰀䰀⠀愀搀⸀瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀       䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData as ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䘀椀氀攀 䤀䐀✀㬀 
਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
--============================================================਀ 
		  -- Return the actual form details applied.  ਀ऀऀऀ 匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
			 SET @formname = (SELECT form_name ਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
							   WHERE fin.form_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ऀऀ  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
			 SET @outputfiltergroupid = @filtergroupid਀ऀऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
									   FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀  㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numfiles = ISNULL(@numfiles, 0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_filter_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㈀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Select one filter group਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_filter_group] ਀ऀ 
	 @filtergroupid bigint             = '' ,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@fg_invalidmessage nvarchar(200)    = '', -- Communicates that the filter group id was invalid਀ऀऀ䀀渀漀搀愀琀愀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀愀琀愀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@transaction_ready nchar(10)       = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Check that the filter group exists.  Fail if it doesn't.਀  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 　 
     SET @filtergroupid = NULL;਀  䤀䘀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 䤀匀 一唀䰀䰀 
     BEGIN  -- No filter group supplied਀        匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
		SET @data_validation_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀愀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ऀ       匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
        ELSE ਀ऀ         匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀愀⸀✀㬀 
	 END  ਀  䔀䰀匀䔀 
     BEGIN -- Check if the filter group does not exist਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
                          FROM forms.filter_groups ਀                         圀䠀䔀刀䔀 昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀  
             BEGIN  -- The filter group does not exist਀               䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                    @message_id = 'FGNotExist', ਀ऀऀऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	           IF @tempmessage IS NOT NULL ਀ऀ              匀䔀吀 䀀昀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	           ELSE ਀ऀऀऀऀ    匀䔀吀 䀀昀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀䜀一漀琀䔀砀椀猀琀⸀✀㬀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	         END ਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
  	  BEGIN TRY਀ऀ    匀䔀䰀䔀䌀吀  
	           filter_group_id   AS 'Filter Group ID',਀               䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
	           attr_name         AS 'Filter Group Name',਀               䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
	           list_position     AS 'List Position'਀ऀ      䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 
	     WHERE filter_group_id = @filtergroupid਀ऀ  伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	            SET @transactionmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
			      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
          @message_id   = 'SelectError', ਀          䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	       CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ    䔀䰀匀䔀 
		    SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
	END  -- End executing the query਀ऀ 
     ਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀昀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@nodatamessage <> '')              SET @message = @message + ' | ' +@nodatamessage;਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_fl_by_fnct_list_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Selects file metadata for according to a duty function list general field name.਀ⴀⴀ 䐀愀琀愀 椀猀 爀攀琀甀爀渀攀搀 愀挀挀漀爀搀椀渀最 琀漀 愀 最椀瘀攀渀 昀漀爀洀 椀搀⸀  䤀昀 渀漀 昀漀爀洀 椀搀 椀猀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 
-- the default is used. ਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_fl_by_fnct_list_name] ਀ 
      @genfield_nameid bigint          = NULL,  ਀ऀ  䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀            㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀ 
	  @formid bigint                   = NULL,  -- This is optional, providing that the global defaults contains a default value. ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀  
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
 -- Data Validation਀  
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
 -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
਀ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀椀氀琀攀爀 最爀漀甀瀀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀ 
	SET @outputfiltergroupid = @filtergroupid਀ऀ匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀最⸀愀琀琀爀开渀愀洀攀 
							FROM forms.filter_groups AS fg਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 
਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀氀开戀礀开瀀瀀氀开氀椀猀琀开渀愀洀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀 洀攀琀愀搀愀琀愀 昀漀爀 愀挀挀漀爀搀椀渀最 琀漀 愀 瀀攀漀瀀氀攀 氀椀猀琀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀⸀ 
-- Data is returned according to a given form id.  If no form id is supplied then਀ⴀⴀ 琀栀攀 搀攀昀愀甀氀琀 椀猀 甀猀攀搀⸀  
-- For file content extraction see usp_SEL_file.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀氀开戀礀开瀀瀀氀开氀椀猀琀开渀愀洀攀崀  
਀      䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 戀椀最椀渀琀          㴀 一唀䰀䰀Ⰰ   
	  @filtergroupid bigint            = NULL,  -- This is optional, providing that the global defaults contains a default value.਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ  ⴀⴀ 吀栀椀猀 椀猀 漀瀀琀椀漀渀愀氀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 最氀漀戀愀氀 搀攀昀愀甀氀琀猀 挀漀渀琀愀椀渀猀 愀 搀攀昀愀甀氀琀 瘀愀氀甀攀⸀  
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀昀椀氀攀猀 戀椀最椀渀琀                 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀㬀 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀   
਀  
 -- Data Validation਀  
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 昀爀漀洀 最氀漀戀愀氀 猀攀琀琀椀渀最猀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀  
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ 
਀ ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 
		  IF @genfield_nameid = 0਀ऀऀऀ 匀䔀吀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check general field name id has been supplied਀ऀऀ  䤀䘀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoGFNameID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䜀䘀一愀洀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the general field name id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			                 FROM people.general_field_names਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'GFNameIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䜀䘀一愀洀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END  ਀ 
਀ऀऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
		  ELSE ਀ऀऀऀ   匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
		END਀ 
	  -- End data validation਀ 
--========================================਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
BEGIN਀ 
	BEGIN TRY਀ऀⴀⴀ 匀攀氀攀挀琀 琀栀攀 昀椀氀攀猀 昀漀爀 琀栀攀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 
	WITH FileListCTE AS (਀ऀ   匀䔀䰀䔀䌀吀 昀洀⸀昀椀氀攀开椀搀 䄀匀 䤀䐀 
	     FROM base.file_metadata AS fm਀   䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ ⌀⌀ 吀栀攀 猀攀愀爀挀栀 琀愀戀氀攀 
           ON            fm.file_id਀ऀऀ      㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  -- Apply permission filtering਀           伀一 昀洀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀   
	    WHERE searchtable.general_field_name_id਀ऀऀ               㴀 䀀最攀渀昀椀攀氀搀开渀愀洀攀椀搀   ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀  
਀ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最⸀ 
AND NOT EXISTS (਀    ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
    WHERE fgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
          WHERE drbl.file_radiob_attr_id = fgl.file_radiob_attr_id਀            䄀一䐀 搀爀戀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
AND NOT EXISTS (਀    ⴀⴀ 䴀甀氀琀椀ⴀ猀攀氀攀挀琀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
    SELECT 1਀    䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀猀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀洀猀愀昀最氀 
    WHERE dmsafgl.filter_group_id = @filtergroupid਀      䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
          SELECT 1਀          䘀刀伀䴀 昀椀氀攀开愀琀琀爀⸀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀 䄀匀 搀洀猀氀 
          WHERE dmsl.file_ms_attr_id = dmsafgl.file_ms_attr_id਀            䄀一䐀 搀洀猀氀⸀昀椀氀攀开椀搀 㴀 猀攀愀爀挀栀琀愀戀氀攀⸀昀椀氀攀开椀搀 
      )਀⤀ 
	                     )਀ 
	INSERT INTO @AttData  (file_count, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, position)਀ऀ⠀匀䔀䰀䔀䌀吀   
		     DENSE_RANK() OVER (ORDER BY fi.ID) AS file_count,  -- This informs the calling application how to parse the data into rows since ਀ऀऀऀ                                                    ⴀⴀ 攀愀挀栀 爀漀眀 椀渀 琀栀椀猀 琀愀戀氀攀 椀猀 愀 昀椀攀氀搀⸀  
			 fi.ID                    AS file_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			 file_data.field_name_id  AS field_name_id, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			 file_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			 file_data.attr_value     AS attr_value, ਀ऀऀऀ 昀椀氀攀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			 file_data.form_position  AS position਀ऀऀ䘀刀伀䴀 䘀椀氀攀䰀椀猀琀䌀吀䔀 䄀匀 昀椀 
		CROSS APPLY internal.ufn_SEL_one_fl_data_by_frm_TVF(fi.ID, @formid) AS file_data);਀ 
			SELECT @numfiles = MAX(file_count) from @AttData;਀ 
			 SELECT ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀开挀漀甀渀琀                 䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.fileid                     AS 'File ID', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
			        ISNULL(ad.field_mnemonic, '') AS 'Mnemonic', ਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
			        ISNULL(ad.position, '')       AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 愀猀 愀搀 
		   ORDER BY Position, Record, 'File ID';਀ 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ⴀⴀ㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀ 
	SET @numrows  = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀昀椀氀攀猀Ⰰ 　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀氀开挀洀开漀戀樀开洀猀开氀渀欀开戀礀开昀氀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 16-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 挀漀洀洀漀渀漀戀樀攀挀琀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 戀礀 昀椀氀攀 
-- Input is a file id.  Output is a list of common objects linked to that file਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_fl_cm_obj_ms_lnk_by_fl]਀ 
	  @fileid bigint                   = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)  = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
	    @validationmessage nvarchar(200)   = '', -- Communicates that the transaction failed due to data validation਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀  㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)      = '', -- Communicates that no file id was supplied਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                         -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
-- Validation checks਀  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
     SET @fileid = NULL;਀   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀渀✀琀⸀ 
  IF @fileid IS NULL਀     䈀䔀䜀䤀一 
	   SET @data_validation_status = 'Fail';਀ऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
       EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
		    @message_text = @tempmessage OUTPUT;਀  ऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	      SET @nofileidmessage = @tempmessage;਀ऀ   䔀䰀匀䔀  
		   SET @nofileidmessage = 'A database level message error occurred on NoFileID.';਀ऀ 䔀一䐀 
  ELSE -- A file id has been supplied਀     䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
			EXEC [internal].[usp_AUTHENTICATE_user_file_id] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- file id does not exist or the user does not have permission to access it਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䘀椀氀攀 䤀䐀㨀 ✀ ⬀ 䰀䔀䘀吀⠀䌀伀一嘀䔀刀吀⠀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ㈀　⤀ ⬀ ✀⸀⸀⸀ ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
					END਀ऀ 䔀一䐀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
		  SELECT @fileid                        AS 'File ID',਀ऀऀऀऀ 挀漀氀渀⸀氀椀猀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 co.object_name                 AS 'Common Object Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀洀渀攀洀Ⰰ ✀✀⤀            䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 ISNULL(co.description, '')     AS 'Common Object Description',਀ऀऀऀऀ 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀            䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䤀䐀✀Ⰰ 
				 ISNULL(coa.attr_name, '')      AS 'Common Object Attribute Name',਀ऀऀऀऀ 挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				 coln.common_object_list_id     AS 'Common Object List ID',਀ऀऀऀऀ 挀漀氀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀              䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
			FROM com_obj.common_objects  AS co਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀 䄀匀 挀漀愀 
				  ON   coa.common_object_attribute_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
			LEFT JOIN com_obj.common_object_lists AS col਀ऀऀऀऀ  伀一   挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = co.common_object_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀 䄀匀 挀漀氀渀 
				  ON    coln.common_object_list_id਀ऀऀऀऀऀ  㴀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
			LEFT JOIN com_obj.file_to_com_obj_ms_list_links AS comsll਀ऀऀऀऀ  伀一       挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  = comsll.common_object_id਀ऀऀऀऀऀ  䄀一䐀  挀漀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  = comsll.common_object_list_id਀ऀऀऀऀ圀䠀䔀刀䔀 挀漀洀猀氀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀 
			ORDER BY 'Common Object List Name', 'List Position';਀ 
  		  IF @@ROWCOUNT = 0਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @zerorecordsmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
				   SET @zerorecordsmessage = 'A database level message error occurred on ZeroRecords.';਀ऀऀऀ䔀一䐀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @transactionmessage = @tempmessage;਀ऀऀऀ   䔀䰀匀䔀  
					SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ䔀一䐀 吀刀夀 
		BEGIN CATCH਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀऀ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		  ELSE਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
		END CATCH਀ऀ䔀一䐀 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
    IF (@nofileidmessage <> '')            SET @message = @message + ' | ' + @nofileidmessage;਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀氀开挀洀开漀戀樀开爀戀开氀渀欀开戀礀开昀氀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 17-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀椀氀攀 挀漀洀洀漀渀漀戀樀攀挀琀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 戀礀 昀椀氀攀 
-- Input is a file id.  Output is a list of common objects linked to that file਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_fl_cm_obj_rb_lnk_by_fl]਀ 
	  @fileid bigint                   = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀऀ䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 稀攀爀漀 爀攀挀漀爀搀猀 眀栀攀爀攀 爀攀琀爀椀攀瘀攀搀 
	    @validationmessage nvarchar(200)    = '', -- Communicates that the transaction failed due to data validation਀        䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀椀氀攀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nofileidmessage nvarchar(200)      = '', -- Communicates that no file id was supplied਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                         -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
-- Validation checks਀  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
     SET @fileid = NULL;਀   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀渀✀琀⸀ 
  IF @fileid IS NULL਀     䈀䔀䜀䤀一 
	   SET @data_validation_status = 'Fail';਀ऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
       EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
		    @message_text = @tempmessage OUTPUT;਀  ऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	      SET @nofileidmessage = @tempmessage;਀ऀ   䔀䰀匀䔀  
		   SET @nofileidmessage = 'A database level message error occurred on NoFileID.';਀ऀ 䔀一䐀 
  ELSE -- A file id has been supplied਀     䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
			EXEC [internal].[usp_AUTHENTICATE_user_file_id] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- file id does not exist or the user does not have permission to access it਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䘀椀氀攀 䤀䐀㨀 ✀ ⬀ 䰀䔀䘀吀⠀䌀伀一嘀䔀刀吀⠀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ㈀　⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀昀椀氀攀椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀㬀 
					END਀ऀ 䔀一䐀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
		  SELECT @fileid                        AS 'File ID',਀ऀऀऀऀ 挀漀氀渀⸀氀椀猀琀开渀愀洀攀                 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 co.object_name                 AS 'Common Object Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀挀漀⸀洀渀攀洀Ⰰ ✀✀⤀            䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 ISNULL(co.description, '')     AS 'Common Object Description',਀ऀऀऀऀ 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀            䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䤀䐀✀Ⰰ 
				 ISNULL(coa.attr_name, '')      AS 'Common Object Attribute Name',਀ऀऀऀऀ 挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 䄀匀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				 coln.common_object_list_id     AS 'Common Object List ID'਀ऀऀऀ䘀刀伀䴀 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀猀  䄀匀 挀漀 
			LEFT JOIN com_obj.common_object_attributes AS coa਀ऀऀऀऀ  伀一   挀漀愀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀开椀搀 
					  = co.common_object_attribute_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀猀 䄀匀 挀漀氀 
				  ON   col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
			LEFT JOIN com_obj.common_object_list_names AS coln਀ऀऀऀऀ  伀一    挀漀氀渀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
					  =  col.common_object_list_id਀ऀऀऀ䰀䔀䘀吀 䨀伀䤀一 挀漀洀开漀戀樀⸀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀 䄀匀 挀漀爀戀氀氀 
				  ON       col.common_object_id਀ऀऀऀऀऀ  㴀 挀漀爀戀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开椀搀 
					  AND  col.common_object_list_id਀ऀऀऀऀऀ  㴀 挀漀爀戀氀氀⸀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开椀搀 
				WHERE corbll.file_id = @fileid਀ऀऀऀ伀刀䐀䔀刀 䈀夀 ✀䌀漀洀洀漀渀 伀戀樀攀挀琀 䰀椀猀琀 一愀洀攀✀㬀 
਀  ऀऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'ZeroRecords', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀ   匀䔀吀 䀀稀攀爀漀爀攀挀漀爀搀猀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀㬀 
			END਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'Success', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
			   ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		  SET @transaction_status = 'Good';਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
			 CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ  䔀䰀匀䔀 
			   SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀऀ䔀一䐀 䌀䄀吀䌀䠀 
	END਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@zerorecordsmessage <> '')         SET @message = @message + ' | ' + @zerorecordsmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@fileinvalidmessage <> '')         SET @message = @message + ' | ' + @fileinvalidmessage;਀    䤀䘀 ⠀䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀            匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀昀椀氀攀椀搀洀攀猀猀愀最攀㬀 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀渀挀琀开氀椀猀琀猀开戀礀开昀甀渀挀琀椀漀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists function lists for a given function from people.function_lists.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀 昀甀渀挀琀椀漀渀 椀搀⸀ 
-- Output is a list of function lists, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists function lists for a given function from people.function_lists.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @functionid bigint:  Must be a valid function id from the duty_functions table਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀甀渀挀琀椀漀渀 氀椀猀琀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 攀爀爀漀爀猀 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_fnct_lists_by_function] ਀ 
     @functionid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 
		  IF @functionid = 0਀ऀऀऀ 匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀  
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions AS df਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctionIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT @functionid                 AS 'Duty Function ID',਀ऀऀऀऀ 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀         䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 ISNULL(fln.mnem, '')        AS 'Function List Mnemonic',਀ऀऀऀऀ 昀氀渀⸀渀愀洀攀                    䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 ISNULL(fln.description, '') AS 'Function List Description',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀Ⰰ 　⤀ 䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
            FROM people.function_lists AS fl਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
	          ON    fl.function_list_id  ਀ऀऀऀ     㴀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		   WHERE fl.function_id = @functionid਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_fnct_lists_for_user]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 戀攀氀漀渀最猀 琀漀⸀ 
-- Output is a list of record details, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists all function lists which the connected user belongs to.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* -None਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 昀甀渀挀琀椀漀渀 氀椀猀琀 爀攀挀漀爀搀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_fnct_lists_for_user] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 fl.function_list_id         AS 'Function List ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 fln.name                    AS 'Function List Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀昀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 ISNULL(fl.list_position, 0) AS 'Function List Position',਀ऀऀऀऀ 搀昀⸀昀甀渀挀琀椀漀渀开椀搀              䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ  
				 ISNULL(df.mnem, '')         AS 'Duty Function Mnemonic',਀ऀऀऀऀ 搀昀⸀渀愀洀攀                     䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
				 ISNULL(df.description, '')  AS 'Duty Function Description'਀            䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
	   LEFT JOIN people.function_list_names AS fln਀ऀ          伀一    昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀   
			     = fln.function_list_id਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
	          ON    fl.function_id਀ऀऀऀ      㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
       LEFT JOIN people.duty_function_sid_links AS dfsl਀ऀ          伀一      搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			      = dfsl.function_id਀ऀ   䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 匀䰀 
	          ON  dfsl.sid_id਀ऀऀऀ     㴀  猀氀⸀猀椀搀开椀搀 
	       WHERE sl.sid = @connectedusersid   			      ਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀ 䄀匀䌀Ⰰ ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 䄀匀䌀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀漀爀洀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-08-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀 漀渀攀 昀漀爀洀 最爀漀甀瀀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀漀爀洀开最爀漀甀瀀崀  
	਀ऀ 䀀昀漀爀洀最爀漀甀瀀椀搀 戀椀最椀渀琀               㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)    = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀昀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 昀漀爀洀 最爀漀甀瀀 椀搀 眀愀猀 椀渀瘀愀氀椀搀 
		@nodatamessage nvarchar(200)        = '', -- Communicates that no data was supplied਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 最爀漀甀瀀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
  IF @formgroupid = 0਀     匀䔀吀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
  IF @formgroupid IS NULL਀     䈀䔀䜀䤀一  ⴀⴀ 一漀 昀漀爀洀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 
        SET @formgroupid = NULL;਀ऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready      = 'Fail';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id = 'NoFormGroupID', @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	       SET @nodatamessage = @tempmessage;਀        䔀䰀匀䔀  
	         SET @nodatamessage = 'A database level message error occurred on NoFormGroupID.';਀ऀ 䔀一䐀   
  ELSE਀     䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀漀爀洀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
         IF NOT EXISTS (SELECT form_group_id ਀                          䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
                         WHERE form_group_id = @formgroupid) ਀             䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
               EXEC internal.usp_SEL_message ਀                    䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀洀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
			        @message_text = @tempmessage OUTPUT;਀  ऀ           䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	              SET @fg_invalidmessage = @tempmessage;਀ऀ           䔀䰀匀䔀  
				    SET @fg_invalidmessage = 'A database level message error occurred on FmGNotExist.';਀               匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀ         䔀一䐀  
	 END   -- End checking form group ਀ 
  IF @data_validation_status = 'Fail'਀    䈀䔀䜀䤀一 
      EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀      䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @transactionmessage = @tempmessage;਀ऀ  䔀䰀匀䔀  
		   SET @transactionmessage = 'A database level message error occurred on FailedDataValidation.';਀ऀ䔀一䐀 
  -- End data validation਀ 
  -- Execute the query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀  ऀ  䈀䔀䜀䤀一 吀刀夀 
			SELECT ਀ऀऀऀऀ   昀漀爀洀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				   ISNULL(mnem, '')  AS 'Mnemonic',਀ऀऀऀऀ   愀琀琀爀开渀愀洀攀         䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				   ISNULL(descr, '') AS 'Description',਀ऀऀऀऀ   氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
			  FROM forms.form_group_names਀ऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
		  ORDER BY list_position;਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				 @message_id   = 'Success', ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				 IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
				 ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
			SET @transaction_status = 'Good';਀ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
        EXEC internal.usp_SEL_message ਀          䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
          @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	       SET @transactionmessage = @tempmessage + ' | ' + ਀ऀ       䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
	    ELSE਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀㬀 
	  END CATCH਀ऀ䔀一䐀  ⴀⴀ 䔀渀搀 攀砀攀挀甀琀椀渀最 琀栀攀 焀甀攀爀礀 
	਀      
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀    䤀䘀 ⠀䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@fg_invalidmessage <> '')          SET @message = @message + ' | ' + @fg_invalidmessage;਀ऀ䤀䘀 ⠀䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀              匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀䀀渀漀搀愀琀愀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_form_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㈀ⴀ　㠀ⴀ㈀　㈀㌀ 
-- Description:	Select one form name਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_form_name] ਀ऀ 
	 @formnameid bigint                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)   = '', -- Communicates what was the outcome of the transaction਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@form_invalidmessage nvarchar(200)  = '', -- Communicates that the form name id was invalid਀ऀऀ䀀渀漀搀愀琀愀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 渀漀 搀愀琀愀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		@transaction_ready nchar(10)        = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  -- Check that the transaction group exists.  Fail if it doesn't.਀  䤀䘀 䀀昀漀爀洀渀愀洀攀椀搀 㴀 　 
     SET @formnameid = NULL;਀  䤀䘀 䀀昀漀爀洀渀愀洀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN  -- No form id supplied਀        匀䔀吀 䀀昀漀爀洀渀愀洀攀椀搀 㴀 一唀䰀䰀㬀 
		SET @data_validation_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀愀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ऀ       匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
        ELSE ਀ऀ         匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀愀⸀✀㬀 
	 END  ਀  䔀䰀匀䔀 
     BEGIN -- Check if the form id does not exist਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
                          FROM forms.form_identifier_names ਀                         圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀渀愀洀攀椀搀⤀  
             BEGIN  -- The form does not exist਀               䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                    @message_id = 'FormNotExist', ਀ऀऀऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	           IF @tempmessage IS NOT NULL ਀ऀ              匀䔀吀 䀀昀漀爀洀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	           ELSE ਀ऀऀऀऀ    匀䔀吀 䀀昀漀爀洀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀㬀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	         END ਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 最爀漀甀瀀  
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
  	  BEGIN TRY਀ऀ    匀䔀䰀䔀䌀吀  
	           form_id       AS 'Form ID',਀ऀऀऀ   昀漀爀洀开最爀漀甀瀀开椀搀 䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL((਀ऀऀऀऀऀ匀䔀䰀䔀䌀吀 昀最渀⸀愀琀琀爀开渀愀洀攀 
					  FROM forms.form_group_names AS fgn਀ऀऀऀऀऀ 圀䠀䔀刀䔀 昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 㴀 昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
				), '')           AS 'Form Group Name',਀ऀऀऀ   昀漀爀洀开渀愀洀攀         䄀匀 ✀䘀漀爀洀 一愀洀攀✀Ⰰ  
	           mnem          AS 'Mnemonic',਀ऀ           搀攀猀挀爀         䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
	           list_position AS 'List Position'਀ऀ      䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
	     WHERE form_id = @formnameid਀ऀ  伀刀䐀䔀刀 䈀夀 氀椀猀琀开瀀漀猀椀琀椀漀渀㬀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	            SET @transactionmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
			      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
          @message_id   = 'SelectError', ਀          䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF @tempmessage IS NOT NULL ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	       CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ    䔀䰀匀䔀 
		    SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
	END  -- End executing the query਀ऀ 
     ਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀昀漀爀洀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀昀漀爀洀开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@nodatamessage <> '')              SET @message = @message + ' | ' +@nodatamessage;਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀漀爀洀猀开戀礀开昀漀爀洀开最爀漀甀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-01-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 昀漀爀洀猀 椀搀攀渀琀椀昀椀攀爀猀 昀漀爀 愀 最椀瘀攀渀 昀漀爀洀 最爀漀甀瀀 
-- Output is a list of form names,਀ⴀⴀ 瀀氀甀猀 愀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀漀爀洀猀开戀礀开昀漀爀洀开最爀漀甀瀀崀  
	਀  䀀昀漀爀洀最爀漀甀瀀椀搀 戀椀最椀渀琀              㴀 一唀䰀䰀Ⰰ 
  @message nvarchar(1000)          = NULL OUTPUT,਀  䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
  @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)        = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
  ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀    ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 昀漀爀洀 最爀漀甀瀀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
  IF @formgroupid = 0਀     匀䔀吀 䀀昀漀爀洀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
  IF @formgroupid IS NULL਀     䈀䔀䜀䤀一  ⴀⴀ 一漀 昀漀爀洀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 
        SET @formgroupid = NULL;਀ऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		SET @transaction_ready      = 'Fail';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
             @message_id = 'NoFormGroupID', @message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀        䔀䰀匀䔀  
	         SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFormGroupID.');਀ऀ 䔀一䐀   
  ELSE਀     䈀䔀䜀䤀一 ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀漀爀洀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
         IF NOT EXISTS (SELECT form_group_id ਀                          䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀  
                         WHERE form_group_id = @formgroupid) ਀             䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀洀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FmGNotExist.');਀ऀऀऀ䔀一䐀 
਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 最爀漀甀瀀  
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀऀ䔀一䐀 
		  -- End data validation਀ 
  -- Execute the query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ 
	  BEGIN TRY਀ऀऀ   匀䔀䰀䔀䌀吀  
				   form_id           AS 'Form ID', ਀ऀऀऀऀ   昀漀爀洀开最爀漀甀瀀开椀搀     䄀匀 ✀䘀漀爀洀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				   form_name         AS 'Form Name', ਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ  
				   ISNULL(descr, '') AS 'Description', ਀ऀऀऀऀ   氀椀猀琀开瀀漀猀椀琀椀漀渀     䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀  
			  FROM forms.form_identifier_names AS fin਀ऀऀऀ 圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 㴀 䀀昀漀爀洀最爀漀甀瀀椀搀 
		  ORDER BY list_position;਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
  			IF @@ROWCOUNT = 0਀ऀऀऀ  䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
					 @message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ 䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀  
					 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀऀऀ  䔀一䐀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
				 @message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
			SET @transaction_status = 'Bad';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				 @message_id   = 'SelectError', ਀ऀऀऀऀ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
				CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
  END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_function_lists_by_doc]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Reads all of the function lists for a given document. ਀ 
-- Input is the file id   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀 愀渀搀 琀栀攀 氀椀猀琀 漀昀 昀甀渀挀琀椀漀渀 氀椀猀琀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀甀渀挀琀椀漀渀开氀椀猀琀猀开戀礀开搀漀挀崀  
     @documentid nvarchar(50)          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
	-- Validation checks਀ 
 -- Document id validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Doc id was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀऀ䔀一䐀 
		-- End document id validation਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀          䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
			       fln.function_list_id AS 'Function List ID',਀ऀऀऀ       昀氀渀⸀洀渀攀洀ऀऀऀऀ䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				   fln.name				AS 'Function List Name',਀ऀऀऀऀ   昀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀ऀऀ䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				   fln.list_position	AS 'Position',਀ऀऀऀऀ   最昀渀⸀渀愀洀攀             䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
				   gfn.general_field_name_id AS 'General Field Name ID'਀ऀऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀 䄀匀 瀀琀昀氀氀 
		 LEFT JOIN people.function_list_names AS fln਀ऀऀ        伀一 瀀琀昀氀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
				   = fln.function_list_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
		        ON     gfn.general_field_name_id਀ऀऀऀऀ   㴀 瀀琀昀氀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			 WHERE ptfll.doc_id = @documentid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_function_lists_by_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㌀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Reads all of the function lists for a given file. ਀ 
-- Input is the file id   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀 愀渀搀 琀栀攀 氀椀猀琀 漀昀 昀甀渀挀琀椀漀渀 氀椀猀琀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀甀渀挀琀椀漀渀开氀椀猀琀猀开戀礀开昀椀氀攀崀  
     @fileid bigint                    = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                              -- or alternatively if the file does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
	-- Validation checks਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 瘀椀攀眀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_user_file_id] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
						@user_authentication_result = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			SELECT @fileid              AS 'File ID',਀ऀऀऀ       昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
			       fln.mnem				AS 'Mnemonic',਀ऀऀऀऀ   昀氀渀⸀渀愀洀攀ऀऀऀऀ䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				   fln.description		AS 'Description',਀ऀऀऀऀ   昀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀ऀ䄀匀 ✀倀漀猀椀琀椀漀渀✀Ⰰ 
				   gfn.name                    AS 'General Field Name',਀ऀऀऀऀ   最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀   䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
			  FROM people.file_to_function_list_links AS ftfll਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
		        ON ftfll.function_list_id਀ऀऀऀऀ   㴀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		 LEFT JOIN people.general_field_names AS gfn਀ऀऀ        伀一     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
				   = ftfll.general_field_name_id਀ऀऀऀ 圀䠀䔀刀䔀 昀琀昀氀氀⸀昀椀氀攀开椀搀 㴀 䀀昀椀氀攀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀甀渀挀琀椀漀渀猀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀愀搀猀 愀氀氀 漀昀 琀栀攀 昀甀渀挀琀椀漀渀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀⸀  
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 椀搀    
-- Output is a message and status and the list of functions.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_functions_by_doc] ਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
			END਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			SELECT @documentid      AS 'Document ID',਀ऀऀऀ       搀昀⸀昀甀渀挀琀椀漀渀开椀搀   䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ 
			       df.mnem			AS 'Mnemonic',਀ऀऀऀऀ   搀昀⸀渀愀洀攀ऀऀऀ䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
				   df.description	AS 'Description',਀ऀऀऀऀ   搀昀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀ऀ䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				   gfn.name         AS 'General Field Name',਀ऀऀऀऀ   最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
			  FROM people.doc_to_function_links AS dtfl਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
		        ON  dtfl.function_id਀ऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		 LEFT JOIN people.general_field_names AS gfn਀ऀऀ        伀一    最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
				   = dtfl.general_field_name_id਀ऀऀऀ 圀䠀䔀刀䔀 搀琀昀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀甀渀挀琀椀漀渀猀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀愀搀猀 愀氀氀 漀昀 琀栀攀 昀甀渀挀琀椀漀渀猀 昀漀爀 愀 最椀瘀攀渀 昀椀氀攀⸀  
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 椀搀    
-- Output is a message and status and the list of functions.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_functions_by_file] ਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to view the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 						@file_id_to_check =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀          䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			       df.function_id   AS 'Duty Function ID',਀ऀऀऀ       搀昀⸀洀渀攀洀ऀऀऀ䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				   df.name			AS 'Duty Function Name',਀ऀऀऀऀ   搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀ऀ䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				   df.list_position	AS 'List Position',਀ऀऀऀऀ   最昀渀⸀渀愀洀攀                    䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
				   gfn.general_field_name_id   AS 'General Field Name ID'਀ऀऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀 䄀匀 昀琀昀氀 
		 LEFT JOIN people.duty_functions AS df਀ऀऀ        伀一 昀琀昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
				   = df.function_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
		        ON    gfn.general_field_name_id਀ऀऀऀऀ   㴀 昀琀昀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			 WHERE ftfl.file_id = @fileid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_functions_by_fnct_list]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 昀甀渀挀琀椀漀渀猀 昀漀爀 愀 最椀瘀攀渀 昀甀渀挀琀椀漀渀 氀椀猀琀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀⸀ 
-- Input is a function list id.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 昀甀渀挀琀椀漀渀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 昀甀渀挀琀椀漀渀猀 昀漀爀 愀 最椀瘀攀渀 昀甀渀挀琀椀漀渀 氀椀猀琀 昀爀漀洀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀㨀  䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 昀甀渀挀琀椀漀渀 氀椀猀琀 椀搀 昀爀漀洀 琀栀攀 昀甀渀挀琀椀漀渀氀椀猀琀开渀愀洀攀猀 琀愀戀氀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of duty functions.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - Data validation errors਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开昀甀渀挀琀椀漀渀猀开戀礀开昀渀挀琀开氀椀猀琀崀  
਀     䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 戀椀最椀渀琀           㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
	  -- Check the function list id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 㴀 　 
	     SET @functionlistid = NULL;਀      䤀䘀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionListID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䰀椀猀琀䤀䐀⸀✀⤀㬀 
			 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 昀甀渀挀琀椀漀渀 氀椀猀琀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 椀猀 瘀愀氀椀搀 
	     BEGIN਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			                 FROM people.function_list_names AS fln਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctListIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀䰀椀猀琀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀             䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 df.function_id              AS 'Duty Function ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀洀渀攀洀Ⰰ ✀✀⤀         䄀匀 ✀䘀甀渀挀琀椀漀渀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 df.name                     AS 'Duty Function Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀䘀甀渀挀琀椀漀渀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 ISNULL(fl.list_position, 0) AS 'List Position'਀            䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
	   LEFT JOIN people.duty_functions AS df਀ऀ          伀一    昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
			      = df.function_id਀ऀऀ   圀䠀䔀刀䔀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀氀椀猀琀椀搀 
		ORDER BY 'List Position';਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_general_field_names]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㔀ⴀ　㤀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 
-- Output is a list of field names, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
-- =============================================਀ 
CREATE PROCEDURE [reading].[usp_SEL_general_field_names] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ   
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ ⴀⴀ 一漀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 愀瀀瀀氀椀挀愀戀氀攀⸀ 
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 gfn.general_field_name_id   AS 'General Field Name ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀最昀渀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 gfn.name                    AS 'General Field Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀最昀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 gfn.list_position           AS 'List Position'਀ऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀   
			ORDER BY 'List Position', 'General Field Name';਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_global_settings]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㌀ⴀ　㘀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 最氀漀戀愀氀 猀攀琀琀椀渀最猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开最氀漀戀愀氀开猀攀琀琀椀渀最猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀ 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  圀䤀吀䠀 匀攀琀琀椀渀最猀䐀愀琀愀 䄀匀 ⠀ 
਀ऀ    匀䔀䰀䔀䌀吀 ✀䰀愀渀最甀愀最攀 䤀䐀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.language_id AS Value,਀ऀऀऀ   ✀✀              䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
		 ਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䤀猀 刀攀最椀猀琀攀爀 䌀漀搀攀 䄀瀀瀀氀椀攀搀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.is_register_code_applied AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀刀攀最椀猀琀攀爀 䌀漀搀攀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.register_code AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䄀甀琀漀ⴀ䜀攀渀 䐀漀挀 䤀䐀 䰀攀渀最琀栀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.auto_gen_doc_id_length AS NVARCHAR) AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀唀猀攀 䄀甀琀漀ⴀ䜀攀渀 䐀漀挀 䤀䐀 伀渀 一甀氀氀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.use_auto_gen_doc_id_on_null AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀漀挀 䤀䐀 䘀漀爀洀愀琀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       gsg.doc_id_format AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀漀挀 䤀䐀 䰀愀猀琀 䤀渀琀攀最攀爀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.doc_id_last_integer AS NVARCHAR) AS Value,਀ऀऀऀ   ✀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ 
	    SELECT 'Date Style'   AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀愀琀攀开猀琀礀氀攀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   (SELECT datetime_style_name ਀ऀऀऀ      䘀刀伀䴀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀 
				 WHERE datetime_style = gsg.date_style) AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
	    SELECT 'Culture Code'   AS Setting,਀ऀऀ       最猀最⸀挀甀氀琀甀爀攀开挀漀搀攀 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL਀ 
	    SELECT 'Doc ID Auto-Gen Max Tries'   AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀漀挀开愀甀琀漀最攀渀开洀愀砀开琀爀椀攀猀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ऀ  
	    SELECT 'Default Filter Group ID' AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   (SELECT attr_name ਀ऀऀऀ      䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
			 LEFT JOIN base.global_settings_groups AS gsg਀ऀऀऀ        伀一 昀最⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
					   = gsg.default_filter_group_id਀ऀऀऀऀ   圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
	 ਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀攀昀愀甀氀琀 䘀漀爀洀 䤀䐀✀ 䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.default_form_id AS NVARCHAR) AS Value,਀ऀऀऀ   ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
			      FROM forms.form_identifier_names AS fin਀ऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
			        ON fin.form_id ਀ऀऀऀऀऀ   㴀 最猀最⸀搀攀昀愀甀氀琀开昀漀爀洀开椀搀 
				   WHERE gsg.setting_group_name = 'Master') AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'	਀ऀऀ  
 ਀ 
	 UNION ALL ਀ऀ  
	    SELECT 'Default Doc Free Text Name ID' AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀攀昀愀甀氀琀开搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   (SELECT attr_name ਀ऀऀऀ      䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀昀琀昀渀 
			 LEFT JOIN base.global_settings_groups AS gsg਀ऀऀऀ        伀一         搀昀琀昀渀⸀搀漀挀开昀爀攀攀开琀攀砀琀开渀愀洀攀开椀搀  
					   = gsg.default_doc_free_text_name_id਀ऀऀऀऀ   圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
	 ਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀攀昀愀甀氀琀 吀愀最 刀攀氀愀琀椀漀渀猀栀椀瀀 吀爀攀攀 䤀䐀✀ 䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.default_tag_tree_id AS NVARCHAR) AS Value,਀ऀऀऀ   ⠀匀䔀䰀䔀䌀吀 琀琀渀⸀渀愀洀攀  
			      FROM tagging.tag_tree_names AS ttn਀ऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
			        ON           ttn.tag_tree_id ਀ऀऀऀऀऀ   㴀 最猀最⸀搀攀昀愀甀氀琀开琀愀最开琀爀攀攀开椀搀 
				   WHERE gsg.setting_group_name = 'Master') AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'		 ਀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
	 ਀ऀ    匀䔀䰀䔀䌀吀 ✀䐀攀昀愀甀氀琀 吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀ 䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.default_tag_browsing_tree_id AS NVARCHAR) AS Value,਀ऀऀऀ   ⠀匀䔀䰀䔀䌀吀 琀戀琀渀⸀渀愀洀攀  
			      FROM tagging.tag_browsing_tree_names AS tbtn਀ऀऀऀ 䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
			        ON          tbtn.tag_browsing_tree_id ਀ऀऀऀऀऀ   㴀 最猀最⸀搀攀昀愀甀氀琀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
				   WHERE gsg.setting_group_name = 'Master') AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'	਀ 
	 UNION ALL ਀ 
	    SELECT 'Duplicate Management'   AS Setting,਀ऀऀ       最猀最⸀搀甀瀀氀椀挀愀琀攀开洀愀渀愀最攀洀攀渀琀 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ 
	 UNION ALL ਀ 
	    SELECT 'Recently Created Duration'   AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀挀爀攀愀琀攀搀开氀愀猀琀开洀椀渀甀琀攀猀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   'Minutes' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ऀ  
	 UNION ALL ਀ 
	    SELECT 'Enforced Retention'   AS Setting,਀ऀऀ       最猀最⸀攀渀昀漀爀挀攀搀开爀攀琀攀渀琀椀漀渀 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ऀ  
	 UNION ALL ਀ 
	    SELECT 'File Read Log'   AS Setting,਀ऀऀ       最猀最⸀昀椀氀攀开爀攀愀搀开氀漀最 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ऀ  
	 UNION ALL ਀ 
	    SELECT 'File Delete Log'   AS Setting,਀ऀऀ       最猀最⸀昀椀氀攀开搀攀氀攀琀攀开氀漀最 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀ऀ  
	 UNION ALL ਀ 
	    SELECT 'Store Plain Text Content'   AS Setting,਀ऀऀ       最猀最⸀猀琀漀爀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀 䄀匀 嘀愀氀甀攀Ⰰ 
			   '' AS Name਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 䄀匀 最猀最 
		 WHERE gsg.setting_group_name = 'Master'਀      
	 UNION ALL਀ऀ  
	    SELECT 'Default Doc Date Field ID' AS Setting,਀ऀऀ       䌀䄀匀吀⠀最猀最⸀搀攀昀愀甀氀琀开搀漀挀开搀愀琀攀开渀愀洀攀开椀搀 䄀匀 一嘀䄀刀䌀䠀䄀刀⤀ 䄀匀 嘀愀氀甀攀Ⰰ 
			   (SELECT ddfn.attr_name ਀ऀऀऀ      䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 搀搀昀渀 
			 LEFT JOIN base.global_settings_groups AS gsg਀ऀऀऀ        伀一          搀搀昀渀⸀搀漀挀开搀愀琀攀开渀愀洀攀开椀搀  
					   = gsg.default_doc_date_name_id਀ऀऀऀऀ   圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ऀ 
	 ਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䈀漀漀欀椀渀最 䤀渀 吀椀洀攀 䈀漀砀✀   䄀匀 匀攀琀琀椀渀最Ⰰ 
		       CAST(gsg.booking_in_time_box AS NVARCHAR) AS Value, ਀ऀऀऀ   ✀䴀椀渀甀琀攀猀✀ 䄀匀 一愀洀攀 
		  FROM base.global_settings_groups AS gsg਀ऀऀ 圀䠀䔀刀䔀 最猀最⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀ 
਀ऀऀ ⤀ 
਀ 
਀ 
਀ऀऀ 匀䔀䰀䔀䌀吀 ⨀ 䘀刀伀䴀 匀攀琀琀椀渀最猀䐀愀琀愀 
਀ऀ         
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开椀渀搀椀瘀开戀爀漀眀猀椀渀最开琀爀攀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 01-09-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects tag browsing tree name details for personal browsing trees for the connected user. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开椀渀搀椀瘀开戀爀漀眀猀椀渀最开琀爀攀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀䘀愀椀氀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';   ਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  BEGIN TRY਀ 
			 SELECT tbtn.tag_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					tbtn.name                 AS 'Tag Browsing Tree Name',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					tbtn.list_position        AS 'List Position'਀ऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
			  WHERE (SELECT sl.sid਀                       䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
					  WHERE     sl.sid_id਀ऀऀऀऀऀ        㴀 琀戀琀渀⸀猀椀搀开椀搀⤀ 
			        = @connectedusersid਀ऀऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_nameplate]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㜀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 琀栀攀 搀愀琀愀戀愀猀攀 渀愀洀攀瀀氀愀琀攀 搀攀琀愀椀氀猀 昀爀漀洀 攀砀琀攀渀搀攀搀 瀀爀漀瀀攀爀琀椀攀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开渀愀洀攀瀀氀愀琀攀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀ 
਀  
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  圀䤀吀䠀 一愀洀攀瀀氀愀琀攀䐀愀琀愀 䄀匀 ⠀ 
਀ऀ    匀䔀䰀䔀䌀吀 ✀倀爀漀搀甀挀琀 一愀洀攀✀   䄀匀 一愀洀攀Ⰰ 
		       ep.value AS Value਀ऀऀ  䘀刀伀䴀 猀礀猀⸀攀砀琀攀渀搀攀搀开瀀爀漀瀀攀爀琀椀攀猀 䄀匀 攀瀀 
		 WHERE ep.name = 'Product Name'਀ऀऀ  
	 UNION ALL ਀ 
	    SELECT 'Publisher'   AS Name,਀ऀऀ       攀瀀⸀瘀愀氀甀攀 䄀匀 嘀愀氀甀攀 
		  FROM sys.extended_properties AS ep਀ऀऀ 圀䠀䔀刀䔀 攀瀀⸀渀愀洀攀 㴀 ✀倀甀戀氀椀猀栀攀爀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀䴀愀樀漀爀 刀攀氀攀愀猀攀 ⌀✀   䄀匀 一愀洀攀Ⰰ 
		       ep.value AS Value਀ऀऀ  䘀刀伀䴀 猀礀猀⸀攀砀琀攀渀搀攀搀开瀀爀漀瀀攀爀琀椀攀猀 䄀匀 攀瀀 
		 WHERE ep.name = 'Major Release #'਀ 
	 UNION ALL ਀ 
	    SELECT 'Minor Release #'   AS Name,਀ऀऀ       攀瀀⸀瘀愀氀甀攀 䄀匀 嘀愀氀甀攀 
		  FROM sys.extended_properties AS ep਀ऀऀ 圀䠀䔀刀䔀 攀瀀⸀渀愀洀攀 㴀 ✀䴀椀渀漀爀 刀攀氀攀愀猀攀 ⌀✀ 
਀ 
	 UNION ALL ਀ 
	    SELECT TOP 1਀ऀऀ       ✀䔀唀䰀䄀 刀攀瘀椀猀椀漀渀✀   䄀匀 一愀洀攀Ⰰ 
		       e.release_number AS Value਀ऀऀ  䘀刀伀䴀 戀愀猀攀⸀攀甀氀愀 䄀匀 攀 
		 WHERE e.status = 'Current'਀ 
	 UNION ALL ਀ 
	    SELECT 'Release Date'   AS Name,਀ऀऀ       攀瀀⸀瘀愀氀甀攀 䄀匀 嘀愀氀甀攀 
		  FROM sys.extended_properties AS ep਀ऀऀ 圀䠀䔀刀䔀 攀瀀⸀渀愀洀攀 㴀 ✀刀攀氀攀愀猀攀 䐀愀琀攀✀ 
਀ऀ 唀一䤀伀一 䄀䰀䰀  
਀ऀ    匀䔀䰀䔀䌀吀 ✀圀攀戀猀椀琀攀✀   䄀匀 一愀洀攀Ⰰ 
		       ep.value AS Value਀ऀऀ  䘀刀伀䴀 猀礀猀⸀攀砀琀攀渀搀攀搀开瀀爀漀瀀攀爀琀椀攀猀 䄀匀 攀瀀 
		 WHERE ep.name = 'Website'਀ऀ  
	 UNION ALL ਀ 
	    SELECT 'Copyright'   AS Name,਀ऀऀ       攀瀀⸀瘀愀氀甀攀 䄀匀 嘀愀氀甀攀 
		  FROM sys.extended_properties AS ep਀ऀऀ 圀䠀䔀刀䔀 攀瀀⸀渀愀洀攀 㴀 ✀䌀漀瀀礀爀椀最栀琀✀ 
਀ऀऀ ⤀ 
਀ऀऀ 匀䔀䰀䔀䌀吀 ⨀ 䘀刀伀䴀 一愀洀攀瀀氀愀琀攀䐀愀琀愀 
	        ਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀऀ 
	  END CATCH਀ 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_non_pers_pple_lst_nms]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㠀㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 瀀攀漀瀀氀攀 氀椀猀琀 渀愀洀攀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀Ⰰ 攀砀挀攀瀀琀 昀漀爀 琀栀攀 爀攀挀漀爀搀猀 眀栀攀爀攀 琀栀攀 洀渀攀洀漀渀椀挀 㴀 ✀倀攀爀猀漀渀愀氀✀⸀ 
-- Output is a list of people list names, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_non_pers_pple_lst_nms] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
 ਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀          䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ  
				 ISNULL(pln.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ 瀀氀渀⸀渀愀洀攀                    䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 ISNULL(pln.description, '') AS 'Description',਀ऀऀऀऀ 瀀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		    FROM people.people_list_names AS pln ਀ऀऀ   圀䠀䔀刀䔀 瀀氀渀⸀洀渀攀洀 㰀㸀 ✀倀攀爀猀漀渀愀氀✀ 
	    ORDER BY 'List Position', 'People List Name';਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_number_of_all_docs]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㜀ⴀ㈀　㈀㐀 
-- Description:	Original Creation਀ⴀⴀ 刀攀琀甀爀渀猀 琀栀攀 琀漀琀愀氀 渀甀洀戀攀爀 漀昀 搀漀挀甀洀攀渀琀猀⸀ 
-- Input is an optional form ID.  ਀ⴀⴀ 䐀漀攀猀 渀漀琀 愀瀀瀀氀礀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀  䐀漀攀猀 渀漀琀 爀攀琀爀椀攀瘀攀 愀猀猀漀挀椀愀琀攀搀 昀椀氀攀猀⸀ 䐀漀攀猀 渀漀琀 爀攀琀爀椀攀瘀攀 愀渀礀 搀愀琀愀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开渀甀洀戀攀爀开漀昀开愀氀氀开搀漀挀猀崀  
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀搀漀挀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	@username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	@data_validation_status nchar(10)  = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀搀漀挀猀 㴀 　㬀 
਀ 
਀ऀ䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	  BEGIN਀  
	BEGIN TRY਀ 
	WITH docidsCTE AS (਀ऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 ⴀⴀ 匀攀氀攀挀琀 愀氀氀 搀漀挀猀 琀栀愀琀 栀愀瘀攀 渀漀 最爀漀甀瀀 ⬀ 愀氀氀 琀栀愀琀 栀愀瘀攀 愀 最爀漀甀瀀 眀椀琀栀 渀漀 甀猀攀爀 ⬀ 愀氀氀 琀栀愀琀 栀愀瘀攀 愀 最爀漀甀瀀 琀栀愀琀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀 
	          dil.doc_id            AS ID ਀ऀ     䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
	LEFT JOIN xref.doc_group_links AS dgl਀ऀ       伀一   搀椀氀⸀搀漀挀开椀搀  
		      = dgl.doc_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
	       ON   dgl.doc_group_id ਀ऀऀ      㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
	LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀ       伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		      = dgvp.doc_group_id਀    䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	       ON   dgvp.sid_id਀ऀऀ      㴀   猀氀⸀猀椀搀开椀搀 
	    WHERE (dgl.doc_group_id IS NULL)਀ऀऀ      伀刀 
			  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀ    䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
			  OR਀ऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
			    AND dgvp.sid_id IS NOT NULL਀ऀऀऀ    䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
			         ) ਀ऀऀऀ⤀ 
਀ 
	  SELECT @numdocs = COUNT(*)਀        䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀㬀 
਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
਀ऀ  䔀一䐀  ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_number_of_all_files]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㜀ⴀ㈀　㈀㐀 
-- Description:	Returns the number of files that the user has access to. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_number_of_all_files] ਀ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numfiles bigint                 = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ 
	@connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀昀椀氀攀猀 㴀 　㬀 
਀ 
-- ====================================================਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
		BEGIN TRY਀ऀऀ  圀䤀吀䠀 昀椀氀攀椀搀猀䌀吀䔀 䄀匀⠀ 
			  SELECT DISTINCT਀ऀऀऀऀऀ 昀洀⸀昀椀氀攀开椀搀              䄀匀 䤀䐀 
				FROM base.file_metadata AS fm਀ऀऀ   䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀 䄀匀 昀琀搀氀 
	 			  ON     fm.file_id ਀ऀऀऀऀऀ 㴀 昀琀搀氀⸀昀椀氀攀开椀搀 
		   LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀऀ  伀一   昀琀搀氀⸀搀漀挀开椀搀  
					 =  dgl.doc_id਀ऀऀ   䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
				  ON   dgl.doc_group_id ਀ऀऀऀऀऀ 㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		   LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀऀ  伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
					 = dgvp.doc_group_id਀ऀऀ   䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
				  ON   dgvp.sid_id਀ऀऀऀऀऀ 㴀   猀氀⸀猀椀搀开椀搀 
			   WHERE (fm.file_id IS NOT NULL -- Only retrieve file data for files which the user has permission to access਀ऀऀऀऀऀ  䄀一䐀 
						 ((ftdl.file_id IS NULL਀ऀऀऀऀऀऀ  伀刀 搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一唀䰀䰀⤀ 
						  OR (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀऀऀ  䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
						  OR (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀऀऀ  䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
							  AND sl.sid = @connectedusersid਀ऀऀऀऀऀऀऀऀ   ⤀⤀  
					  )਀ऀऀऀ ⤀ 
਀ऀ  匀䔀䰀䔀䌀吀 䀀渀甀洀昀椀氀攀猀 㴀 䌀伀唀一吀⠀⨀⤀ 
        FROM fileidsCTE;਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
	END -- END IF @transaction_ready = 'Ready'਀ 
	SET @numfiles = ISNULL(@numfiles, 0);਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开漀渀攀开搀漀挀开愀氀氀开搀愀琀愀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 搀漀挀甀洀攀渀琀 洀攀琀搀愀琀愀 愀渀搀 愀氀猀漀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 漀昀 愀氀氀 昀椀氀攀猀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
-- Does not apply a filter group਀ⴀⴀ 䘀漀爀 昀椀氀攀 挀漀渀琀攀渀琀 攀砀琀爀愀挀琀椀漀渀 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
-- The calling function will need to parse the data into a table.  ਀ⴀⴀ 吀栀攀 爀攀愀猀漀渀 昀漀爀 瀀爀攀猀攀渀琀椀渀最 琀栀攀 搀愀琀愀 椀渀 琀栀攀 琀栀椀猀 洀愀渀渀攀爀 椀猀 琀栀愀琀 琀栀攀 渀甀洀戀攀爀 漀昀 挀漀氀甀洀渀猀 椀渀 琀栀攀 
-- final table is indeterminate.  This is related to allowing the user to cusomise the columns in forms.਀ⴀⴀ 吀漀 搀礀渀愀洀椀挀愀氀氀礀 挀爀攀愀琀攀 愀 琀愀戀氀攀 眀椀琀栀 愀渀 椀渀搀攀琀攀爀洀椀渀愀琀攀 渀甀洀戀攀爀 漀昀 挀漀氀甀洀渀猀 椀渀 匀儀䰀 爀攀焀甀椀爀攀猀 琀栀攀 甀猀攀 
-- of dynamic SQL, which increases security risks.  A foundation of this database is to only use static SQL. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 昀甀渀挀琀椀漀渀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists metadata associated with a document.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @documentid nvarchar(50), @filter_group_id bigint, @formid bigint਀⨀ 䤀昀 䀀昀漀爀洀椀搀 椀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 琀栀攀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀 昀爀漀洀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 眀椀氀氀 戀攀 甀猀攀搀⸀  
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 搀漀挀甀洀攀渀琀 洀攀琀愀搀愀琀愀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
* - @numrows number of row returned਀⨀ 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/*਀吀栀攀 氀漀最椀挀 眀漀爀欀猀 愀猀 昀漀氀氀漀眀猀⸀ 
Files are listed which:਀  ⴀ 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀Ⰰ 
  - are linked to the document id via the table xref.file_to_document_links਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开漀渀攀开搀漀挀开愀氀氀开搀愀琀愀崀  
਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	  @formid bigint                   = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrecords bigint               = NULL OUTPUT, -- This corresponds to the number of records in the table that the application presents to the user.਀ऀ                                                  ⴀⴀ 䔀愀挀栀 爀攀挀漀爀搀 椀猀 愀 搀漀挀甀洀攀渀琀ⴀ昀椀氀攀 瀀愀椀爀⸀ 
	  @outputformid bigint             = NULL OUTPUT,਀ऀ  䀀昀漀爀洀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
        @fileid bigint,਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     -- The username     ਀ऀ    䀀搀愀琀攀昀漀爀洀愀琀 渀挀栀愀爀⠀㌀⤀               㴀 ✀搀洀礀✀Ⰰ  
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                          -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
	    @data_validation_status nchar(10)  = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
        num_records bigint,਀ऀऀ搀漀挀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		fileid bigint,਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		form_position nvarchar(50)਀  ⤀ 
    ਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀  匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 　㬀 
਀  
 -- Data Validation਀ 
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
			END਀ 
		-- End document id validation਀   
਀    ⴀⴀ 䘀漀爀洀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @formid = 0 ਀ऀऀ 匀䔀吀 䀀昀漀爀洀椀搀 㴀 一唀䰀䰀㬀 
	  IF @formid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT form_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀  
							 WHERE form_id = @formid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀漀爀洀 䤀䐀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀漀爀洀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀漀爀洀开椀搀  
			                  FROM base.global_settings_groups਀ऀऀऀ                 圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @formid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀漀爀洀 䤀䐀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFormNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
਀ऀ  
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ 
	  -- End data validation਀ 
-- ================================================================================਀   
਀䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䈀䔀䜀䤀一 
	BEGIN TRY਀ 
-- ===============================================================================਀ⴀⴀ      刀攀琀爀椀攀瘀攀 琀栀攀 昀椀氀攀椀搀猀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀     
਀ 
	WITH docidfileidCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀  
		    @documentid                              AS documentid,਀ऀऀऀ昀洀⸀昀椀氀攀开椀搀                               䄀匀 昀椀氀攀椀搀Ⰰ 
			DENSE_RANK() OVER (ORDER BY fM.file_id)  AS numrows਀ऀऀ䘀刀伀䴀  
			base.file_metadata AS fm਀ऀऀ䌀刀伀匀匀 䄀倀倀䰀夀  
			internal.ufn_SEL_files_by_doc_TVF(@documentid) AS tvf਀   䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀   
           ON fm.file_id = perm.file_id  -- Apply permission filtering਀ऀऀ圀䠀䔀刀䔀  
			   fm.file_id ਀ऀऀऀ㴀 琀瘀昀⸀昀椀氀攀开椀搀 
			)਀ऀऀ 
-- ================================================================================਀ 
       -- Extract the data according to the form id਀ 
	INSERT INTO @AttData  (num_records, docid, fileid, field_type, field_name_id, field_name, field_mnemonic, attr_id, attr_value, units, form_position)਀ऀऀ⠀匀䔀䰀䔀䌀吀  
		    numrows                 AS num_records,਀ऀऀऀ搀漀挀开搀愀琀愀⸀搀漀挀开椀搀         䄀匀 搀漀挀椀搀Ⰰ  
			doc_data.file_id        AS fileid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开琀礀瀀攀     䄀匀 昀椀攀氀搀开琀礀瀀攀Ⰰ  
			doc_data.field_name_id  AS field_name_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀     䄀匀 昀椀攀氀搀开渀愀洀攀Ⰰ  
			doc_data.field_mnemonic AS field_mnemonic,਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开椀搀        䄀匀 愀琀琀爀开椀搀Ⰰ  
			doc_data.attr_value     AS attr_value, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀甀渀椀琀猀          䄀匀 甀渀椀琀猀Ⰰ 
			doc_data.form_position  AS form_position਀ऀऀ䘀刀伀䴀 搀漀挀椀搀昀椀氀攀椀搀䌀吀䔀 䄀匀 搀昀 
		OUTER APPLY internal.ufn_SEL_one_dc_data_by_frm_ITVF(df.documentid, df.fileid, @formid) AS doc_data਀ऀ    ⤀㬀 
਀ऀ匀䔀䰀䔀䌀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䴀䄀堀⠀渀甀洀开爀攀挀漀爀搀猀⤀  昀爀漀洀 䀀䄀琀琀䐀愀琀愀㬀 
਀ऀऀऀ 匀䔀䰀䔀䌀吀  
			        ad.num_records                AS 'Record',਀ऀऀऀऀऀ愀搀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ  
					ad.fileid                     AS 'File ID',਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ  
					ad.field_name_id              AS 'Name ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀一愀洀攀✀Ⰰ  
					ISNULL(ad.field_mnemonic, '') AS 'Mnemonic',਀ऀऀऀऀऀ愀搀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.attr_value, '')     AS 'Value', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀甀渀椀琀猀Ⰰ ✀✀⤀          䄀匀 ✀唀渀椀琀猀✀Ⰰ 
					ISNULL(ad.form_position, '')  AS 'Position'਀ऀऀऀ   䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		   ORDER BY Position, Record, 'Document ID';਀ 
-- ===================================================਀ 
	  SET @numrows = @@ROWCOUNT;਀ 
  -- Return the actual form details applied.  ਀     匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
	 SET @formname = (SELECT form_name ਀ऀ                    䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 昀椀渀 
					   WHERE fin.form_id਀ऀऀऀऀऀ         㴀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀⤀ 
  ਀ 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
	    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END  -- End IF @transaction_ready = 'Ready'਀ 
    SET @numrows    = ISNULL(@numrows, 0);਀ऀ匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀攀挀漀爀搀猀Ⰰ　⤀㬀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开漀渀攀开搀漀挀甀洀攀渀琀开搀愀琀愀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-06-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䰀椀猀琀猀 搀漀挀甀洀攀渀琀 洀攀琀搀愀琀愀 愀渀搀 愀氀猀漀 琀栀攀 昀椀氀攀 洀攀琀愀搀愀琀愀 漀昀 琀栀攀 欀攀礀 昀椀氀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 
-- as determined by the filter group.  For file content extraction਀ⴀⴀ 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
-- The calling function will need to parse the data into a table.  ਀ⴀⴀ 吀栀攀 爀攀愀猀漀渀 昀漀爀 瀀爀攀猀攀渀琀椀渀最 琀栀攀 搀愀琀愀 椀渀 琀栀攀 琀栀椀猀 洀愀渀渀攀爀 椀猀 琀栀愀琀 琀栀攀 渀甀洀戀攀爀 漀昀 挀漀氀甀洀渀猀 椀渀 琀栀攀 
-- final table is indeterminate.  This is related to allowing the user to cusomise the columns in forms.਀ⴀⴀ 吀漀 搀礀渀愀洀椀挀愀氀氀礀 挀爀攀愀琀攀 愀 琀愀戀氀攀 眀椀琀栀 愀渀 椀渀搀攀琀攀爀洀椀渀愀琀攀 渀甀洀戀攀爀 漀昀 挀漀氀甀洀渀猀 椀渀 匀儀䰀 爀攀焀甀椀爀攀猀 琀栀攀 甀猀攀 
-- of dynamic SQL, which increases security risks.  A foundation of this database is to only use static SQL. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 昀甀渀挀琀椀漀渀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists metadata associated with a document.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @documentid nvarchar(50), @filter_group_id bigint, @formid bigint਀⨀ 䤀昀 䀀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 椀猀 渀漀琀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀 昀爀漀洀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 眀椀氀氀 戀攀 甀猀攀搀 
* If @formid is not supplied then the default_form_id from base.global_settings_groups will be used. ਀⨀ 
* **Return Values:**਀⨀ 
* - A list of document metadata.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ ⴀ 䀀渀甀洀爀漀眀猀 渀甀洀戀攀爀 漀昀 爀漀眀 爀攀琀甀爀渀攀搀 
*਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀⼀⨀ 
The logic works as follows.਀䘀椀氀攀猀 愀爀攀 氀椀猀琀攀搀 眀栀椀挀栀㨀 
  - the user has viewing rights to,਀  ⴀ 愀爀攀 氀椀渀欀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 瘀椀愀 琀栀攀 琀愀戀氀攀 砀爀攀昀⸀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀Ⰰ 
  - are linked to all the attributes which have the given filter group assigned਀  ⴀ 椀渀 愀氀氀 挀愀猀攀猀 眀栀攀爀攀 愀渀礀 洀攀洀戀攀爀 漀昀 愀渀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 椀猀 氀椀渀欀攀搀 琀漀 琀栀攀 昀椀氀攀⸀ 
If an attributes list, such as a file radio button list, includes an attibute਀眀栀椀挀栀 栀愀猀 琀栀攀 最椀瘀攀渀 昀椀氀琀攀爀 最爀漀甀瀀Ⰰ 琀栀攀渀 昀椀氀攀猀 眀栀椀挀栀 愀爀攀 氀椀渀欀攀搀 琀漀 愀渀礀 愀琀琀爀椀戀甀琀攀猀 椀渀 琀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 
but are not linked to the attribute with the given filter group then will be excluded.਀䄀琀琀爀椀戀甀琀攀猀 眀椀琀栀 琀栀攀 最椀瘀攀渀 昀椀氀琀攀爀 最爀漀甀瀀 眀栀椀挀栀 戀攀氀漀渀最 琀漀 愀 氀椀猀琀 昀漀爀 眀栀椀挀栀 渀漀 洀攀洀戀攀爀猀 愀爀攀  
linked to a particular file will be ignored.  ਀䘀漀爀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀猀Ⰰ 愀氀氀 琀栀攀 愀琀琀爀椀戀甀琀攀猀 眀椀琀栀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀攀搀 洀甀猀琀 戀攀  
linked to the file for the file to be included. ਀吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 氀椀渀欀 愀瀀瀀氀椀攀猀 琀漀 戀漀琀栀 琀栀攀 昀椀氀攀猀 愀渀搀 搀漀挀甀洀攀渀琀 椀搀⸀  
਀⨀⼀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开漀渀攀开搀漀挀甀洀攀渀琀开搀愀琀愀崀  
਀      䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ 
	  @filtergroupid bigint            = NULL,਀ऀ  䀀昀漀爀洀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀               㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀栀椀猀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 渀甀洀戀攀爀 漀昀 爀攀挀漀爀搀猀 椀渀 琀栀攀 琀愀戀氀攀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 瀀爀攀猀攀渀琀猀 琀漀 琀栀攀 甀猀攀爀⸀ 
	                                                  -- Each record is a document-file pair.਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 戀椀最椀渀琀      㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @filtergroupname nvarchar(50)    = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀        䀀昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @dateformat nchar(3)               = 'dmy', ਀ऀ    䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀         㴀 ✀✀Ⰰ 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀        渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀Ⰰ 
		docid nvarchar(50),਀ऀऀ昀椀氀攀椀搀 戀椀最椀渀琀Ⰰ 
		field_type nvarchar(50), ਀ऀऀ昀椀攀氀搀开渀愀洀攀开椀搀 戀椀最椀渀琀Ⰰ 
		field_name  nvarchar(50),਀ऀऀ昀椀攀氀搀开洀渀攀洀漀渀椀挀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		attr_id  bigint,਀ऀऀ愀琀琀爀开瘀愀氀甀攀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		units nvarchar(50),਀ऀऀ昀漀爀洀开瀀漀猀椀琀椀漀渀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 
  )਀     
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
  SET @numrecords = 0;਀ 
 ਀ ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ 
 -- Document id validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Doc id was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀऀ䔀一䐀 
਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
  -- Filter group id validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 攀砀椀猀琀猀   
	  IF @filtergroupid = 0 ਀ऀऀ 匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
	  IF @filtergroupid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT filter_group_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀  
							 WHERE filter_group_id = @filtergroupid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀䜀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FGNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END   ਀ऀ 䔀䰀匀䔀 ⴀⴀ 䤀昀 渀漀 昀椀氀琀攀爀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 琀栀攀渀 爀攀琀爀椀攀瘀攀 琀栀攀 搀攀昀愀甀氀琀 愀渀搀 琀栀攀渀 挀栀攀挀欀 琀栀攀 搀攀昀愀甀氀琀 
	     BEGIN਀ऀऀ     匀䔀吀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀  
			                         FROM base.global_settings_groups਀ऀऀऀ                        圀䠀䔀刀䔀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 㴀 ✀䴀愀猀琀攀爀✀⤀㬀 
			 IF  @filtergroupid IS NULL਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀攀昀䘀䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀   
						  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DefFGroupNotExist.');਀ऀऀऀऀ 䔀一䐀  
		 END -- End checking filter group ਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀椀氀琀攀爀 最爀漀甀瀀  
਀ 
	 ਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
			 SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  ਀ 
IF @transaction_ready = 'Ready'਀ 
BEGIN਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 搀漀挀开椀搀  
		                      FROM base.document_id_list AS dil਀ऀऀऀऀ  ऀऀऀ 圀䠀䔀刀䔀 搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
਀ ⴀⴀ 䄀瀀瀀氀礀 昀椀氀琀攀爀 最爀漀甀瀀 昀椀氀琀攀爀椀渀最 
     AND NOT EXISTS (਀        ⴀⴀ 刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 昀愀椀氀甀爀攀 
        SELECT 1਀        䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀 䄀匀 昀最氀 
        WHERE fgl.filter_group_id = @filtergroupid਀          䄀一䐀 一伀吀 䔀堀䤀匀吀匀 ⠀ 
              SELECT 1਀              䘀刀伀䴀 搀漀挀开愀琀琀爀⸀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀 䄀匀 搀爀戀氀 
              WHERE drbl.doc_radiob_attr_id = fgl.doc_radiob_attr_id਀                䄀一䐀 搀爀戀氀⸀搀漀挀开椀搀 㴀 搀椀氀⸀搀漀挀开椀搀 
          )਀ऀऀ⤀ 
	AND਀ऀऀ一伀吀 䔀堀䤀匀吀匀 ⠀ 
			-- Multi-select attribute failure਀ऀऀऀ匀䔀䰀䔀䌀吀 ㄀ 
			FROM doc_attr.doc_ms_attr_fgroup_links AS dmsafgl਀ऀऀऀ圀䠀䔀刀䔀 搀洀猀愀昀最氀⸀昀椀氀琀攀爀开最爀漀甀瀀开椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
			  AND NOT EXISTS (਀ऀऀऀऀ  匀䔀䰀䔀䌀吀 ㄀ 
				  FROM doc_attr.doc_multi_select_links AS dmsl਀ऀऀऀऀ  圀䠀䔀刀䔀 搀洀猀氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 㴀 搀洀猀愀昀最氀⸀搀漀挀开洀猀开愀琀琀爀开椀搀 
					AND dmsl.doc_id = dil.doc_id਀ऀऀऀ  ⤀ 
		)਀ऀ⤀㬀 ऀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
--      Retrieve the fileids linked to the document according to the filter group   ਀ 
		WITH docidfileidCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀  
				@documentid                                  AS documentid, ਀ऀऀऀऀ昀⸀昀椀氀攀开椀搀                                    䄀匀 昀椀氀攀椀搀Ⰰ 
				DENSE_RANK() OVER (ORDER BY f.file_id)       AS numrows਀ऀऀऀ䘀刀伀䴀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀开戀礀开搀漀挀开昀最爀漀甀瀀开吀嘀䘀⠀䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀⤀ 䄀匀 昀 
   INNER JOIN internal.ufn_SEL_files_permission_filtr_ITVF(@connectedusersid) AS perm  ਀           伀一 昀⸀昀椀氀攀开椀搀 㴀 瀀攀爀洀⸀昀椀氀攀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
		)਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀       ⴀⴀ 䔀砀琀爀愀挀琀 琀栀攀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀攀 昀漀爀洀 椀搀 
਀ऀ䤀一匀䔀刀吀 䤀一吀伀 䀀䄀琀琀䐀愀琀愀  ⠀渀甀洀开爀攀挀漀爀搀猀Ⰰ 搀漀挀椀搀Ⰰ 昀椀氀攀椀搀Ⰰ 昀椀攀氀搀开琀礀瀀攀Ⰰ 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ 昀椀攀氀搀开渀愀洀攀Ⰰ 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 愀琀琀爀开椀搀Ⰰ 愀琀琀爀开瘀愀氀甀攀Ⰰ 甀渀椀琀猀Ⰰ 昀漀爀洀开瀀漀猀椀琀椀漀渀⤀ 
		(SELECT ਀ऀऀ    渀甀洀爀漀眀猀                 䄀匀 渀甀洀开爀攀挀漀爀搀猀Ⰰ 
			doc_data.doc_id         AS docid, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀氀攀开椀搀        䄀匀 昀椀氀攀椀搀Ⰰ  
			doc_data.field_type     AS field_type, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开渀愀洀攀开椀搀  䄀匀 昀椀攀氀搀开渀愀洀攀开椀搀Ⰰ  
			doc_data.field_name     AS field_name, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀 䄀匀 昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ 
			doc_data.attr_id        AS attr_id, ਀ऀऀऀ搀漀挀开搀愀琀愀⸀愀琀琀爀开瘀愀氀甀攀     䄀匀 愀琀琀爀开瘀愀氀甀攀Ⰰ  
			doc_data.units          AS units,਀ऀऀऀ搀漀挀开搀愀琀愀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀  䄀匀 昀漀爀洀开瀀漀猀椀琀椀漀渀 
		FROM docidfileidCTE AS df਀ऀऀ伀唀吀䔀刀 䄀倀倀䰀夀 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开漀渀攀开搀挀开搀愀琀愀开戀礀开昀爀洀开䤀吀嘀䘀⠀搀昀⸀搀漀挀甀洀攀渀琀椀搀Ⰰ 搀昀⸀昀椀氀攀椀搀Ⰰ 䀀昀漀爀洀椀搀⤀ 䄀匀 搀漀挀开搀愀琀愀 
	    );਀ 
	SELECT @numrecords = MAX(num_records)  from @AttData;਀ 
			 SELECT ਀ऀऀऀ        愀搀⸀渀甀洀开爀攀挀漀爀搀猀                䄀匀 ✀刀攀挀漀爀搀✀Ⰰ 
					ad.docid                      AS 'Document ID', ਀ऀऀऀऀऀ愀搀⸀昀椀氀攀椀搀                     䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
					ad.field_type                 AS 'Field Type', ਀ऀऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
					ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
					ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
					ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
			   FROM @AttData AS ad਀ऀऀ   伀刀䐀䔀刀 䈀夀 倀漀猀椀琀椀漀渀Ⰰ 刀攀挀漀爀搀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀  ⴀⴀ 刀攀琀甀爀渀 琀栀攀 愀挀琀甀愀氀 昀漀爀洀 搀攀琀愀椀氀猀 愀瀀瀀氀椀攀搀⸀   
     SET @outputformid = @formid;਀ऀ 匀䔀吀 䀀昀漀爀洀渀愀洀攀 㴀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开渀愀洀攀  
	                    FROM forms.form_identifier_names AS fin਀ऀऀऀऀऀ   圀䠀䔀刀䔀 昀椀渀⸀昀漀爀洀开椀搀 
					         = @outputformid)਀   
  -- Return the actual filter group details applied.਀     匀䔀吀 䀀漀甀琀瀀甀琀昀椀氀琀攀爀最爀漀甀瀀椀搀 㴀 䀀昀椀氀琀攀爀最爀漀甀瀀椀搀 
	 SET @filtergroupname = (SELECT fg.attr_name਀ऀ                           䘀刀伀䴀 昀漀爀洀猀⸀昀椀氀琀攀爀开最爀漀甀瀀猀 䄀匀 昀最 
							  WHERE fg.filter_group_id = @filtergroupid)਀ 
਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀  ⴀⴀ 䔀渀搀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀    匀䔀吀 䀀渀甀洀爀漀眀猀    㴀 䤀匀一唀䰀䰀⠀䀀渀甀洀爀漀眀猀Ⰰ 　⤀㬀 
	SET @numrecords = ISNULL(@numrecords,0);਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_one_file_data]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㐀ⴀ　㠀ⴀ㈀　㈀㔀 
-- This procedure reads the data and the thumbnail for a single file.਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 䤀䐀 愀渀搀 昀漀爀洀 䤀䐀⸀  伀甀琀瀀甀琀 椀猀 琀栀攀 搀愀琀愀Ⰰ 琀栀甀洀戀渀愀椀氀Ⰰ 
-- the filename, and a message.   For file content extraction਀ⴀⴀ 猀攀攀 甀猀瀀开匀䔀䰀开昀椀氀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开漀渀攀开昀椀氀攀开搀愀琀愀崀 
਀ऀ  䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
      @formid bigint                   = NULL, ਀ऀ  䀀琀栀甀洀戀渀愀椀氀 瘀愀爀戀椀渀愀爀礀⠀洀愀砀⤀        㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @message nvarchar(1000)          = NULL OUTPUT,਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @numrows bigint                  = NULL OUTPUT,਀ऀ  䀀漀甀琀瀀甀琀昀漀爀洀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	  @formname nvarchar(50)           = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀ 䐀䔀䌀䰀䄀刀䔀 
    @tempmessage nvarchar(300)         = '',਀ऀ䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀  㴀 ✀✀Ⰰ 
	@connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ ऀऀ 
	@transaction_ready nchar(10)       = 'Ready',਀ऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀䄀琀琀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀  ऀऀ昀椀氀攀开挀漀甀渀琀 戀椀最椀渀琀Ⰰ 
		fileid nvarchar(50),਀ऀऀ昀椀攀氀搀开琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ  
		field_name_id bigint,਀ऀऀ昀椀攀氀搀开渀愀洀攀  渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		field_mnemonic nvarchar(10),਀ऀऀ愀琀琀爀开椀搀  戀椀最椀渀琀Ⰰ 
		attr_value nvarchar(max),਀ऀऀ甀渀椀琀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		position nvarchar(50)਀  ⤀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
਀ 
   -- Check that the file id exists.  Fail if it doesn't.਀  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
     SET @fileid = NULL;਀  䤀䘀 䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 
     BEGIN਀ऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
	   SET @transaction_ready      = 'Fail';਀       䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id = 'NoFileID', ਀ऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	   IF (@tempmessage IS NOT NULL) ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	   ELSE  ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
	 END਀  䔀䰀匀䔀 
     BEGIN 	-- Check if the file ID exists and the user has permission to access the file਀ऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 				@file_id_to_check =  @fileid,਀ऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
							SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
		                    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀ䔀一䐀 
	 END   -- End checking if file id exists਀ 
    -- Form id validation਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 㴀 　  
		 SET @formid = NULL;਀ऀ  䤀䘀 䀀昀漀爀洀椀搀 䤀匀 一伀吀 一唀䰀䰀 
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀漀爀洀开椀搀  
							  FROM forms.form_identifier_names ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 昀漀爀洀开椀搀 㴀 䀀昀漀爀洀椀搀⤀  
				 BEGIN  -- The form id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀    
	 ELSE -- If no form ID supplied then retrieve the default and then check the default਀ऀ     䈀䔀䜀䤀一 
		     SET @formid = (SELECT default_form_id ਀ऀऀऀ                  䘀刀伀䴀 戀愀猀攀⸀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀 
			                 WHERE base.global_settings_groups.setting_group_name = 'Master');਀ऀऀऀ 䤀䘀  䀀昀漀爀洀椀搀 䤀匀 一唀䰀䰀 
				 BEGIN  -- The form ID does not exist਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DefFormNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE  ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀攀昀䘀漀爀洀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀 ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 昀漀爀洀 䤀䐀  
਀ऀऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
		  IF @data_validation_status = 'Fail'਀ऀऀऀ䈀䔀䜀䤀一 
			  EXEC internal.usp_SEL_message ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				   @message_text = @tempmessage OUTPUT;਀ऀऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ  䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀऀ䔀一䐀 
 ਀ऀ䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ऀऀ   
 -- End data validation਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀऀ䈀䔀䜀䤀一 吀刀夀 
਀ 
	-- Extract the data according to the file id਀ऀ 
		 SELECT ਀ऀऀ        䀀昀椀氀攀椀搀ऀऀ                  䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
				ad.field_type                 AS 'Field Type', ਀ऀऀऀऀ愀搀⸀昀椀攀氀搀开渀愀洀攀开椀搀              䄀匀 ✀一愀洀攀 䤀䐀✀Ⰰ  
				ISNULL(ad.field_name, '')     AS 'Name', ਀ऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				ad.attr_id                    AS 'Attribute ID', ਀ऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀愀琀琀爀开瘀愀氀甀攀Ⰰ ✀✀⤀     䄀匀 ✀嘀愀氀甀攀✀Ⰰ  
				ISNULL(ad.units, '')          AS 'Units',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀愀搀⸀昀漀爀洀开瀀漀猀椀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀倀漀猀椀琀椀漀渀✀ 
		   FROM [internal].[ufn_SEL_one_fl_data_by_frm_TVF](@fileid, @formid) AS ad;਀ 
਀ऀऀ  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
਀ऀऀ   
		  SELECT @thumbnail = ft.thumbnail਀ऀऀ    䘀刀伀䴀 戀愀猀攀⸀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀 䄀匀 昀琀 
		   WHERE ft.file_id = @fileid;਀ 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ  䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀऀ  匀䔀吀 䀀漀甀琀瀀甀琀昀漀爀洀椀搀 㴀 䀀昀漀爀洀椀搀㬀 
		  SET @formname = (SELECT form_name਀ऀऀ                     䘀刀伀䴀 昀漀爀洀猀⸀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 
							WHERE form_id = @formid);਀ 
		END TRY਀ऀऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
		  SET @transaction_status = 'Bad';਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			@message_id   = 'SelectError', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ   
				CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ  䔀䰀匀䔀 
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀  
		END CATCH਀ 
਀ 
    SET @numrows  = ISNULL(@numrows, 0);਀ऀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀攀漀瀀氀攀开氀椀猀琀猀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀愀搀猀 愀氀氀 漀昀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀⸀  
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀    
-- Output is a message and status and the people lists.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_people_lists_by_doc] ਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
			END਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			SELECT @documentid                 AS 'Document ID',਀ऀऀऀ       瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀          䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
			       ISNULL(pln.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ   瀀氀渀⸀渀愀洀攀ऀऀऀऀ       䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				   ISNULL(pln.description, '') AS 'Description',਀ऀऀऀऀ   瀀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀ऀ       䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
				   gfn.name                    AS 'General Field Name',਀ऀऀऀऀ   最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀   䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
			  FROM people.doc_to_people_list_links AS dtpll਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
		        ON  dtpll.people_list_id਀ऀऀऀऀ   㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		 LEFT JOIN people.general_field_names AS gfn਀ऀऀ        伀一     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
				   = dtpll.general_field_name_id਀ऀऀऀ 圀䠀䔀刀䔀 搀琀瀀氀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀攀漀瀀氀攀开氀椀猀琀猀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 03-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀愀搀猀 愀氀氀 漀昀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 昀椀氀攀⸀  
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 椀搀    
-- Output is a message and status and the people lists.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_people_lists_by_file] ਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has permission to view the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开昀椀氀攀开椀搀崀  
 						@file_id_to_check =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀昀椀氀攀椀搀               䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			       pln.people_list_id    AS 'Peoople List ID',਀ऀऀऀ       䤀匀一唀䰀䰀⠀瀀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				   pln.name			     AS 'People List Name',਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀瀀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀  䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				   pln.list_position  AS 'List Position',਀ऀऀऀऀ   最昀渀⸀渀愀洀攀                    䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
				   gfn.general_field_name_id   AS 'General Field Name ID'਀ऀऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀 䄀匀 昀琀瀀氀 
		 LEFT JOIN people.people_list_names AS pln਀ऀऀ        伀一  昀琀瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				   = pln.people_list_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
		        ON    gfn.general_field_name_id਀ऀऀऀऀ   㴀 昀琀瀀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			 WHERE ftpl.file_id = @fileid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_people_lists_by_person]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 愀氀氀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 昀漀爀 愀 最椀瘀攀渀 椀渀搀椀瘀椀搀甀愀氀⸀ 
-- Output is a list of record details, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists all the people lists from people.people_lists for a given individual.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @sidid:  Must be a valid id from the sid list table. ਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 瀀攀漀瀀氀攀 氀椀猀琀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 攀爀爀漀爀猀  
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_people_lists_by_person] ਀ 
     @sidid bigint                    = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ऀ      ⴀⴀ 䌀栀攀挀欀 琀栀攀 爀攀挀漀爀搀 椀搀 
		  IF @sidid = 0਀ऀऀऀ 匀䔀吀 䀀猀椀搀椀搀 㴀 一唀䰀䰀㬀 
		  -- Check record id has been supplied਀ऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoSidId', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		    -- Check if the record id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			                 FROM user_restr.sid_list AS SL਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀氀⸀猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT @sidid                      AS 'User ID',਀ऀऀऀऀ 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀          䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ  
				 ISNULL(pln.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ 瀀氀渀⸀渀愀洀攀                    䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 ISNULL(pln.description, '') AS 'Description',਀ऀऀऀऀ 瀀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
		         CONVERT(NVARCHAR(30), pl.created, 120) AS 'Created',਀ऀऀऀऀ 瀀氀⸀最爀愀渀琀攀搀开戀礀               䄀匀 ✀䌀爀攀愀琀攀搀 䈀礀✀ 
            FROM people.people_lists AS pl਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
	          ON     pl.people_list_id਀ऀऀऀ      㴀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
	       WHERE pl.sid_id਀ऀऀ         㴀 䀀猀椀搀椀搀 
		ORDER BY 'List Position';਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀攀漀瀀氀攀开氀椀猀琀猀开昀漀爀开甀猀攀爀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-07-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all the people list names from people.people_list_names for the connected user.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀 搀攀琀愀椀氀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀猀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 渀漀渀攀 
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of people lists.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - Data validation errors ਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀攀漀瀀氀攀开氀椀猀琀猀开昀漀爀开甀猀攀爀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	      SELECT਀ऀऀऀऀ 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀          䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ  
				 ISNULL(pln.mnem, '')        AS 'Mnemonic',਀ऀऀऀऀ 瀀氀渀⸀渀愀洀攀                    䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				 ISNULL(pln.description, '') AS 'Description',਀ऀऀऀऀ 瀀氀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
		         CONVERT(NVARCHAR(30), pl.created, 120) AS 'Created',਀ऀऀऀऀ 瀀氀⸀最爀愀渀琀攀搀开戀礀               䄀匀 ✀䌀爀攀愀琀攀搀 䈀礀✀ 
            FROM people.people_lists AS pl਀ऀ   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
	          ON     pl.people_list_id਀ऀऀऀ      㴀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
	   LEFT JOIN user_restr.sid_list AS sl਀ऀ          伀一   瀀氀⸀猀椀搀开椀搀 
			     = sl.sid_id਀ऀ       圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀  
		ORDER BY 'List Position';਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀攀爀猀漀渀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 09-01-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all the individuals on a people list from people.people_lists for a given people list.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀 搀攀琀愀椀氀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
/**਀⨀ 䰀椀猀琀猀 愀氀氀 琀栀攀 椀渀搀椀瘀椀搀甀愀氀猀 漀渀 愀 瀀攀漀瀀氀攀 氀椀猀琀 昀爀漀洀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 昀漀爀 愀 最椀瘀攀渀 瀀攀漀瀀氀攀 氀椀猀琀⸀ 
* ਀⨀ ⨀⨀䄀挀挀攀瀀琀愀戀氀攀 䤀渀瀀甀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀㨀  䴀甀猀琀 戀攀 愀 瘀愀氀椀搀 椀搀 昀爀漀洀 琀栀攀 瀀攀漀瀀氀攀开氀椀猀琀猀 琀愀戀氀攀⸀  
*਀⨀ 
* **Return Values:**਀⨀ 
* - A list of individuals.  ਀⨀ ⴀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀ 伀唀吀倀唀吀㨀 䐀攀猀挀爀椀瀀琀椀瘀攀 猀琀愀琀甀猀 洀攀猀猀愀最攀 漀昀 琀栀攀 瀀爀漀挀攀搀甀爀攀✀猀 攀砀攀挀甀琀椀漀渀⸀ 
* - @transaction_status nchar(50) OUTPUT: Indicates the transaction status ('Good', 'Bad', or default 'Transaction not attempted').਀⨀ 
* **Error and Exception Conditions:**਀⨀ 
* - Data validation errors ਀⨀ 
* **Side Effects:**਀⨀ 
* - None਀⨀ 
* **Preconditions:**਀⨀ 
* - None਀⨀ 
* **Postconditions:**਀⨀ ⴀ 吀栀攀 瀀爀漀挀攀搀甀爀攀 爀攀琀甀爀渀猀 猀琀愀琀甀猀 洀攀猀猀愀最攀猀 椀渀搀椀挀愀琀椀渀最 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 漀瀀攀爀愀琀椀漀渀⸀ 
*਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀攀爀猀漀渀猀开戀礀开瀀攀漀瀀氀攀开氀椀猀琀崀  
਀     䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 戀椀最椀渀琀             㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
	      -- Check the record id਀ऀऀ  䤀䘀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀 㴀 　 
			 SET @peoplelistid = NULL;਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @peoplelistid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀倀攀漀瀀氀攀䰀椀猀琀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPeopleListID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT pln.people_list_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
							WHERE pln.people_list_id = @peoplelistid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀倀攀漀瀀氀攀䰀椀猀琀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on PeopleListIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 䀀瀀攀漀瀀氀攀氀椀猀琀椀搀                   䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
				 pl.sid_id                       AS 'User ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀             䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
				 ISNULL(sl.descr, '')            AS 'User Description',਀ऀऀ         䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀         䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				 ISNULL(pl.list_position, 0)     AS 'Person List Position',਀ऀऀ         䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 瀀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				 pl.granted_by                   AS 'Created By',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'਀            䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
	   LEFT JOIN user_restr.sid_list AS sl਀ऀ          伀一   瀀氀⸀猀椀搀开椀搀 
			     = sl.sid_id਀ऀ       圀䠀䔀刀䔀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		         = @peoplelistid਀ऀऀ伀刀䐀䔀刀 䈀夀 ✀倀攀爀猀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 䄀匀䌀㬀 
	        ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开瀀爀椀瘀椀氀攀最攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 31-08-2025਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all the privileges for the connected user.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 
-- plus the list of privileges.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_privileges] ਀ 
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@temp_userauth_status nchar(10)      = 'Fail', ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀            㴀 一唀䰀䰀Ⰰ 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀甀猀攀爀椀搀 戀椀最椀渀琀                       㴀 一唀䰀䰀Ⰰ ⴀⴀ 唀猀攀爀 䤀䐀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀ऀऀ㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
 -- Authenticate the connected user for the role਀ 
   EXEC [internal].[usp_AUTHENTICATE_authoriser] ਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀昀椀最甀爀愀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reviewer',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀愀搀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoPermission');਀ऀ䔀一䐀 
਀ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀⸀  
਀ 
--  Add the username to the output Message਀ 
      SET @message = CONCAT(@message, ' | Username: ', ISNULL(@username, ''));਀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY ਀ 
਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
਀ऀ  匀䔀䰀䔀䌀吀 䀀甀猀攀爀椀搀 㴀 猀椀搀开椀搀 
	    FROM user_restr.sid_list AS sl਀ऀ   圀䠀䔀刀䔀 猀氀⸀猀椀搀 
	         = @connectedusersid;਀ 
	     SELECT   'Controller Document Group'                  AS 'Privilege Type',਀ऀऀऀऀ  挀搀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀           䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  (SELECT cdgn.attr_name਀ऀऀऀऀ     䘀刀伀䴀 砀爀攀昀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 挀搀最渀 
					WHERE  cdgsl.controller_doc_group_name_id਀ऀऀऀऀऀ      㴀 挀搀最渀⸀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀开椀搀⤀ 䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), cdgsl.created, 120)    AS 'Granted On',਀ऀऀऀऀ  挀搀最猀氀⸀最爀愀渀琀攀搀开戀礀                             䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM user_restr.controller_doc_group_sid_links AS cdgsl਀ऀऀ   圀䠀䔀刀䔀 挀搀最猀氀⸀猀椀搀开椀搀 
		         = @userid਀ 
		UNION ALL਀ऀ     匀䔀䰀䔀䌀吀   ✀䌀漀渀琀爀漀氀氀攀爀 䘀椀氀攀 䜀爀漀甀瀀✀                        䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  cfgsl.controller_file_group_name_id            AS 'Privilege ID',਀ऀऀऀऀ  ⠀匀䔀䰀䔀䌀吀 挀昀最渀⸀愀琀琀爀开渀愀洀攀 
				     FROM xref.controller_file_group_names AS cfgn਀ऀऀऀऀऀ圀䠀䔀刀䔀  挀昀最猀氀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀开椀搀 
					      = cfgn.controller_file_group_name_id)  AS 'Privilege Name',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 挀昀最猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀      䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  cfgsl.granted_by                               AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀瀀开猀椀搀开氀椀渀欀猀 䄀匀 挀昀最猀氀 
		   WHERE cfgsl.sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
	     SELECT   'Document Group Viewer'                  AS 'Privilege Type',਀ऀऀऀऀ  搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀                        䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  (SELECT dgn.attr_name਀ऀऀऀऀ     䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
					WHERE   dgvp.doc_group_id਀ऀऀऀऀऀ      㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀⤀              䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), dgvp.created, 120) AS 'Granted On',਀ऀऀऀऀ  搀最瘀瀀⸀最爀愀渀琀攀搀开戀礀                          䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM user_restr.doc_group_view_permissions AS dgvp਀ऀऀ   圀䠀䔀刀䔀 搀最瘀瀀⸀猀椀搀开椀搀 
		         = @userid਀ 
		UNION ALL਀ऀ     匀䔀䰀䔀䌀吀   ✀䘀漀爀洀 䜀爀漀甀瀀 伀眀渀攀爀✀                      䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  fgo.form_group_id                       AS 'Privilege ID',਀ऀऀऀऀ  ⠀匀䔀䰀䔀䌀吀 昀最渀⸀愀琀琀爀开渀愀洀攀 
				     FROM forms.form_group_names AS fgn਀ऀऀऀऀऀ圀䠀䔀刀䔀   昀最渀⸀昀漀爀洀开最爀漀甀瀀开椀搀 
					      = fgo.form_group_id)            AS 'Privilege Name',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 昀最漀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  fgo.granted_by                          AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀 䄀匀 昀最漀 
		   WHERE fgo.sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
	     SELECT   'People List'                          AS 'Privilege Type',਀ऀऀऀऀ  瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀                      䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  (SELECT pln.name਀ऀऀऀऀ     䘀刀伀䴀 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
					WHERE  pln.people_list_id਀ऀऀऀऀऀ      㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀⤀           䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), pl.created, 120) AS 'Granted On',਀ऀऀऀऀ  瀀氀⸀最爀愀渀琀攀搀开戀礀                          䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM people.people_lists AS pl਀ऀऀ   圀䠀䔀刀䔀 瀀氀⸀猀椀搀开椀搀 
		         = @userid਀ 
		UNION ALL਀ऀ     匀䔀䰀䔀䌀吀   ✀刀漀氀攀✀                                 䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  NULL                                   AS 'Privilege ID',਀ऀऀऀऀ  爀氀⸀爀漀氀攀开渀愀洀攀                           䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), rl.created, 120) AS 'Granted On',਀ऀऀऀऀ  爀氀⸀最爀愀渀琀攀搀开戀礀                          䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM user_restr.user_role_link AS rl਀ऀऀ   圀䠀䔀刀䔀 爀氀⸀猀椀搀开椀搀 
		         = @userid				 ਀ 
		UNION ALL਀ऀ     匀䔀䰀䔀䌀吀   ✀刀漀氀攀✀                                䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  NULL                                  AS 'Privilege ID',਀ऀऀऀऀ  ✀䄀甀琀栀漀爀椀稀攀爀✀                          䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          CONVERT(NVARCHAR(30), a.created, 120) AS 'Granted On',਀ऀऀऀऀ  ✀✀                                    䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
			FROM user_restr.authorisers AS a਀ऀऀ   圀䠀䔀刀䔀 愀⸀愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 
		         = @userid	਀ 
		UNION ALL਀ऀ     匀䔀䰀䔀䌀吀   ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀✀                          䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  dfsl.function_id                         AS 'Privilege ID',਀ऀऀऀऀ  ⠀匀䔀䰀䔀䌀吀 搀昀⸀渀愀洀攀 
				     FROM people.duty_functions AS df਀ऀऀऀऀऀ圀䠀䔀刀䔀     搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
					      = dfsl.function_id)              AS 'Privilege Name',਀ऀऀ          䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀昀猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  dfsl.granted_by                          AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
		   WHERE dfsl.sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
	     SELECT   'Tag Browsing Tree'        AS 'Privilege Type',਀ऀऀऀऀ  琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  tbtn.name                  AS 'Privilege Name',਀ऀऀ          ✀✀                         䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  ''                         AS 'Granted By'਀ऀऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀戀琀渀 
		   WHERE tbtn.sid_id਀ऀऀ         㴀 䀀甀猀攀爀椀搀 
਀ 
		UNION ALL਀ऀऀ匀䔀䰀䔀䌀吀 ✀吀愀最 刀攀氀愀琀椀漀渀猀栀椀瀀 吀爀攀攀✀   䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				ttn.tag_tree_id          AS 'Privilege ID',਀ऀऀऀऀ琀琀渀⸀渀愀洀攀                 䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
			    ''                       AS 'Granted On',਀ऀऀऀ    ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		FROM tagging.tag_tree_names AS ttn਀ऀऀ圀䠀䔀刀䔀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 
਀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
			 SELECT 'Tag Relationship Tree'  AS 'Privilege Type',਀ऀऀऀ        琀琀渀⸀琀愀最开琀爀攀攀开椀搀          䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
					ttn.name                 AS 'Privilege Name',਀ऀऀऀ        ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
			        ''                       AS 'Granted By'਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀 
						 INNER JOIN user_restr.tag_tree_permissions_flist AS ttpf਀ऀऀऀऀऀऀ         伀一    琀琀渀⸀琀愀最开琀爀攀攀开椀搀 
								    = ttpf.tag_tree_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						            ON   ttpf.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 INNER JOIN people.function_lists AS fl਀ऀऀऀऀऀऀ            伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   = fl.function_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
						            ON   fl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀऀ            伀一  搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   =  df.function_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON dfsl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE sl.sid = @connectedusersid਀ऀऀऀऀऀऀऀ    䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㰀㸀 ✀倀愀猀猀✀ 
        UNION ਀ 
					  ( SELECT 'Tag Relationship Tree'  AS 'Privilege Type',਀ऀऀऀऀऀ           琀琀渀㈀⸀琀愀最开琀爀攀攀开椀搀         䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
					           ttn2.name                AS 'Privilege Name',਀ऀऀऀ                   一唀䰀䰀                     䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
			                   NULL                     AS 'Granted By'਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀㈀ 
						 INNER JOIN user_restr.tag_tree_permissions_plist AS ttpp਀ऀऀऀऀऀऀ         伀一   琀琀渀㈀⸀琀愀最开琀爀攀攀开椀搀 
								    = ttpp.tag_tree_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
						            ON   ttpp.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN people.people_lists AS pl਀ऀऀऀऀऀऀ            伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   = pl.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON   pl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE sl.sid = @connectedusersid਀ऀऀऀऀऀऀऀ    䄀一䐀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㰀㸀 ✀倀愀猀猀✀ 
							  )਀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀 
		SELECT਀ऀऀऀ✀吀愀最 䜀爀漀甀瀀✀              䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
			tgn.tag_group_id         AS 'Privilege ID',਀ऀऀऀ琀最渀⸀琀愀最开最爀漀甀瀀开渀愀洀攀       䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
			''                       AS 'Granted On',਀ऀऀऀ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		FROM tagging.tag_group_identifier_names AS tgn਀ऀऀ圀䠀䔀刀䔀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ 
਀ 
		UNION ALL਀ऀऀ匀䔀䰀䔀䌀吀 
			'Tag Group'              AS 'Privilege Type',਀ऀऀऀ琀最椀渀⸀琀愀最开最爀漀甀瀀开椀搀        䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
			tgin.tag_group_name      AS 'Privilege Name',਀ऀऀऀ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
			''                       AS 'Granted By'਀ऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最椀渀 
			 INNER JOIN user_restr.tag_group_permissions_flist AS tgpf਀ऀऀऀऀऀ 伀一 琀最椀渀⸀琀愀最开最爀漀甀瀀开椀搀 㴀 琀最瀀昀⸀琀愀最开最爀漀甀瀀开椀搀 
			 INNER JOIN people.function_list_names AS fln਀ऀऀऀऀऀ 伀一 琀最瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			 INNER JOIN people.function_lists AS fl਀ऀऀऀऀऀ 伀一 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
			 INNER JOIN people.duty_functions AS df਀ऀऀऀऀऀ 伀一 昀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			 INNER JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀ 伀一 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
			 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀ 伀一 搀昀猀氀⸀猀椀搀开椀搀 㴀 猀氀⸀猀椀搀开椀搀 
		WHERE @iscontroller <> 'Pass'਀ऀऀ  䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
਀ऀऀ唀一䤀伀一 
		SELECT਀ऀऀऀ✀吀愀最 䜀爀漀甀瀀✀              䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
			tgin2.tag_group_id       AS 'Privilege ID',਀ऀऀऀ琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开渀愀洀攀     䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
			''                       AS 'Granted On',਀ऀऀऀ✀✀                       䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
		FROM tagging.tag_group_identifier_names AS tgin2਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀最瀀瀀 
					 ON tgin2.tag_group_id = tgpp.tag_group_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
					 ON tgpp.people_list_id = pln.people_list_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
					 ON pln.people_list_id = pl.people_list_id਀ऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
					 ON pl.sid_id = sl.sid_id਀ऀऀ圀䠀䔀刀䔀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㰀㸀 ✀倀愀猀猀✀ 
		  AND sl.sid = @connectedusersid਀ 
਀ऀऀ唀一䤀伀一 䄀䰀䰀  
	     SELECT DISTINCT  ਀ऀऀ         ✀䐀漀挀甀洀攀渀琀 䜀爀漀甀瀀 䔀搀椀琀✀   䄀匀 ✀倀爀椀瘀椀氀攀最攀 吀礀瀀攀✀Ⰰ 
				  dgn.doc_group_id       AS 'Privilege ID',਀ऀऀऀऀ  搀最渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀倀爀椀瘀椀氀攀最攀 一愀洀攀✀Ⰰ 
		          ''                     AS 'Granted On',਀ऀऀऀऀ  ✀✀                     䄀匀 ✀䜀爀愀渀琀攀搀 䈀礀✀ 
਀ऀऀऀऀऀ           䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
						  LEFT JOIN user_restr.doc_group_edit_perm_funct_lst AS dgepfl -- Check for membership of a duty function list਀ऀऀऀऀऀऀ            伀一      搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
									   = dgepfl.doc_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
						            ON dgepfl.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						  LEFT JOIN people.function_lists AS fl਀ऀऀऀऀऀऀ            伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   = fl.function_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
						            ON   fl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						  LEFT JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀऀ            伀一  搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   =  df.function_id਀ऀऀऀऀऀ             
						  LEFT JOIN user_restr.doc_group_edit_perm_people_lst AS dgeppl -- Check for membership of a people list਀ऀऀऀऀऀऀ            伀一      搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
									   = dgeppl.doc_group_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
						            ON dgeppl.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						  LEFT JOIN people.people_lists AS pl਀ऀऀऀऀऀऀ            伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   = pl.people_list_id਀ऀऀऀऀऀऀ  䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON   pl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
									OR dfsl.sid_id਀ऀऀऀऀऀऀऀऀऀ     㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE sl.sid = @connectedusersid਀ 
		UNION ALL ਀ऀ     匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀   
		         'File Group Edit'       AS 'Privilege Type',਀ऀऀऀऀ  昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀      䄀匀 ✀倀爀椀瘀椀氀攀最攀 䤀䐀✀Ⰰ 
				  fgn.attr_name          AS 'Privilege Name',਀ऀऀ          ✀✀                     䄀匀 ✀䜀爀愀渀琀攀搀 伀渀✀Ⰰ 
				  ''                     AS 'Granted By'਀ऀऀऀऀ  䘀刀伀䴀 砀爀攀昀⸀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 昀最渀 
਀ऀऀऀ    䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀昀椀氀攀开最爀漀甀瀀开攀搀椀琀开瀀攀爀洀开昀甀渀挀琀开氀猀琀 䄀匀 昀最攀瀀昀氀  ⴀⴀ 䌀栀攀挀欀 昀漀爀 氀椀渀欀 琀栀爀漀甀最栀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 
				       ON      fgn.file_group_id਀ऀऀऀऀऀ      㴀 昀最攀瀀昀氀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
				LEFT JOIN people.function_lists AS fl਀ऀऀऀऀऀ   伀一 昀最攀瀀昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀  
							 = fl.function_list_id਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
					   ON   fl.function_id ਀ऀऀऀऀऀऀ   㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
				LEFT JOIN people.duty_function_sid_links AS dfsl਀ऀऀऀऀऀ   伀一     搀昀⸀昀甀渀挀琀椀漀渀开椀搀  
						   = dfsl.function_id਀ 
			    LEFT JOIN user_restr.file_group_edit_perm_ppl_lst AS fgeppl  -- Check for link through people lists਀ऀऀऀऀ       伀一      昀最渀⸀昀椀氀攀开最爀漀甀瀀开椀搀 
					      = fgeppl.file_group_id ਀ऀऀऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
					   ON  fgeppl.people_list_id ਀ऀऀऀऀऀऀ   㴀    瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
				LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀ   伀一   瀀氀⸀猀椀搀开椀搀  
						   = sl.sid_id਀ऀऀऀऀऀऀ   伀刀 
						    dfsl.sid_id਀ऀऀऀऀऀऀऀ㴀 猀氀⸀猀椀搀开椀搀 
					WHERE sl.sid = @connectedusersid਀ 
				 ; ਀ 
				  ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_restr_doc_group_names]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ㄀㈀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀Ⰰ 攀砀挀攀瀀琀 琀栀漀猀攀 眀栀椀挀栀 栀愀瘀攀 渀漀 爀攀猀琀爀椀挀琀椀漀渀猀  
-- Output is a table of document groups, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_restr_doc_group_names] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀    㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		@nopermissionmessage nvarchar(200)   = '',     -- Communicates that the user does not have the required permission਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀       䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(dgn.mnem, '')   AS 'Mnemonic',਀ऀ            搀最渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(dgn.descr, '')  AS 'Description'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
	LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀ       伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		      = dgvp.doc_group_id਀    䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	       ON   dgvp.sid_id਀ऀऀ      㴀   猀氀⸀猀椀搀开椀搀 
	    WHERE (dgvp.sid_id IS NOT NULL਀ऀऀऀ    䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
			         ) ਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @transactionmessage = @tempmessage + ' | ' + ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀ ⬀ ✀ 簀 ✀ ⬀ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
-- Concatenate the messages਀⼀⨀ 
NOTE: "The + (String Concatenation) operator behaves differently when it works with an empty, ਀稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最 琀栀愀渀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 一唀䰀䰀Ⰰ 漀爀 甀渀欀渀漀眀渀 瘀愀氀甀攀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀  
character string can be specified as two single quotation marks without any characters ਀椀渀猀椀搀攀 琀栀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀⸀ 䄀 稀攀爀漀ⴀ氀攀渀最琀栀 戀椀渀愀爀礀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 　砀 眀椀琀栀漀甀琀  
any byte values specified in the hexadecimal constant. Concatenating a zero-length string ਀愀氀眀愀礀猀 挀漀渀挀愀琀攀渀愀琀攀猀 琀栀攀 琀眀漀 猀瀀攀挀椀昀椀攀搀 猀琀爀椀渀最猀⸀ 圀栀攀渀 礀漀甀 眀漀爀欀 眀椀琀栀 猀琀爀椀渀最猀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀Ⰰ  
the result of the concatenation depends on the session settings. Just like arithmetic ਀漀瀀攀爀愀琀椀漀渀猀 琀栀愀琀 愀爀攀 瀀攀爀昀漀爀洀攀搀 漀渀 渀甀氀氀 瘀愀氀甀攀猀Ⰰ 眀栀攀渀 愀 渀甀氀氀 瘀愀氀甀攀 椀猀 愀搀搀攀搀 琀漀 愀 欀渀漀眀渀  
value the result is typically an unknown value, a string concatenation operation that ਀椀猀 瀀攀爀昀漀爀洀攀搀 眀椀琀栀 愀 渀甀氀氀 瘀愀氀甀攀 猀栀漀甀氀搀 愀氀猀漀 瀀爀漀搀甀挀攀 愀 渀甀氀氀 爀攀猀甀氀琀⸀∀  
*/਀    䤀䘀 ⠀䀀洀攀猀猀愀最攀 㴀 ✀✀ 伀刀 䀀洀攀猀猀愀最攀 䤀匀 一唀䰀䰀⤀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 ✀ ✀㬀 
    IF (@transactionmessage <> '')         SET @message = @transactionmessage;਀ऀ䤀䘀 ⠀䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_sids_by_duty_function]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㤀ⴀ　㄀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀猀 猀椀搀 爀攀挀漀爀搀猀 昀漀爀 愀 最椀瘀攀渀 搀甀琀礀 昀甀渀挀琀椀漀渀 椀搀 昀爀漀洀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀⸀ 
-- Output is a list of records, status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
-- =============================================਀⼀⨀⨀ 
* Lists sid records for a given duty function id from people.duty_function_sid_links.਀⨀  
* **Acceptable Inputs:**਀⨀ 
* - @functionid਀⨀ 
*਀⨀ ⨀⨀刀攀琀甀爀渀 嘀愀氀甀攀猀㨀⨀⨀ 
*਀⨀ ⴀ 䄀 氀椀猀琀 漀昀 爀攀挀漀爀搀猀⸀   
* - @message nvarchar(1000) OUTPUT: Descriptive status message of the procedure's execution.਀⨀ ⴀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㔀　⤀ 伀唀吀倀唀吀㨀 䤀渀搀椀挀愀琀攀猀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 ⠀✀䜀漀漀搀✀Ⰰ ✀䈀愀搀✀Ⰰ 漀爀 搀攀昀愀甀氀琀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀⤀⸀ 
*਀⨀ ⨀⨀䔀爀爀漀爀 愀渀搀 䔀砀挀攀瀀琀椀漀渀 䌀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀匀椀搀攀 䔀昀昀攀挀琀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀爀攀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
*਀⨀ ⴀ 一漀渀攀 
*਀⨀ ⨀⨀倀漀猀琀挀漀渀搀椀琀椀漀渀猀㨀⨀⨀ 
* - The procedure returns status messages indicating the outcome of the operation.਀⨀ 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_sids_by_duty_function] ਀ 
     @functionid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	 -- Check the function id਀ऀऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 　 
			 SET @functionid = NULL; ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		  IF @functionid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionID.');਀ऀऀऀ 䔀一䐀 
		  ELSE -- A record id has been supplied਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT df.function_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
							WHERE df.function_id = @functionid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctionIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 䀀昀甀渀挀琀椀漀渀椀搀                     䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ 
				 dfsl.sid_id                     AS 'User ID',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀             䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
		         ISNULL(sl.username, '')         AS 'System Username',਀ऀऀ         䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀昀猀氀⸀挀爀攀愀琀攀搀Ⰰ ㄀㈀　⤀ 䄀匀 ✀䌀爀攀愀琀攀搀✀Ⰰ 
				 dfsl.granted_by                 AS 'Granted By',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                             AS 'Windows Account Current'				 ਀ऀऀ    䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
	   LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀ  伀一 搀昀猀氀⸀猀椀搀开椀搀  
			     = sl.sid_id਀ऀऀ   圀䠀䔀刀䔀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀 
			ORDER BY 'System Username';਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_br_tr_perm_flists]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 愀渀搀 氀椀渀欀攀搀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀愀洀攀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 昀爀漀洀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 
-- Output is a table of tag browsing trees and function lists, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_br_tr_perm_flists] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀            㴀 ✀一漀✀Ⰰ 
		@temp_userauth_status nchar(10)      = 'Fail',਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
਀ 
SELECT DISTINCT tbtn.tag_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            tbtn.name				  AS 'Tag Browsing Tree Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				fln.function_list_id      AS 'Function List ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀      䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				fln.name                  AS 'Function List Name',਀ऀऀऀऀ昀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀           䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM tagging.tag_browsing_tree_names AS tbtn਀   䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀戀琀瀀昀 
           ON    tbtn.tag_browsing_tree_id਀ऀऀ      㴀 琀戀琀瀀昀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
    LEFT JOIN people.function_list_names AS fln਀ऀ       伀一  琀戀琀瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		      = fln.function_list_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
	       ON  fln.function_list_id਀ऀऀ      㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
	LEFT JOIN people.duty_functions AS df਀ऀ       伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
		      = df.function_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
	       ON     df.function_id਀ऀऀ      㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
	LEFT JOIN user_restr.sid_list AS sl਀ऀ       伀一 搀昀猀氀⸀猀椀搀开椀搀 
		      = sl.sid_id਀ऀ    圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
		   OR @iscontroller = 'Yes'਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀ 䐀䔀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_br_tr_perm_plists]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 瀀攀漀瀀氀攀 氀椀猀琀猀 愀渀搀 氀椀渀欀攀搀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀愀洀攀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 昀爀漀洀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开戀爀开琀爀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 
-- Output is a table of tag browsing trees and people lists, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_br_tr_perm_plists] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀            㴀 ✀一漀✀Ⰰ 
		@temp_userauth_status nchar(10)      = 'Fail',਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
਀ 
SELECT DISTINCT tbtn.tag_browsing_tree_id AS 'Tag Browsing Tree ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            tbtn.name                 AS 'Tag Browsing Tree Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀戀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				pln.people_list_id        AS 'People List ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀瀀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀      䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				pln.name                  AS 'People List Name',਀ऀऀऀऀ瀀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀           䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM tagging.tag_browsing_tree_names AS tbtn਀   䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开戀爀开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀戀琀瀀瀀 
           ON    tbtn.tag_browsing_tree_id਀ऀऀ      㴀 琀戀琀瀀瀀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
    LEFT JOIN people.people_list_names AS pln਀ऀ       伀一  琀戀琀瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		      = pln.people_list_id਀    䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
	       ON  pln.people_list_id਀ऀऀ      㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
	LEFT JOIN user_restr.sid_list AS sl਀ऀ       伀一   瀀氀⸀猀椀搀开椀搀 
		      = sl.sid_id਀ऀ    圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
		   OR @iscontroller = 'Yes'਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 䈀爀漀眀猀椀渀最 吀爀攀攀 䤀䐀✀ 䐀䔀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_by_tag_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 琀栀攀 搀攀琀愀椀氀猀 昀漀爀 愀 最椀瘀攀渀 琀愀最 䤀䐀⸀  
-- Output is a table of tag data, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_by_tag_id] ਀ 
     @tag_id bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	  -- Check if a tag was supplied਀ऀ  䤀䘀 䀀琀愀最开椀搀 㴀 　  
	    SET @tag_id = NULL;਀ऀ  䤀䘀 䀀琀愀最开椀搀 䤀匀 一唀䰀䰀 
	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoTagID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䤀䐀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @tag_id)਀ऀऀऀ 䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_id), '  ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀一䐀 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT dt.tag_id              AS 'Tag ID',਀ऀऀ        䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
				dt.tag_name            AS 'Tag Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM tagging.doc_tags AS dt਀          圀䠀䔀刀䔀 搀琀⸀琀愀最开椀搀  
		        = @tag_id਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 一愀洀攀✀ 䄀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_get_ancestors]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀栀攀 愀渀挀攀猀琀漀爀猀 漀昀 愀 琀愀最 琀爀攀攀 渀漀搀攀 
-- Output is a table of tag data, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_get_ancestors] ਀ 
     @tag_tree_node_id bigint         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀愀最开琀爀攀攀开椀搀 戀椀最椀渀琀Ⰰ 
		@node_hierarchyid hierarchyid,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 IF @tag_tree_node_id = 0਀    匀䔀吀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 一唀䰀䰀㬀 
 IF @tag_tree_node_id IS NULL਀ ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoNode');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
  ELSE -- A node ID has been supplied.  Check if it exists. ਀    䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT tag_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   tag_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TreeNodeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ऀ䔀一䐀 
	IF @data_validation_status = 'Pass'਀ऀ 䈀䔀䜀䤀一 
	       SELECT @node_hierarchyid = tag_tree_hierarchyid਀ऀऀ     䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
			WHERE    tag_tree_node_id ਀ऀऀऀ      㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		       ਀ऀऀ   匀䔀吀 䀀琀愀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
									 = @tag_tree_node_id);਀ऀ 䔀一䐀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀      䄀匀 ✀吀愀最 吀爀攀攀 一漀搀攀 䤀䐀✀Ⰰ 
		        dt.tag_id              AS 'Tag ID',਀ऀऀ        䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
				dt.tag_name            AS 'Tag Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ttn.tag_tree_node_id   AS 'Tag Tree Node ID',਀ऀऀऀऀ琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀吀漀匀琀爀椀渀最⠀⤀ 䄀匀 ✀吀愀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀ 
		   FROM tagging.tag_tree_nodes AS ttn਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
	         ON  ttn.tag_id਀ऀऀऀ    㴀 搀琀⸀琀愀最开椀搀ऀऀ 
		  WHERE tag_tree_hierarchyid.IsDescendantOf(@node_hierarchyid) = 1਀ऀऀ    䄀一䐀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㰀㸀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
	   ORDER BY 'Tag Tree HierarchyId' ASC;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开最攀琀开搀攀猀挀攀渀搀愀渀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all descendants of a tag tree node਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 琀愀最 搀愀琀愀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开最攀琀开搀攀猀挀攀渀搀愀渀琀猀崀  
਀     䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@tag_tree_id bigint,਀ऀऀ䀀渀漀搀攀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  -- Check the tag tree node ID਀ 䤀䘀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 　 
    SET @tag_tree_node_id = NULL;਀ 䤀䘀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 䤀匀 一唀䰀䰀 
 	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一漀搀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀  䔀䰀匀䔀 ⴀⴀ 䄀 渀漀搀攀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
    BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		                 FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @tag_tree_node_id)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TreeNodeNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
	END਀ऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
	 BEGIN਀ऀ       匀䔀䰀䔀䌀吀 䀀渀漀搀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
		     FROM tagging.tag_tree_nodes਀ऀऀऀ圀䠀䔀刀䔀    琀愀最开琀爀攀攀开渀漀搀攀开椀搀  
			      = @tag_tree_node_id਀ऀऀ        
		   SET @tag_tree_id = (SELECT tag_tree_id਀ऀऀऀऀऀऀऀऀ䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
							   WHERE tag_tree_node_id਀ऀऀऀऀऀऀऀऀऀ 㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀㬀 
	 END਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT @tag_tree_node_id      AS 'Tag Tree Node ID',਀ऀऀ        搀琀⸀琀愀最开椀搀              䄀匀 ✀吀愀最 䤀䐀✀Ⰰ 
		        ISNULL(dt.mnem, '')    AS 'Tag Mnemonic',਀ऀऀऀऀ搀琀⸀琀愀最开渀愀洀攀            䄀匀 ✀吀愀最 一愀洀攀✀Ⰰ 
				ISNULL(dt.descr, '')   AS 'Tag Description',਀ऀऀऀऀ琀琀渀⸀琀愀最开琀爀攀攀开渀漀搀攀开椀搀   䄀匀 ✀吀愀最 吀爀攀攀 一漀搀攀 䤀䐀✀Ⰰ 
				ttn.tag_tree_hierarchyid.ToString() AS 'Tag Tree HierarchyId'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 䄀匀 琀琀渀 
	 INNER JOIN tagging.doc_tags AS dt਀ऀ         伀一  琀琀渀⸀琀愀最开椀搀 
			    = dt.tag_id		਀ऀऀ  圀䠀䔀刀䔀 琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀䀀渀漀搀攀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀ 
		    AND tag_tree_node_id <> @tag_tree_node_id਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀ 䄀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_get_root]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 爀漀漀琀 渀漀搀攀 昀漀爀 愀 最椀瘀攀渀 琀愀最 琀爀攀攀 渀漀搀攀 
-- Output is a table of tag data, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_get_root] ਀ 
     @tag_tree_node_id bigint         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀愀最开琀爀攀攀开椀搀 戀椀最椀渀琀Ⰰ 
		@node_hierarchyid hierarchyid,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 IF @tag_tree_node_id = 0਀    匀䔀吀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 一唀䰀䰀㬀 
 IF @tag_tree_node_id IS NULL਀ ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoNode');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
  ELSE -- A node ID has been supplied.  Check if it exists. ਀    䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT tag_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   tag_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TreeNodeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ऀ䔀一䐀 
	IF @data_validation_status = 'Pass'਀ऀ 䈀䔀䜀䤀一 
	       SELECT @node_hierarchyid = tag_tree_hierarchyid਀ऀऀ     䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
			WHERE    tag_tree_node_id ਀ऀऀऀ      㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		       ਀ऀऀ   匀䔀吀 䀀琀愀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
									 = @tag_tree_node_id);਀ऀ 䔀一䐀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀      䄀匀 ✀吀愀最 吀爀攀攀 一漀搀攀 䤀䐀✀Ⰰ 
		        dt.tag_id              AS 'Tag ID',਀ऀऀ        䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
				dt.tag_name            AS 'Tag Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ttn.tag_tree_node_id   AS 'Tag Tree Node ID',਀ऀऀऀऀ琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀吀漀匀琀爀椀渀最⠀⤀ 䄀匀 ✀吀愀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀ 
		   FROM tagging.tag_tree_nodes AS ttn਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
	         ON  ttn.tag_id਀ऀऀऀ    㴀 搀琀⸀琀愀最开椀搀ऀऀ 
		  WHERE tag_tree_hierarchyid.GetLevel() = 0਀ऀऀ    䄀一䐀 琀愀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开琀爀攀攀开椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_group_perm_flists]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 愀渀搀 氀椀渀欀攀搀 琀愀最 最爀漀甀瀀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 昀爀漀洀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀崀 
-- Output is a table of tag groups and function lists, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_group_perm_flists] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀            㴀 ✀一漀✀Ⰰ 
		@temp_userauth_status nchar(10)      = 'Fail',਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀  匀䔀吀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀㬀 
਀匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 琀最渀⸀琀愀最开最爀漀甀瀀开椀搀       䄀匀 ✀吀愀最 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(tgn.mnem, '')   AS 'Tag Group Mnemonic',਀ऀ            琀最渀⸀琀愀最开最爀漀甀瀀开渀愀洀攀     䄀匀 ✀吀愀最 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(tgn.descr, '')  AS 'Tag Group Description',਀ऀऀऀऀ昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀   䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䤀䐀✀Ⰰ 
				ISNULL(fln.mnem, '')   AS 'Function List Mnemonic',਀ऀऀऀऀ昀氀渀⸀渀愀洀攀               䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				fln.description        AS 'Function List Description'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最渀 
   INNER JOIN user_restr.tag_group_permissions_flist AS ttpf਀           伀一    琀最渀⸀琀愀最开最爀漀甀瀀开椀搀 
		      = ttpf.tag_group_id਀    䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
	       ON  ttpf.function_list_id਀ऀऀ      㴀 昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
	LEFT JOIN people.function_lists AS fl਀ऀ       伀一  昀氀渀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		      = fl.function_list_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
	       ON   fl.function_id਀ऀऀ      㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
	LEFT JOIN people.duty_function_sid_links AS dfsl਀ऀ       伀一     搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		      = dfsl.function_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	       ON dfsl.sid_id਀ऀऀ      㴀 猀氀⸀猀椀搀开椀搀 
	    WHERE sl.sid = @connectedusersid਀ऀऀ   伀刀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀ 
਀ 
	   ORDER BY 'Tag Group ID' DESC;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开最爀漀甀瀀开瀀攀爀洀开瀀氀椀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects people lists and linked tag groups which the connected user has rights to from [user_restr].[tag_group_permissions_plist]਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 琀愀最 最爀漀甀瀀猀 愀渀搀 瀀攀漀瀀氀攀 氀椀猀琀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开最爀漀甀瀀开瀀攀爀洀开瀀氀椀猀琀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@iscontroller nvarchar(3)            = 'No',਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀䘀愀椀氀✀Ⰰ 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
-- Check if the user is a controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass'  SET @iscontroller = 'Yes';਀ 
SELECT DISTINCT tgn.tag_group_id       AS 'Tag Group ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀最渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䜀爀漀甀瀀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            tgn.tag_group_name     AS 'Tag Group Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀最渀⸀搀攀猀挀爀Ⰰ ✀✀⤀  䄀匀 ✀吀愀最 䜀爀漀甀瀀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				pln.people_list_id     AS 'People List ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀瀀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				pln.name               AS 'People List Name',਀ऀऀऀऀ瀀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀        䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM tagging.tag_group_identifier_names AS tgn਀   䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀最瀀昀 
           ON    tgn.tag_group_id਀ऀऀ      㴀 琀最瀀昀⸀琀愀最开最爀漀甀瀀开椀搀 
    LEFT JOIN people.people_list_names AS pln਀ऀ       伀一  琀最瀀昀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		      = pln.people_list_id਀    䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
	       ON  pln.people_list_id਀ऀऀ      㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
	LEFT JOIN user_restr.sid_list AS sl਀ऀ       伀一   瀀氀⸀猀椀搀开椀搀 
		      = sl.sid_id਀ऀ    圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
		   OR @iscontroller = 'Yes'਀ 
	   ORDER BY 'Tag Group ID' DESC;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开最爀漀甀瀀猀开戀礀开琀愀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 26-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all tag group name details linked to a given tag਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开最爀漀甀瀀猀开戀礀开琀愀最崀  
  ਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @tag_id = 0 ਀ऀ    匀䔀吀 䀀琀愀最开椀搀 㴀 一唀䰀䰀㬀 
	  IF @tag_id IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ 
		END਀ 
	  -- Check if the tag exists਀ऀ  䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	                        FROM tagging.doc_tags਀ऀऀऀऀऀ       圀䠀䔀刀䔀 琀愀最开椀搀 㴀 䀀琀愀最开椀搀⤀ 
			 BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id   = 'TagIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
					IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 䀀琀愀最开椀搀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀愀最䤀䐀一漀琀䔀砀椀猀琀✀⤀㬀 
					SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 END਀  
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT @tag_id                AS 'Tag ID',਀ऀऀ        琀最渀⸀琀愀最开最爀漀甀瀀开椀搀       䄀匀 ✀吀愀最 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(tgn.mnem, '')   AS 'Tag Group Mnemonic',਀ऀ            琀最渀⸀琀愀最开最爀漀甀瀀开渀愀洀攀     䄀匀 ✀吀愀最 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(tgn.descr, '')  AS 'Tag Group Description',਀ऀऀऀऀ琀最渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀      䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
		   FROM tagging.doc_tags AS dt਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 䄀匀 琀琀琀最氀 
	         ON      dt.tag_id਀ऀऀऀ    㴀 琀琀琀最氀⸀琀愀最开椀搀 
	 INNER JOIN tagging.tag_group_identifier_names AS tgn਀ऀ         伀一  琀琀琀最氀⸀琀愀最开最爀漀甀瀀开椀搀 
			    =  tgn.tag_group_id਀ऀऀ  圀䠀䔀刀䔀 搀琀⸀琀愀最开椀搀 
		        = @tag_id਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_groups_with_ed_perm]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀愀最 最爀漀甀瀀 渀愀洀攀 搀攀琀愀椀氀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 氀椀渀欀 琀愀最猀 琀漀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_groups_with_ed_perm] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀            㴀 一唀䰀䰀Ⰰ 
  		@usersid varbinary(100)              = NULL, -- The SID of the connected user਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  ऀ 䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 愀 挀漀渀琀爀漀氀氀攀爀 琀栀攀渀 琀栀攀礀 栀愀瘀攀 爀椀最栀琀猀 琀漀 氀椀渀欀 琀愀最猀 琀漀 愀渀礀 琀愀最 最爀漀甀瀀 
		   BEGIN਀ऀऀऀ 匀䔀䰀䔀䌀吀 琀最渀⸀琀愀最开最爀漀甀瀀开椀搀       䄀匀 ✀吀愀最 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
					ISNULL(tgn.mnem, '')   AS 'Tag Group Mnemonic',਀ऀऀऀऀऀ琀最渀⸀琀愀最开最爀漀甀瀀开渀愀洀攀     䄀匀 ✀吀愀最 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
					ISNULL(tgn.descr, '')  AS 'Tag Group Description',਀ऀऀऀऀऀ琀最渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀      䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
			   FROM tagging.tag_group_identifier_names AS tgn਀ऀऀ   䔀一䐀 
਀ऀऀ䔀䰀匀䔀 
਀ऀ     匀䔀䰀䔀䌀吀 琀最椀渀⸀琀愀最开最爀漀甀瀀开椀搀       䄀匀 ✀吀愀最 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(tgin.mnem, '')   AS 'Tag Group Mnemonic',਀ऀ            琀最椀渀⸀琀愀最开最爀漀甀瀀开渀愀洀攀     䄀匀 ✀吀愀最 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(tgin.descr, '')  AS 'Tag Group Description',਀ऀऀऀऀ琀最椀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀      䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
          FROM tagging.tag_group_identifier_names AS tgin਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀最瀀昀 
						         ON   tgin.tag_group_id਀ऀऀऀऀऀऀऀऀ    㴀 琀最瀀昀⸀琀愀最开最爀漀甀瀀开椀搀 
						 INNER JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ            伀一   琀最瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   =  fln.function_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						            ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 INNER JOIN people.duty_functions AS df਀ऀऀऀऀऀऀ            伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   = df.function_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						            ON  dfsl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一 搀昀猀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
  							       ਀                     唀一䤀伀一  
਀ऀऀऀऀऀ        ⠀匀䔀䰀䔀䌀吀 琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开椀搀       䄀匀 ✀吀愀最 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				                    ISNULL(tgin2.mnem, '')   AS 'Tag Group Mnemonic',਀ऀ                                琀最椀渀㈀⸀琀愀最开最爀漀甀瀀开渀愀洀攀     䄀匀 ✀吀愀最 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				                    ISNULL(tgin2.descr, '')  AS 'Tag Group Description',਀ऀऀऀऀ                    琀最椀渀㈀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀      䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
					           FROM tagging.tag_group_identifier_names AS tgin2਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀最瀀瀀 
						         ON   tgin2.tag_group_id਀ऀऀऀऀऀऀऀऀ    㴀 琀最瀀瀀⸀琀愀最开最爀漀甀瀀开椀搀 
						 INNER JOIN people.people_list_names AS pln਀ऀऀऀऀऀऀ            伀一   琀最瀀瀀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   =  pln.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
						            ON  pln.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 瀀氀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一   瀀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
							  )਀ऀ   伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_tree_by_tree_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀愀最猀 昀漀爀 愀 最椀瘀攀渀 琀愀最 琀爀攀攀 椀搀⸀  
-- Output is a table of tag data, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_tree_by_tree_id] ਀ 
     @tag_treeid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ऀ  ऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 㴀 　  
			 SET @tag_treeid = NULL;਀  
		  -- Check if a tag tree id was supplied. ਀ऀऀ  䤀䘀 䀀琀愀最开琀爀攀攀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN -- A tag tree id has not been supplied.਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoTagTree', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最吀爀攀攀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀 
			 BEGIN  ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								  FROM tagging.tag_tree_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开琀爀攀攀开椀搀  
								       = @tag_treeid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 琀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最吀爀攀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagTreeNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
			 END਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 䀀琀愀最开琀爀攀攀椀搀            䄀匀 ✀吀愀最 吀爀攀攀 䤀䐀✀Ⰰ 
		        dt.tag_id              AS 'Tag ID',਀ऀऀ        䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
				dt.tag_name            AS 'Tag Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ttn.tag_tree_node_id   AS 'Tag Tree Node ID',਀ऀऀऀऀ琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀吀漀匀琀爀椀渀最⠀⤀ 䄀匀 ✀吀愀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀ 
		   FROM tagging.tag_tree_nodes AS ttn਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
	         ON  ttn.tag_id਀ऀऀऀ    㴀 搀琀⸀琀愀最开椀搀ऀऀ 
		  WHERE ttn.tag_tree_id਀ऀऀ        㴀  䀀琀愀最开琀爀攀攀椀搀 
	   ORDER BY 'Tag Tree HierarchyId' ASC;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开琀爀攀攀开瀀攀爀洀开昀氀椀猀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 24-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects function lists and linked tag tree names which the connected user has rights to from [user_restr].[tag_tree_permissions_flist]਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 琀愀最 琀爀攀攀猀 愀渀搀 昀甀渀挀琀椀漀渀 氀椀猀琀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开琀爀攀攀开瀀攀爀洀开昀氀椀猀琀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@iscontroller nvarchar(3)            = 'No',਀ऀऀ䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀䘀愀椀氀✀Ⰰ 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
-- Check if the user is a controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass'  SET @iscontroller = 'Yes';਀ 
SELECT DISTINCT ttn.tag_tree_id        AS 'Tag Tree ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            ttn.name               AS 'Tag Tree Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀  䄀匀 ✀吀愀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				fln.function_list_id   AS 'Function List ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀昀氀渀⸀洀渀攀洀Ⰰ ✀✀⤀   䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				fln.name               AS 'Function List Name',਀ऀऀऀऀ昀氀渀⸀搀攀猀挀爀椀瀀琀椀漀渀        䄀匀 ✀䘀甀渀挀琀椀漀渀 䰀椀猀琀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM tagging.tag_tree_names AS ttn਀    䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀琀瀀昀 
           ON    ttn.tag_tree_id਀ऀऀ      㴀 琀琀瀀昀⸀琀愀最开琀爀攀攀开椀搀 
    LEFT JOIN people.function_list_names AS fln਀ऀ       伀一  琀琀瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
		      = fln.function_list_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
	       ON  fln.function_list_id਀ऀऀ      㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
	LEFT JOIN people.duty_functions AS df਀ऀ       伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
		      = df.function_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
	       ON     df.function_id਀ऀऀ      㴀 搀昀猀氀⸀昀甀渀挀琀椀漀渀开椀搀 
	LEFT JOIN user_restr.sid_list AS sl਀ऀ       伀一 搀昀猀氀⸀猀椀搀开椀搀 
		      = sl.sid_id਀ऀ    圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
		   OR @iscontroller = 'Yes'਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 吀爀攀攀 䤀䐀✀ 䐀䔀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tag_tree_perm_plists]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 瀀攀漀瀀氀攀 氀椀猀琀猀 愀渀搀 氀椀渀欀攀搀 琀愀最 爀攀氀愀琀椀漀渀猀栀椀瀀 琀爀攀攀猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 昀爀漀洀 嬀甀猀攀爀开爀攀猀琀爀崀⸀嬀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀崀 
-- Output is a table of tag trees and people lists, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tag_tree_perm_plists] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㌀⤀            㴀 ✀一漀✀Ⰰ 
		@temp_userauth_status nchar(10)      = 'Fail',਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
-- Check if the user is a controller਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass'  SET @iscontroller = 'Yes';਀ 
਀匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 琀琀渀⸀琀愀最开琀爀攀攀开椀搀        䄀匀 ✀吀愀最 吀爀攀攀 䤀䐀✀Ⰰ 
				ISNULL(ttn.mnem, '')   AS 'Tag Tree Mnemonic',਀ऀ            琀琀渀⸀渀愀洀攀               䄀匀 ✀吀愀最 吀爀攀攀 一愀洀攀✀Ⰰ 
				ISNULL(ttn.descr, '')  AS 'Tag Tree Description',਀ऀऀऀऀ瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀     䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 䤀䐀✀Ⰰ 
				ISNULL(pln.mnem, '')   AS 'People List Mnemonic',਀ऀऀऀऀ瀀氀渀⸀渀愀洀攀               䄀匀 ✀倀攀漀瀀氀攀 䰀椀猀琀 一愀洀攀✀Ⰰ 
				pln.description        AS 'People List Description'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀 
   INNER JOIN user_restr.tag_tree_permissions_plist AS ttpf਀           伀一    琀琀渀⸀琀愀最开琀爀攀攀开椀搀 
		      = ttpf.tag_tree_id਀    䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
	       ON  ttpf.people_list_id਀ऀऀ      㴀 瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
    LEFT JOIN people.people_lists AS pl਀ऀ       伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
		      = pl.people_list_id਀ऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
	       ON   pl.sid_id਀ऀऀ      㴀 猀氀⸀猀椀搀开椀搀 
	    WHERE sl.sid = @connectedusersid਀ऀऀ   伀刀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀夀攀猀✀ 
	   ORDER BY 'Tag Tree ID' DESC;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开琀爀攀攀猀开眀椀琀栀开攀搀开瀀攀爀洀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 28-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects tag tree name details for all tag relationship trees which the connected user has edit rights for਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最开琀爀攀攀猀开眀椀琀栀开攀搀开瀀攀爀洀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@iscontroller nvarchar(5)            = NULL,਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
਀ऀ  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
	  		 @role_to_check = 'Controller',਀ऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 伀唀吀倀唀吀㬀 
਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ  䤀䘀 䀀椀猀挀漀渀琀爀漀氀氀攀爀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䄀 挀漀渀琀爀漀氀氀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 愀氀氀 琀愀最 琀爀攀攀猀 
	    BEGIN਀ऀऀऀ 匀䔀䰀䔀䌀吀 琀琀渀⸀琀愀最开琀爀攀攀开椀搀          䄀匀 ✀吀愀最 吀爀攀攀 䤀䐀✀Ⰰ 
					ISNULL(ttn.mnem, '')     AS 'Tag Tree Mnemonic',਀ऀऀऀऀऀ琀琀渀⸀渀愀洀攀                 䄀匀 ✀吀愀最 吀爀攀攀 一愀洀攀✀Ⰰ 
					ISNULL(ttn.descr, '')    AS 'Tag Tree Description',਀ऀऀऀऀऀ琀琀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
			   FROM tagging.tag_tree_names AS ttn਀ऀ       伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	    END਀ऀऀ䔀䰀匀䔀 
		  BEGIN਀ऀऀऀ 匀䔀䰀䔀䌀吀 琀琀渀⸀琀愀最开琀爀攀攀开椀搀          䄀匀 ✀吀愀最 吀爀攀攀 䤀䐀✀Ⰰ 
					ISNULL(ttn.mnem, '')     AS 'Tag Tree Mnemonic',਀ऀऀऀऀऀ琀琀渀⸀渀愀洀攀                 䄀匀 ✀吀愀最 吀爀攀攀 一愀洀攀✀Ⰰ 
					ISNULL(ttn.descr, '')    AS 'Tag Tree Description',਀ऀऀऀऀऀ琀琀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
					           FROM tagging.tag_tree_names AS ttn਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开琀爀攀攀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀琀瀀昀 
						         ON    ttn.tag_tree_id਀ऀऀऀऀऀऀऀऀ    㴀 琀琀瀀昀⸀琀愀最开琀爀攀攀开椀搀 
						 INNER JOIN people.function_list_names AS fln਀ऀऀऀऀऀऀ            伀一   琀琀瀀昀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
									   =  fln.function_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
						            ON  fln.function_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀 昀氀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开椀搀 
						 INNER JOIN people.duty_functions AS df਀ऀऀऀऀऀऀ            伀一   昀氀⸀昀甀渀挀琀椀漀渀开椀搀 
									   = df.function_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
						            ON  dfsl.function_id਀ऀऀऀऀऀऀऀऀऀ   㴀  搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
						 INNER JOIN user_restr.sid_list AS sl਀ऀऀऀऀऀऀऀऀऀ伀一 搀昀猀氀⸀猀椀搀开椀搀 
									   = sl.sid_id਀ऀऀऀऀऀऀऀ  圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
                     UNION ਀ 
					  ( SELECT ttn2.tag_tree_id          AS 'Tag Tree ID',਀ऀऀऀऀऀ           䤀匀一唀䰀䰀⠀琀琀渀㈀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
					           ttn2.name                 AS 'Tag Tree Name',਀ऀऀऀऀऀ           䤀匀一唀䰀䰀⠀琀琀渀㈀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
					           ttn2.list_position        AS 'List Position'਀ऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀㈀ 
						 INNER JOIN user_restr.tag_tree_permissions_plist AS ttpp਀ऀऀऀऀऀऀ         伀一   琀琀渀㈀⸀琀愀最开琀爀攀攀开椀搀 
								    = ttpp.tag_tree_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
						            ON   ttpp.people_list_id਀ऀऀऀऀऀऀऀऀऀ   㴀  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
						 INNER JOIN people.people_lists AS pl਀ऀऀऀऀऀऀ            伀一  瀀氀渀⸀瀀攀漀瀀氀攀开氀椀猀琀开椀搀 
									   = pl.people_list_id਀ऀऀऀऀऀऀ 䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									ON   pl.sid_id਀ऀऀऀऀऀऀऀऀऀ   㴀 猀氀⸀猀椀搀开椀搀 
							  WHERE sl.sid = @connectedusersid਀ऀऀऀऀऀऀऀ  ⤀ 
            END਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最猀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects all tags for a given document਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 琀愀最 搀愀琀愀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
-- All descendant tags from all tag trees are returned, along with the tag tree ID. ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tags_by_doc] ਀ 
	 @documentid nvarchar(50)         = NULL,਀     䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 渀瘀愀爀挀栀愀爀⠀㌀⤀     㴀 ✀伀一✀Ⰰ   ⴀⴀ 䄀 猀眀椀琀挀栀 眀栀椀挀栀 搀攀琀攀爀洀椀渀攀猀 眀栀攀琀栀攀爀 琀愀最 搀攀猀挀攀渀搀愀渀琀猀 愀爀攀 椀渀挀氀甀搀攀搀⸀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@docauthenticationstatus nchar(10)      = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tag_tree_id bigint,਀ऀऀ䀀渀漀搀攀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check that the doc id exists.  Fail if it doesn't.਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @documentid IS NULL਀ऀऀ 䈀䔀䜀䤀一 
			 SET @data_validation_status = 'Fail';਀ऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
			 IF @docauthenticationstatus = 'Fail'਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䐀漀挀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䐀漀挀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on DocIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
			END਀ऀऀⴀⴀ 䔀渀搀 搀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ 
			 WITH LinkedTags AS (਀ऀऀऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 琀搀氀⸀琀愀最开椀搀Ⰰ  
				                 ttn.tag_tree_id, ਀ऀऀऀऀऀऀऀऀ 琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
				            FROM tagging.tag_to_document_links AS tdl਀ऀऀऀऀ       䰀䔀䘀吀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 䄀匀 琀琀渀  
					          ON   tdl.tag_id ਀ऀऀऀऀऀऀऀ     㴀 琀琀渀⸀琀愀最开椀搀 
				           WHERE tdl.doc_id ਀ऀऀऀऀऀऀ         㴀  䀀搀漀挀甀洀攀渀琀椀搀 
			 )਀ऀऀऀ 匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 䀀搀漀挀甀洀攀渀琀椀搀          䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
							 dt.tag_id            AS 'Tag ID',਀ऀऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
							 dt.tag_name          AS 'Tag Name',਀ऀऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
							 COALESCE(ttn.tag_tree_id, lt.tag_tree_id) AS 'Tag Tree ID',਀ऀऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀琀琀渀愀⸀洀渀攀洀Ⰰ ✀✀⤀ 䄀匀 ✀吀愀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
							 ISNULL(ttna.name, '') AS 'Tag Tree Name',਀ऀऀऀऀऀऀऀ 䤀匀一唀䰀䰀⠀琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀吀漀匀琀爀椀渀最⠀⤀Ⰰ ✀✀⤀ 䄀匀 ✀吀愀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀ 
			            FROM LinkedTags AS lt਀ऀऀऀ       䰀䔀䘀吀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 䄀匀 琀琀渀 
				          ON ttn.tag_tree_id = lt.tag_tree_id਀ऀऀऀऀ         䄀一䐀 ⠀䀀琀愀最开搀攀猀挀攀渀搀愀渀琀猀 㴀 ✀伀一✀  
				         AND(ttn.tag_tree_hierarchyid.IsDescendantOf(lt.tag_tree_hierarchyid) = 1)਀ऀऀऀऀऀ      伀刀  琀琀渀⸀琀愀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀  
						     = lt.tag_tree_hierarchyid)਀ऀऀऀ      䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀  
				          ON COALESCE(ttn.tag_id, lt.tag_id) = dt.tag_id਀ऀऀऀऀ   䰀䔀䘀吀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀愀 
				          ON COALESCE (ttn.tag_tree_id, lt.tag_tree_id) = ttna.tag_tree_id਀ऀऀऀ 伀刀䐀䔀刀 䈀夀 ✀吀愀最 吀爀攀攀 䤀䐀✀Ⰰ ✀吀愀最 吀爀攀攀 䠀椀攀爀愀爀挀栀礀䤀搀✀㬀 
਀ 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最猀开戀礀开猀琀爀椀渀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 27-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects the details for a given tag ID. ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 琀愀最 搀愀琀愀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀愀最猀开戀礀开猀琀爀椀渀最崀  
਀ऀ 䀀氀椀欀攀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀ 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ     匀䔀䰀䔀䌀吀 搀琀⸀琀愀最开椀搀              䄀匀 ✀吀愀最 䤀䐀✀Ⰰ 
		        ISNULL(dt.mnem, '')    AS 'Tag Mnemonic',਀ऀऀऀऀ搀琀⸀琀愀最开渀愀洀攀            䄀匀 ✀吀愀最 一愀洀攀✀Ⰰ 
				ISNULL(dt.descr, '')   AS 'Tag Description'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
          WHERE dt.tag_name LIKE '%' + @likestring + '%' ESCAPE '\'਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 一愀洀攀✀ 䄀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tags_by_tag_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㘀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀愀最 搀攀琀愀椀氀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 琀愀最 最爀漀甀瀀 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tags_by_tag_group] ਀   
     @tag_groupid bigint                   = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	  --  Check the tag group ID.਀ऀ   
	  	  IF @tag_groupid = 0 ਀ऀऀऀ 匀䔀吀 䀀琀愀最开最爀漀甀瀀椀搀 㴀 一唀䰀䰀㬀 
 ਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 最爀漀甀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀  
		  IF @tag_groupid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 䄀 琀愀最 最爀漀甀瀀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最䜀爀漀甀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagGroupID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- Tag group has been supplied.  Check if it exists. ਀ऀऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开最爀漀甀瀀开椀搀 
								  FROM tagging.tag_group_identifier_names ਀ऀऀऀऀऀऀऀऀ 圀䠀䔀刀䔀    琀愀最开最爀漀甀瀀开椀搀  
								       = @tag_groupid)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 吀愀最 最爀漀甀瀀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀吀愀最䜀爀漀甀瀀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						  SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_groupid), '  ', @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagGroupNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
 ਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 䀀琀愀最开最爀漀甀瀀椀搀           䄀匀 ✀吀愀最 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
		        dt.tag_id              AS 'Tag ID',਀ऀऀ        䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
				dt.tag_name            AS 'Tag Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		   FROM tagging.doc_tags AS dt਀ऀ 䤀一一䔀刀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 䄀匀 琀琀琀最氀 
	         ON      dt.tag_id਀ऀऀऀ    㴀 琀琀琀最氀⸀琀愀最开椀搀 
	 INNER JOIN tagging.tag_group_identifier_names AS tgn਀ऀ         伀一  琀琀琀最氀⸀琀愀最开最爀漀甀瀀开椀搀 
			    =  tgn.tag_group_id਀ऀऀ  圀䠀䔀刀䔀 琀琀琀最氀⸀琀愀最开最爀漀甀瀀开椀搀 
		        =    @tag_groupid਀ऀ   伀刀䐀䔀刀 䈀夀 ✀吀愀最 一愀洀攀✀ 䄀匀䌀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tags_with_ed_perm]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 愀氀氀 琀愀最猀 眀栀椀挀栀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 
-- Output is a table of tag data, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tags_with_ed_perm] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀椀猀挀漀渀琀爀漀氀氀攀爀 渀瘀愀爀挀栀愀爀⠀㔀⤀            㴀 一唀䰀䰀Ⰰ 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ 
	  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀ऀ  ऀऀ 䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䌀漀渀琀爀漀氀氀攀爀✀Ⰰ 
			 @user_authentication_result = @iscontroller OUTPUT;਀ऀऀऀ  
	  BEGIN TRY ਀ 
	  IF @iscontroller = 'Pass' 	-- If the connected user is a controller then they have edit permission for all tags਀ऀ     䈀䔀䜀䤀一 
	     SELECT dt.tag_id              AS 'Tag ID',਀ऀऀ        䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
				dt.tag_name            AS 'Tag Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
           FROM tagging.doc_tags AS dt਀ 
		 END਀      䔀䰀匀䔀 
		SELECT DISTINCT dt.tag_id              AS 'Tag ID',਀ऀऀऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀洀渀攀洀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 䴀渀攀洀漀渀椀挀✀Ⰰ 
						dt.tag_name            AS 'Tag Name',਀ऀऀऀऀऀऀ䤀匀一唀䰀䰀⠀搀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀   䄀匀 ✀吀愀最 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
		FROM tagging.doc_tags AS dt਀ 
		-- Condition 1: Tags with no groups linked਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀 䄀匀 琀琀琀最氀 
			   ON dt.tag_id = tttgl.tag_id਀ 
		-- Condition 2: Tag groups linked but no users linked਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 琀愀最最椀渀最⸀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀 䄀匀 琀最椀渀 
			   ON tttgl.tag_group_id = tgin.tag_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开昀氀椀猀琀 䄀匀 琀最瀀昀 
			   ON tgin.tag_group_id = tgpf.tag_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀 䄀匀 昀氀渀 
			   ON tgpf.function_list_id = fln.function_list_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀昀甀渀挀琀椀漀渀开氀椀猀琀猀 䄀匀 昀氀 
			   ON fln.function_list_id = fl.function_list_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
			   ON fl.function_id = df.function_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀开猀椀搀开氀椀渀欀猀 䄀匀 搀昀猀氀 
			   ON df.function_id = dfsl.function_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀开昀氀椀猀琀 
			   ON dfsl.sid_id = sl_flist.sid_id਀ 
		-- Condition 3: User or group membership linked਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀琀愀最开最爀漀甀瀀开瀀攀爀洀椀猀猀椀漀渀猀开瀀氀椀猀琀 䄀匀 琀最瀀瀀 
			   ON tgin.tag_group_id = tgpp.tag_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 䄀匀 瀀氀渀 
			   ON tgpp.people_list_id = pln.people_list_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀瀀攀漀瀀氀攀开氀椀猀琀猀 䄀匀 瀀氀 
			   ON pln.people_list_id = pl.people_list_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀开瀀氀椀猀琀 
			   ON         pl.sid_id  ਀ऀऀऀ      㴀 猀氀开瀀氀椀猀琀⸀猀椀搀开椀搀 
਀ऀऀ圀䠀䔀刀䔀  
			-- If there are no groups linked (Condition 1)਀ऀऀऀ琀琀琀最氀⸀琀愀最开最爀漀甀瀀开椀搀 䤀匀 一唀䰀䰀 
    ਀ऀऀऀ伀刀  
਀ऀऀऀⴀⴀ 䤀昀 琀栀攀爀攀 愀爀攀 最爀漀甀瀀猀 氀椀渀欀攀搀 戀甀琀 渀漀 甀猀攀爀猀 氀椀渀欀攀搀 ⠀䌀漀渀搀椀琀椀漀渀 ㈀⤀ 
			(    sl_flist.sid_id IS NULL ਀ऀऀऀ 䄀一䐀 猀氀开瀀氀椀猀琀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
਀ऀऀऀ伀刀  
਀ऀऀऀⴀⴀ 䤀昀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀栀爀漀甀最栀 愀 最爀漀甀瀀 ⠀䌀漀渀搀椀琀椀漀渀 ㌀⤀ 
			(   sl_flist.sid = @connectedusersid			 ਀ऀऀऀ 伀刀 猀氀开瀀氀椀猀琀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
			 )਀ 
		ORDER BY 'Tag Name' ASC;਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_transaction_group]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ　㜀ⴀ㈀　㈀㌀ 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀 琀栀攀 渀漀琀攀 昀漀爀 愀 最椀瘀攀渀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 椀搀 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀崀  
਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 戀椀最椀渀琀          㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
	    @validationmessage nvarchar(200)    = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀    㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 眀愀猀 椀渀瘀愀氀椀搀 
		@nodatamessage nvarchar(200)        = '', -- Communicates that no data was supplied਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)  = 'Pass';਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀  
  IF @transactiongroup = 0਀     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀 㴀 一唀䰀䰀㬀 
  IF @transactiongroup IS NULL਀     䈀䔀䜀䤀一  ⴀⴀ 一漀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 猀甀瀀瀀氀椀攀搀 
		SET @data_validation_status = 'Fail';਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
        EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀愀琀愀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ऀ       匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
        ELSE ਀ऀ         匀䔀吀 䀀渀漀搀愀琀愀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀愀琀愀⸀✀㬀 
	 END  ਀  䔀䰀匀䔀 
     BEGIN -- Check if the transaction group exists਀         䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀  
                          FROM base.transaction_groups ਀                         圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀⤀  
             BEGIN  -- The transaction group does not exist਀               䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
                    @message_id = 'TGNotExist', ਀ऀऀऀ        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	           IF (@tempmessage IS NOT NULL) ਀ऀ              匀䔀吀 䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	           ELSE ਀ऀऀऀऀ    匀䔀吀 䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀䜀一漀琀䔀砀椀猀琀⸀✀㬀 
               SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	         END ਀ऀ 䔀一䐀   ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀 爀攀昀攀爀攀渀挀攀 
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'FailedDataValidation', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
      IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀㬀 
	  ELSE ਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀㬀 
	END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
  	  BEGIN TRY਀ऀ    匀䔀䰀䔀䌀吀  
		       tg.transaction_group_id  AS 'Transaction Group ID',਀ऀ           琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀   䄀匀 ✀吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀 一漀琀攀✀ 
	      FROM base.transaction_groups AS tg਀ऀऀ 圀䠀䔀刀䔀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀最爀漀甀瀀㬀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	            SET @transactionmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
			      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
          @message_id   = 'SelectError', ਀          䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	       CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ    䔀䰀匀䔀 
		    SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
	END  -- End executing the query਀ऀ 
     ਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
    IF (@validationmessage <> '')          SET @message = @message + ' | ' + @validationmessage;਀    䤀䘀 ⠀䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀ 䀀琀最开椀渀瘀愀氀椀搀洀攀猀猀愀最攀㬀 
	IF (@nodatamessage <> '')              SET @message = @message + ' | ' +@nodatamessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_transaction_grp_cont]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㄀ⴀ㄀㈀ⴀ㈀　㈀㔀 
-- Description:	Initial creation਀ⴀⴀ 䰀椀猀琀 琀爀愀渀猀愀挀琀椀漀渀 最爀漀甀瀀猀 挀漀渀琀愀椀渀最 愀 最椀瘀攀渀 猀琀爀椀渀最⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开挀漀渀琀崀  
਀ऀ 䀀氀椀欀攀猀琀爀椀渀最 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀         㴀 ✀✀Ⰰ 
	 @message nvarchar(1000)           = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀   㴀 ✀✀㬀 ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 眀栀愀琀 眀愀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
		-- Escape the string so users don't get wildcard results਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀尀✀Ⰰ ✀尀尀✀⤀㬀 
		 SET @likestring = REPLACE(@likestring, '%', '\%');਀ऀऀ 匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀开✀Ⰰ ✀尀开✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '[', '\[');਀         匀䔀吀 䀀氀椀欀攀猀琀爀椀渀最 㴀 刀䔀倀䰀䄀䌀䔀⠀䀀氀椀欀攀猀琀爀椀渀最Ⰰ ✀崀✀Ⰰ ✀尀崀✀⤀㬀 
         SET @likestring = REPLACE(@likestring, '^', '\^');਀ 
਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 焀甀攀爀礀 
਀    䈀䔀䜀䤀一 
  	  BEGIN TRY਀ऀ    匀䔀䰀䔀䌀吀  
			   tg.transaction_group_id   AS 'Transaction Group ID',਀ऀ           琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀 䄀匀 ✀吀爀愀渀猀愀挀琀椀漀渀 䜀爀漀甀瀀 一漀琀攀✀ 
	      FROM base.transaction_groups AS tg਀ऀऀ 圀䠀䔀刀䔀 ⠀琀最⸀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开渀漀琀攀 䰀䤀䬀䔀 ✀─✀ ⬀ 䀀氀椀欀攀猀琀爀椀渀最 ⬀ ✀─✀ 䔀匀䌀䄀倀䔀 ✀尀✀⤀㬀 
	    EXEC internal.usp_SEL_message ਀             䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
             @message_text = @tempmessage OUTPUT;਀  ऀ         䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	            SET @transactionmessage = @tempmessage;਀ऀ         䔀䰀匀䔀  
			      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
        SET @transaction_status = 'Bad';਀        䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
          @message_id   = 'SelectError', ਀          䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ऀ       匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
	       CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀ    䔀䰀匀䔀 
		    SET @transactionmessage = 'A database level message error occurred on SelectError';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀  
	END -- End executing the query਀ऀ 
     ਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_tree_node]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㈀㜀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 搀攀琀愀椀氀猀 昀漀爀 愀 最椀瘀攀渀 琀愀最 琀爀攀攀 渀漀搀攀 
-- Output is a table of tag data, plus a status message and a transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_tree_node] ਀ 
     @tag_tree_node_id bigint         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀愀最开琀爀攀攀开椀搀 戀椀最椀渀琀Ⰰ 
		@node_hierarchyid hierarchyid,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 IF @tag_tree_node_id = 0਀    匀䔀吀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 一唀䰀䰀㬀 
 IF @tag_tree_node_id IS NULL਀ ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoNode');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
  ELSE -- A node ID has been supplied.  Check if it exists. ਀    䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT tag_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   tag_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TreeNodeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ऀ䔀一䐀 
	IF @data_validation_status = 'Pass'਀ऀ 䈀䔀䜀䤀一 
	       SELECT @node_hierarchyid = tag_tree_hierarchyid਀ऀऀ     䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 
			WHERE    tag_tree_node_id ਀ऀऀऀ      㴀 䀀琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		       ਀ऀऀ   匀䔀吀 䀀琀愀最开琀爀攀攀开椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开琀爀攀攀开椀搀 
								FROM tagging.tag_tree_nodes਀ऀऀऀऀऀऀऀ   圀䠀䔀刀䔀 琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
									 = @tag_tree_node_id);਀ऀ 䔀一䐀 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀琀⸀琀愀最开椀搀              䄀匀 ✀吀愀最 䤀䐀✀Ⰰ 
		        ISNULL(dt.mnem, '')    AS 'Tag Mnemonic',਀ऀऀऀऀ搀琀⸀琀愀最开渀愀洀攀            䄀匀 ✀吀愀最 一愀洀攀✀Ⰰ 
				ISNULL(dt.descr, '')   AS 'Tag Description',਀ऀऀऀऀ琀琀渀⸀琀愀最开琀爀攀攀开渀漀搀攀开椀搀   䄀匀 ✀吀愀最 吀爀攀攀 一漀搀攀 䤀䐀✀Ⰰ 
				ttn.tag_tree_hierarchyid.ToString() AS 'Tag Tree HierarchyId'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀漀搀攀猀 䄀匀 琀琀渀 
	 INNER JOIN tagging.doc_tags AS dt਀ऀ         伀一  琀琀渀⸀琀愀最开椀搀 
			    = dt.tag_id		਀ऀऀ  圀䠀䔀刀䔀    琀愀最开琀爀攀攀开渀漀搀攀开椀搀 
		        = @tag_tree_node_id;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀爀攀攀猀开戀礀开琀愀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 28-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects details of tag relationship trees which contain the given tag਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开琀爀攀攀猀开戀礀开琀愀最崀  
਀     䀀琀愀最开椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
	  -- Check if a tag was supplied਀ऀ  䤀䘀 䀀琀愀最开椀搀 㴀 　  
	    SET @tag_id = NULL;਀ऀ  䤀䘀 䀀琀愀最开椀搀 䤀匀 一唀䰀䰀 
	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoTagID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀吀愀最䤀䐀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @tag_id)਀ऀऀऀ 䈀䔀䜀䤀一 
					EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  						SET @message = CONCAT(@message, ' | ID: ', CONVERT(nvarchar(10), @tag_id), '  ', @tempmessage);਀ऀऀऀऀऀ䔀䰀匀䔀  
						SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀一䐀 
 ਀ 
-- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     SELECT ਀ऀऀ        䀀琀愀最开椀搀                  䄀匀 ✀吀愀最 䤀䐀✀Ⰰ 
		        ttn.tag_tree_id          AS 'Tag Tree ID',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀琀渀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀吀愀最 吀爀攀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
	            ttn.name                 AS 'Tag Tree Name',਀ऀऀऀऀ䤀匀一唀䰀䰀⠀琀琀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀    䄀匀 ✀吀愀最 吀爀攀攀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				ttn.list_position        AS 'List Position',਀ऀऀऀऀ琀琀渀漀⸀琀愀最开琀爀攀攀开渀漀搀攀开椀搀    䄀匀 ✀吀愀最 吀爀攀攀 一漀搀攀 䤀䐀✀Ⰰ 
				ttno.tag_tree_hierarchyid.ToString() AS 'Tag Tree HierarchyId'਀ऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 䄀匀 搀琀 
	 INNER JOIN tagging.tag_tree_nodes AS ttno਀ऀ         伀一     搀琀⸀琀愀最开椀搀 
			    = ttno.tag_id਀ऀ 䤀一一䔀刀 䨀伀䤀一ऀ琀愀最最椀渀最⸀琀愀最开琀爀攀攀开渀愀洀攀猀 䄀匀 琀琀渀 
	         ON  ttno.tag_tree_id਀ऀऀऀ    㴀 琀琀渀⸀琀愀最开琀爀攀攀开椀搀 
	      WHERE   ttno.tag_id਀ऀऀ        㴀 䀀琀愀最开椀搀 
	   ORDER BY 'List Position';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开甀渀爀猀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-12-2023਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Selects document groups which are unrestricted਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 琀愀戀氀攀 漀昀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀Ⰰ 瀀氀甀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开甀渀爀猀琀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @transactionmessage nvarchar(300)    = '',     -- Communicates what was the outcome of the transaction਀ऀऀ䀀渀漀瀀攀爀洀椀猀猀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ     ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 琀栀攀 爀攀焀甀椀爀攀搀 瀀攀爀洀椀猀猀椀漀渀 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀㬀 
਀ऀऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀  
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀       䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 䤀䐀✀Ⰰ 
				ISNULL(dgn.mnem, '')   AS 'Mnemonic',਀ऀ            搀最渀⸀愀琀琀爀开渀愀洀攀          䄀匀 ✀䐀漀挀 䜀爀漀甀瀀 一愀洀攀✀Ⰰ 
				ISNULL(dgn.descr, '')  AS 'Description'਀ऀऀ   䘀刀伀䴀 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
	LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀ       伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		      = dgvp.doc_group_id਀ऀ    圀䠀䔀刀䔀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀  
	   ORDER BY 'Doc Group ID';਀ 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @transactionmessage = @tempmessage;਀ऀ     䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on Success.';਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 ⬀ ✀ 簀 ✀ ⬀  
		    CONVERT(nvarchar(10),ERROR_NUMBER()) + ' | ' + ERROR_MESSAGE();਀ऀऀ 䔀䰀匀䔀  
		      SET @transactionmessage = 'A database level message error occurred on SelectError.';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ⴀⴀ 䌀漀渀挀愀琀攀渀愀琀攀 琀栀攀 洀攀猀猀愀最攀猀 
/*਀一伀吀䔀㨀 ∀吀栀攀 ⬀ ⠀匀琀爀椀渀最 䌀漀渀挀愀琀攀渀愀琀椀漀渀⤀ 漀瀀攀爀愀琀漀爀 戀攀栀愀瘀攀猀 搀椀昀昀攀爀攀渀琀氀礀 眀栀攀渀 椀琀 眀漀爀欀猀 眀椀琀栀 愀渀 攀洀瀀琀礀Ⰰ  
zero-length string than when it works with NULL, or unknown values. A zero-length ਀挀栀愀爀愀挀琀攀爀 猀琀爀椀渀最 挀愀渀 戀攀 猀瀀攀挀椀昀椀攀搀 愀猀 琀眀漀 猀椀渀最氀攀 焀甀漀琀愀琀椀漀渀 洀愀爀欀猀 眀椀琀栀漀甀琀 愀渀礀 挀栀愀爀愀挀琀攀爀猀  
inside the quotation marks. A zero-length binary string can be specified as 0x without ਀愀渀礀 戀礀琀攀 瘀愀氀甀攀猀 猀瀀攀挀椀昀椀攀搀 椀渀 琀栀攀 栀攀砀愀搀攀挀椀洀愀氀 挀漀渀猀琀愀渀琀⸀ 䌀漀渀挀愀琀攀渀愀琀椀渀最 愀 稀攀爀漀ⴀ氀攀渀最琀栀 猀琀爀椀渀最  
always concatenates the two specified strings. When you work with strings with a null value, ਀琀栀攀 爀攀猀甀氀琀 漀昀 琀栀攀 挀漀渀挀愀琀攀渀愀琀椀漀渀 搀攀瀀攀渀搀猀 漀渀 琀栀攀 猀攀猀猀椀漀渀 猀攀琀琀椀渀最猀⸀ 䨀甀猀琀 氀椀欀攀 愀爀椀琀栀洀攀琀椀挀  
operations that are performed on null values, when a null value is added to a known ਀瘀愀氀甀攀 琀栀攀 爀攀猀甀氀琀 椀猀 琀礀瀀椀挀愀氀氀礀 愀渀 甀渀欀渀漀眀渀 瘀愀氀甀攀Ⰰ 愀 猀琀爀椀渀最 挀漀渀挀愀琀攀渀愀琀椀漀渀 漀瀀攀爀愀琀椀漀渀 琀栀愀琀  
is performed with a null value should also produce a null result." ਀⨀⼀ 
    IF (@message = '' OR @message IS NULL) SET @message = ' ';਀    䤀䘀 ⠀䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀 㰀㸀 ✀✀⤀         匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䀀琀爀愀渀猀愀挀琀椀漀渀洀攀猀猀愀最攀㬀 
	IF (@nopermissionmessage <> '')        SET @message = @message + ' | ' + @nopermissionmessage;਀ 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_user_roles]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㌀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 匀攀氀攀挀琀猀 琀栀攀 爀漀氀攀猀 昀漀爀 琀栀攀 挀甀爀爀攀渀琀氀礀 氀漀最最攀搀 椀渀 甀猀攀爀⸀ 
-- Output is a status message and a transaction status and a list of roles for the user.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_user_roles] ਀ 
	 @message nvarchar(1000)          = NULL OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀㬀   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
਀ 
  -- Parameters which have not been explicitly set might be output as null to calling functions਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀ 
਀ⴀⴀ 吀栀椀猀 瀀爀漀挀攀搀甀爀攀 挀愀渀 戀攀 攀砀攀挀甀琀攀搀 戀礀 愀渀礀 甀猀攀爀 爀漀氀攀 氀攀瘀攀氀 
਀  
-- Execute the select query਀ 
	  BEGIN TRY਀ऀ     匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 甀爀氀欀⸀爀漀氀攀开渀愀洀攀  䄀匀 ✀刀漀氀攀 一愀洀攀✀  
				    FROM user_restr.user_role_link AS urlk਀ऀऀऀ  䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
					  ON    sl.sid_id ਀ऀऀऀऀऀ ऀ㴀 甀爀氀欀⸀猀椀搀开椀搀 
				    WHERE sl.sid = @connectedusersid ਀ऀऀऀ    唀一䤀伀一 䄀䰀䰀   ⴀⴀ 䄀氀猀漀 爀攀琀甀爀渀 椀昀 琀栀攀 甀猀攀爀 椀猀 氀椀猀琀攀搀 愀猀 愀渀 䄀甀琀栀漀爀椀猀攀爀⸀ 
			       SELECT 'Authorizer'਀ऀऀऀ 圀䠀䔀刀䔀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 愀甀琀栀漀爀椀猀攀爀开猀椀搀开椀搀 䄀匀 愀猀椀   
                     FROM user_restr.authorisers AS a਀ऀ           䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		               ON a.authoriser_sid_id਀ऀऀऀऀऀ      㴀 猀氀⸀猀椀搀开椀搀 
			        WHERE sl.sid = @connectedusersid);਀ऀऀऀ 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀऀ 匀䔀䰀䔀䌀吀 ⴀⴀ 䴀愀椀渀琀愀椀渀 挀漀渀猀椀猀琀攀渀挀礀 漀昀 爀攀琀甀爀渀 猀琀爀甀挀琀甀爀攀 
		      NULL AS 'Role Name';਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_users_by_doc]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㜀ⴀ　㌀ⴀ㈀　㈀㘀 
-- Description:	Reads all of the users linked to a given document. ਀ 
-- Input is the document id   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀 愀渀搀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开甀猀攀爀猀开戀礀开搀漀挀崀  
     @documentid nvarchar(50)          = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ 
	-- Validation checks਀ 
 -- Document id validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Doc id was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀऀ䔀一䐀 
		-- End document id validation਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀                 䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
				   sl.sid_id                   AS 'User ID',਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀猀氀⸀渀愀洀攀Ⰰ ✀✀⤀         䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
				   ISNULL(sl.descr, '')        AS 'User Description',਀ऀऀ           䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀     䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
				   gfn.name                    AS 'General Field Name',਀ऀऀऀऀ   最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀   䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀 䤀䐀✀ 
			  FROM people.doc_to_user_links AS dtul਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
		        ON  dtul.sid_id਀ऀऀऀऀ   㴀  猀氀⸀猀椀搀开椀搀 
		 LEFT JOIN people.general_field_names AS gfn਀ऀऀ        伀一     最昀渀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
				   = dtul.general_field_name_id਀ऀऀऀ 圀䠀䔀刀䔀 搀琀甀氀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开甀猀攀爀猀开戀礀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 07-03-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀愀搀猀 愀氀氀 漀昀 琀栀攀 甀猀攀爀猀 氀椀渀欀攀搀 琀漀 愀 最椀瘀攀渀 昀椀氀攀⸀  
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 昀椀氀攀 椀搀    
-- Output is a message and status and the people lists.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_users_by_file] ਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                    㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@fileauthenticationstatus nchar(10)     = '', -- Communicates if the user is not authorised to access the file਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ ऀ 
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀  䤀䘀 䀀昀椀氀攀椀搀 㴀 　 
     SET @fileid = NULL;਀   ⴀⴀ 䌀栀攀挀欀 椀昀 愀 昀椀氀攀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䘀愀椀氀 椀昀 椀琀 栀愀猀渀✀琀⸀ 
  IF @fileid IS NULL਀     䈀䔀䜀䤀一 
	   SET @data_validation_status = 'Fail';਀ऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
       EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ  
		    @message_text = @tempmessage OUTPUT;਀  ऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ   䔀䰀匀䔀   
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀ 䔀一䐀 
  ELSE -- A file id has been supplied਀     䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
			EXEC [internal].[usp_AUTHENTICATE_user_file_id] ਀ ऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀昀椀氀攀椀搀Ⰰ 
				@user_authentication_result = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
					BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'FileIDNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
					END਀ऀ 䔀一䐀 
਀ 
	  -- Output the failed data validation message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF @tempmessage IS NOT NULL ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀ऀ  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
  -- Execute the select query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			SELECT @fileid                     AS 'File ID',਀ऀऀऀऀ   猀氀⸀猀椀搀开椀搀                   䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
				   ISNULL(sl.name, '')         AS 'Database Username',਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀猀氀⸀搀攀猀挀爀Ⰰ ✀✀⤀        䄀匀 ✀唀猀攀爀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		           ISNULL(sl.username, '')     AS 'System Username',਀ऀऀऀऀ   最昀渀⸀渀愀洀攀                    䄀匀 ✀䜀攀渀攀爀愀氀 䘀椀攀氀搀 一愀洀攀✀Ⰰ 
				   gfn.general_field_name_id   AS 'General Field Name ID'਀ऀऀऀ  䘀刀伀䴀 瀀攀漀瀀氀攀⸀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀 䄀匀 昀琀甀氀 
		 LEFT JOIN user_restr.sid_list AS sl਀ऀऀ        伀一  昀琀甀氀⸀猀椀搀开椀搀 
				   =  sl.sid_id਀ऀऀ 䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀 䄀匀 最昀渀 
		        ON     gfn.general_field_name_id਀ऀऀऀऀ   㴀 昀琀甀氀⸀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀开椀搀 
			 WHERE ftul.file_id = @fileid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_funct_by_step_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects workflow duty functions for a given instance step ID਀ⴀⴀ 伀渀氀礀 椀渀挀氀甀搀攀 爀攀挀漀爀搀猀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_funct_by_step_id]਀ 
	  @instance_step_id  bigint        = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 椀搀 
	  IF @instance_step_id = 0਀ऀ     匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
      IF @instance_step_id IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
      ELSE -- A workflow instance id has been supplied਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT workflow_instance_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
			  WHERE workflow_instance_step_id = @instance_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀ䔀一䐀 
	 ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ䈀䔀䜀䤀一 
		EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
			@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀ 䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀ ऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
			END਀ऀ    䔀一䐀 
਀ 
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀               䄀匀 搀漀挀椀搀Ⰰ 
		       searchtable.workflow_instance_id AS instanceid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀    䄀匀 洀漀搀攀氀椀搀Ⰰ 
			   searchtable.present_step_id      AS present_stepid਀ऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
    INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm਀        伀一 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 㴀 瀀攀爀洀⸀搀漀挀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
					   )਀ 
਀ऀ  匀䔀䰀䔀䌀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀             䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 df.function_id                AS 'Function ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀洀渀攀洀Ⰰ ✀✀⤀           䄀匀 ✀䘀甀渀挀琀椀漀渀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 df.name                       AS 'Function Name',਀ऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀    䄀匀 ✀䘀甀渀挀琀椀漀渀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 df.list_position              AS 'List Position'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 眀猀搀昀 
   LEFT JOIN people.duty_functions AS df਀          伀一 眀猀搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		     = df.function_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
          ON   wsdf.workflow_instance_step_id਀ऀऀ     㴀  眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
   INNER JOIN docidsCTE AS dc਀          伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		     =  dc.instanceid਀       圀䠀䔀刀䔀 眀猀搀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	         =            @instance_step_id਀    伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
  END -- END IF @data_validation_status = 'Pass'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开昀甀渀挀琀开昀椀氀攀猀开戀礀开猀琀攀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 昀椀氀攀猀 搀愀琀愀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 猀琀攀瀀 䤀䐀⸀ 
-- Only include records linked to a document that the user has viewing rights to਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开昀甀渀挀琀开昀椀氀攀猀开戀礀开猀琀攀瀀崀 
਀ऀ  䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
	  @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)    = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀             㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀  
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
	  IF @instance_step_id = 0਀ऀ     匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
      IF @instance_step_id IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
      ELSE -- A workflow instance step id has been supplied਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT workflow_instance_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
			  WHERE workflow_instance_step_id = @instance_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀ䔀一䐀 
	 ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ䈀䔀䜀䤀一 
		EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
			@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀ 䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀ ऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
			END਀ऀ    䔀一䐀 
-- End data validation਀ 
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀               䄀匀 搀漀挀椀搀Ⰰ 
		       searchtable.workflow_instance_id AS instanceid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀    䄀匀 洀漀搀攀氀椀搀Ⰰ 
			   searchtable.present_step_id      AS present_stepid਀ऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
    INNER JOIN internal.ufn_SEL_docs_permission_filtr_ITVF(@connectedusersid) AS perm਀        伀一 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 㴀 瀀攀爀洀⸀搀漀挀开椀搀  ⴀⴀ 䄀瀀瀀氀礀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
					   )਀ 
਀ऀ  匀䔀䰀䔀䌀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀             䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀Ⰰ 
	         wfof.file_id                  AS 'File ID',਀ऀऀऀ 昀洀⸀昀椀氀攀渀愀洀攀                   䄀匀 ✀䘀椀氀攀渀愀洀攀✀Ⰰ 
			 df.function_id                AS 'Duty Function ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀洀渀攀洀Ⰰ ✀✀⤀           䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 df.name                       AS 'Duty Function Name',਀ऀऀऀ 䤀匀一唀䰀䰀⠀搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀    䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 df.list_position              AS 'Duty Function List Position'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 䄀匀 眀昀漀昀 
   LEFT JOIN base.file_metadata AS fm਀          伀一 眀昀漀昀⸀昀椀氀攀开椀搀 
             = fm.file_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 眀猀搀昀 
          ON   wfof.workflow_instance_step_id਀ऀऀ     㴀 眀猀搀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		 AND   wfof.function_id਀ऀऀ     㴀 眀猀搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
   LEFT JOIN workflow_instances.workflow_instance_steps AS wis਀          伀一   眀昀漀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		     =  wis.workflow_instance_step_id਀   䤀一一䔀刀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀挀 
          ON   wis.workflow_instance_id਀ऀऀ     㴀  搀挀⸀椀渀猀琀愀渀挀攀椀搀 
   LEFT JOIN people.duty_functions AS df਀          伀一 眀猀搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		     = df.function_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀漀搀 
          ON   wsdf.output_id਀ऀऀ     㴀  眀漀搀⸀漀甀琀瀀甀琀开椀搀 
	   WHERE wsdf.workflow_instance_step_id਀ऀ         㴀            䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
਀    伀刀䐀䔀刀 䈀夀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
  END -- END IF @data_validation_status = 'Pass'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开昀甀渀挀琀开漀甀琀瀀甀琀开昀椀氀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 琀栀攀 爀攀挀漀爀搀猀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
-- Only include records linked to a document that the user has viewing rights to਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开昀甀渀挀琀开漀甀琀瀀甀琀开昀椀氀攀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀    䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
        ON searchtable.doc_id = perm.doc_id  -- Apply permission filtering਀ऀऀऀऀऀ   ⤀ 
਀ 
	  SELECT ਀ऀ         眀昀漀昀⸀昀椀氀攀开椀搀                  䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			 fm.filename                   AS 'Filename',਀ऀऀऀ 搀昀⸀昀甀渀挀琀椀漀渀开椀搀                䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ 
			 ISNULL(df.mnem, '')           AS 'Duty Function Mnemonic',਀ऀऀऀ 搀昀⸀渀愀洀攀                       䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 一愀洀攀✀Ⰰ 
			 ISNULL(df.description, '')    AS 'Duty Function Description',਀ऀऀऀ 搀昀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀              䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
	         dc.instanceid                 AS 'Workflow Instance ID',਀ऀ         眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀         䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 䤀䐀✀Ⰰ 
	         wmn.attr_name                 AS 'Workflow Model Name',਀ऀ         䤀匀一唀䰀䰀⠀眀洀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䴀漀搀攀氀 䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(wmn.descr, '')         AS 'Model Description',਀ऀऀऀ 眀洀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀             䄀匀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
			 wis.workflow_instance_step_id AS 'Workflow Instance Step ID',਀ऀऀऀ 搀挀⸀瀀爀攀猀攀渀琀开猀琀攀瀀椀搀             䄀匀 ✀倀爀攀猀攀渀琀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 wis.step_status_id            AS 'Step Status ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀猀搀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀匀琀愀琀甀猀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 ssd.attr_name                 AS 'Status Name',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀猀搀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀匀琀愀琀甀猀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 ssd.list_position             AS 'Status List Position',਀ऀऀऀ 眀猀搀昀⸀漀甀琀瀀甀琀开椀搀                䄀匀 ✀圀漀爀欀昀氀漀眀 伀甀琀瀀甀琀 䤀䐀✀Ⰰ 
			 ISNULL(wod.mnem, '')          AS 'Output Definition Mnemonic',਀ऀऀऀ 眀漀搀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 一愀洀攀✀Ⰰ 
			 ISNULL(wod.descr, '')         AS 'Output Definition Description'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 䄀匀 眀昀漀昀 
   LEFT JOIN base.file_metadata AS fm਀          伀一 眀昀漀昀⸀昀椀氀攀开椀搀 
             = fm.file_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 眀猀搀昀 
          ON   wfof.workflow_instance_step_id਀ऀऀ     㴀 眀猀搀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		 AND   wfof.function_id਀ऀऀ     㴀 眀猀搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
   LEFT JOIN workflow_instances.workflow_instance_steps AS wis਀          伀一   眀昀漀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		     =  wis.workflow_instance_step_id਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀挀 
          ON   wis.workflow_instance_id਀ऀऀ     㴀  搀挀⸀椀渀猀琀愀渀挀攀椀搀 
   LEFT JOIN workflow_models.workflow_model_names AS wmn਀ऀ      伀一             搀挀⸀洀漀搀攀氀椀搀 
		     = wmn.workflow_model_id਀   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
          ON wsdf.function_id਀ऀऀ     㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
   LEFT JOIN workflow_instances.step_status_definitions AS ssd਀          伀一   眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
		     = ssd.step_status_id ਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀漀搀 
          ON   wsdf.output_id਀ऀऀ     㴀  眀漀搀⸀漀甀琀瀀甀琀开椀搀 
਀    伀刀䐀䔀刀 䈀夀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开椀渀瀀甀琀开昀椀氀攀猀开戀礀开猀琀攀瀀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 眀漀爀欀昀氀漀眀 椀渀瀀甀琀 昀椀氀攀猀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 昀漀爀 愀 最椀瘀攀渀 猀琀攀瀀 
-- Only include records linked to a document that the user has viewing rights to਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开椀渀瀀甀琀开昀椀氀攀猀开戀礀开猀琀攀瀀崀 
਀ऀ  䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
	  @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
	  IF @instance_step_id = 0਀ऀ     匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
      IF @instance_step_id IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
      ELSE -- A workflow instance step id has been supplied਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT workflow_instance_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
			  WHERE workflow_instance_step_id = @instance_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀ䔀一䐀 
	 ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ䈀䔀䜀䤀一 
		EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
			@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀ 䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀ ऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
			END਀ऀ    䔀一䐀 
਀ 
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀    䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
        ON searchtable.doc_id = perm.doc_id  -- Apply docs permission filtering਀ऀऀऀऀऀ   ⤀ 
਀ 
	  SELECT @instance_step_id             AS 'Workflow Instance Step ID',਀ऀ         眀猀椀昀⸀昀椀氀攀开椀搀                  䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			 fm.filename                   AS 'Filename'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 䄀匀 眀猀椀昀 
   LEFT JOIN base.file_metadata AS fm਀          伀一 眀猀椀昀⸀昀椀氀攀开椀搀 
             = fm.file_id਀  䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开昀椀氀攀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 昀椀氀攀猀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀椀渀最 
          ON fm.file_id = perm.file_id  ਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
          ON   wsif.workflow_input_step_id਀ऀऀ     㴀  眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
  INNER JOIN docidsCTE AS dc਀          伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		     =  dc.instanceid਀       圀䠀䔀刀䔀 眀猀椀昀⸀眀漀爀欀昀氀漀眀开椀渀瀀甀琀开猀琀攀瀀开椀搀 
	         =         @instance_step_id਀    伀刀䐀䔀刀 䈀夀 ✀䘀椀氀攀渀愀洀攀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
  END -- END IF @data_validation_status = 'Pass'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开椀渀瀀甀琀开猀琀攀瀀开昀椀氀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 眀漀爀欀昀氀漀眀 椀渀瀀甀琀 昀椀氀攀猀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 
-- Only include records linked to a document that the user has viewing rights to਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开椀渀瀀甀琀开猀琀攀瀀开昀椀氀攀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready';਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀    䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
        ON searchtable.doc_id = perm.doc_id  -- Apply permission filtering਀ऀऀऀऀऀ   ⤀ 
਀ 
	  SELECT ਀ऀ         眀猀椀昀⸀昀椀氀攀开椀搀                  䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			 fm.filename                   AS 'Filename',਀ऀ         搀挀⸀椀渀猀琀愀渀挀攀椀搀                 䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 䤀䐀✀Ⰰ 
	         wmn.workflow_model_id         AS 'Workflow Model ID',਀ऀ         眀洀渀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 一愀洀攀✀Ⰰ 
	         ISNULL(wmn.mnem, '')          AS 'Model Mnemonic',਀             䤀匀一唀䰀䰀⠀眀洀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀䴀漀搀攀氀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 wmn.list_position             AS 'Model List Position',਀ऀऀऀ 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 dc.present_stepid             AS 'Present Step ID',਀ऀऀऀ 眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀            䄀匀 ✀匀琀攀瀀 匀琀愀琀甀猀 䤀䐀✀Ⰰ 
			 ISNULL(ssd.mnem, '')          AS 'Status Mnemonic',਀ऀऀऀ 猀猀搀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀匀琀愀琀甀猀 一愀洀攀✀Ⰰ 
			 ISNULL(ssd.descr, '')         AS 'Status Description'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀 䄀匀 眀猀椀昀 
   LEFT JOIN base.file_metadata AS fm਀          伀一 眀猀椀昀⸀昀椀氀攀开椀搀 
             = fm.file_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
          ON   wsif.workflow_input_step_id਀ऀऀ     㴀  眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
  INNER JOIN docidsCTE AS dc਀          伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		     =  dc.instanceid਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
	      ON             dc.modelid਀ऀऀ     㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
   LEFT JOIN workflow_instances.step_status_definitions AS ssd਀          伀一   眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
		     = ssd.step_status_id ਀    伀刀䐀䔀刀 䈀夀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开椀渀猀琀开搀攀昀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 搀攀昀椀渀椀琀椀漀渀 爀攀挀漀爀搀猀 昀漀爀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 䤀䐀 
-- Only include records for a document that the user has viewing rights to਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开椀渀猀琀开搀攀昀开戀礀开搀漀挀崀 
਀ऀ  䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀         㴀 一唀䰀䰀Ⰰ  
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
	  @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
	    @docauthenticationstatus nchar(10)   = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                           ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
 -- Document id validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				  @message_id = 'NoDocID', @message_text = @tempmessage OUTPUT;਀ऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀   
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoDocID.');਀ऀऀ 䔀一䐀 
	  ELSE -- Doc id was supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀऀ䔀一䐀 
		-- End document id validation਀ 
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ 
	-- End data validation਀ 
  IF @transaction_ready = 'Ready'਀   䈀䔀䜀䤀一 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀Ⰰ 
			   searchtable.create_date          AS createdate,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀渀漀琀攀猀                䄀匀 椀渀猀琀愀渀挀攀开渀漀琀攀猀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀ऀ 䰀䔀䘀吀 䨀伀䤀一 ⠀ 
		  SELECT DISTINCT -- Select all docs that have no group + all that have a group with no user + all that have a group that the user is linked to਀ऀऀ                  ⴀⴀ 渀愀洀攀氀礀 漀渀氀礀 琀栀攀 爀攀挀漀爀搀猀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀ 
				  dil.doc_id            AS ID ਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
		LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀ   伀一   搀椀氀⸀搀漀挀开椀搀  
				  = dgl.doc_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
			   ON   dgl.doc_group_id ਀ऀऀऀऀ  㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀ   伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				  = dgvp.doc_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			   ON   dgvp.sid_id਀ऀऀऀऀ  㴀   猀氀⸀猀椀搀开椀搀 
			WHERE (dgl.doc_group_id IS NULL)਀ऀऀऀऀ  伀刀 
				  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀ䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
				  OR਀ऀऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
					AND dgvp.sid_id IS NOT NULL਀ऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
						 ) ਀ऀऀऀ⤀ 䄀匀 䄀氀氀䐀漀挀䤀搀猀  
		   ON    searchtable.doc_id਀ऀऀऀ  㴀 䄀氀氀䐀漀挀䤀搀猀⸀䤀䐀 
					   )਀ 
਀ऀ  匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀                 䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
	         dc.instanceid               AS 'Workflow Instance ID',਀ऀ         眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀       䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 䤀䐀✀Ⰰ 
	         wmn.attr_name               AS 'Workflow Model Name',਀ऀ         䤀匀一唀䰀䰀⠀眀洀渀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(wmn.descr, '')       AS 'Description',਀ऀऀऀ 搀挀⸀瀀爀攀猀攀渀琀开猀琀攀瀀椀搀           䄀匀 ✀倀爀攀猀攀渀琀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 CONVERT(NVARCHAR(30), dc.createdate, 120) AS 'Create Date',਀ऀऀऀ 搀挀⸀椀渀猀琀愀渀挀攀开渀漀琀攀猀           䄀猀 ✀一漀琀攀猀✀ 
	    FROM docidsCTE AS dc਀  䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
	      ON             dc.modelid਀ऀऀ     㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
	   WHERE dc.docid਀ऀ         㴀 䀀搀漀挀甀洀攀渀琀椀搀 
    ORDER BY 'Create Date' DESC, 'Workflow Model ID';਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
  	  IF @numrows = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀  䔀一䐀 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_inst_def_by_model]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects all workflow instance definition records for a given model਀ⴀⴀ 伀渀氀礀 椀渀挀氀甀搀攀 爀攀挀漀爀搀猀 眀栀椀挀栀 椀渀挀氀甀搀攀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 昀漀爀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_inst_def_by_model]਀ 
	  @workflow_model_id bigint        = NULL, ਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted'; ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @workflow_model_id = 0਀ऀऀ 匀䔀吀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 一唀䰀䰀㬀 
	  -- Check record id exists਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWorkflModelID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀漀爀欀昀氀䴀漀搀攀氀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
							  FROM workflow_models.workflow_model_names਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WorkflModelInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀漀爀欀昀氀䴀漀搀攀氀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀   
		  -- Output the failed data validation message਀ऀऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				   @message_id   = 'FailedDataValidation', ਀ऀऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			  IF @tempmessage IS NOT NULL ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			  ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
			END਀ 
	-- End data validation਀ 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
   BEGIN਀ऀ䈀䔀䜀䤀一 吀刀夀 
਀ 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀               䄀匀 搀漀挀椀搀Ⰰ 
		       searchtable.workflow_instance_id AS instanceid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀    䄀匀 洀漀搀攀氀椀搀Ⰰ 
			   searchtable.present_step_id      AS present_stepid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀挀爀攀愀琀攀开搀愀琀攀          䄀匀 挀爀攀愀琀攀搀愀琀攀Ⰰ 
			   searchtable.notes                AS instance_notes਀ऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	 LEFT JOIN (਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 ⴀⴀ 匀攀氀攀挀琀 愀氀氀 搀漀挀猀 琀栀愀琀 栀愀瘀攀 渀漀 最爀漀甀瀀 ⬀ 愀氀氀 琀栀愀琀 栀愀瘀攀 愀 最爀漀甀瀀 眀椀琀栀 渀漀 甀猀攀爀 ⬀ 愀氀氀 琀栀愀琀 栀愀瘀攀 愀 最爀漀甀瀀 琀栀愀琀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀 
		                  -- namely only the records with a document that the user has viewing rights to.਀ऀऀऀऀ  搀椀氀⸀搀漀挀开椀搀            䄀匀 䤀䐀  
			 FROM base.document_id_list AS dil਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
			   ON   dil.doc_id ਀ऀऀऀऀ  㴀 搀最氀⸀搀漀挀开椀搀 
		LEFT JOIN xref.doc_group_names AS dgn਀ऀऀऀ   伀一   搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀  
				  = dgn.doc_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
			   ON    dgn.doc_group_id਀ऀऀऀऀ  㴀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
		LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀ   伀一   搀最瘀瀀⸀猀椀搀开椀搀 
				  =   sl.sid_id਀ऀऀऀ圀䠀䔀刀䔀 ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一唀䰀䰀⤀ 
				  OR਀ऀऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
					AND dgvp.sid_id IS NULL)਀ऀऀऀऀ  伀刀 
				  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀ䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
					AND sl.sid = @connectedusersid਀ऀऀऀऀऀऀ ⤀  
			) AS AllDocIds ਀ऀऀ   伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  = AllDocIds.ID਀ऀऀऀऀऀ   ⤀ 
਀ 
	  SELECT @workflow_model_id          AS 'Workflow Model ID',਀ऀ         搀挀⸀椀渀猀琀愀渀挀攀椀搀               䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 䤀䐀✀Ⰰ 
	         dc.docid                    AS 'Document ID',਀ऀऀऀ 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀       䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 䤀䐀✀Ⰰ 
	         wmn.attr_name               AS 'Workflow Model Name',਀ऀ         䤀匀一唀䰀䰀⠀眀洀渀⸀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(wmn.descr, '')       AS 'Description',਀ऀऀऀ 搀挀⸀瀀爀攀猀攀渀琀开猀琀攀瀀椀搀           䄀匀 ✀倀爀攀猀攀渀琀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 CONVERT(NVARCHAR(30), dc.createdate, 120)  AS 'Create Date',਀ऀऀऀ 搀挀⸀椀渀猀琀愀渀挀攀开渀漀琀攀猀           䄀猀 ✀一漀琀攀猀✀ 
	    FROM docidsCTE AS dc਀  䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
	      ON             dc.modelid਀ऀऀ     㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
	   WHERE          dc.modelid਀ऀ         㴀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
    ORDER BY 'Create Date' DESC, 'Document ID';਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
  	  IF @numrows = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀  䔀一䐀 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_inst_steps_by_inst]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects de-normalised data for all the instance steps for a given instance. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 椀渀猀琀愀渀挀攀 椀搀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_inst_steps_by_inst]਀ 
	  @instanceid bigint               = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀开猀琀攀瀀猀 戀椀最椀渀琀                㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀漀琀愀氀 渀甀洀戀攀爀 漀昀 渀漀搀攀猀 
	  @num_records bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ 
		@object_auth_result nvarchar(10)    = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)   = 'Pass';਀ 
DECLARE @TreeData TABLE਀  ⠀ 
         step_sequence int,਀         爀攀挀漀爀搀椀搀 戀椀最椀渀琀Ⰰ 
         stepid bigint,਀         昀椀攀氀搀琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
         fieldid bigint,਀         昀椀攀氀搀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
         fieldname nvarchar(50),਀ऀऀ 愀琀琀爀椀搀 戀椀最椀渀琀Ⰰ 
		 attrmnem nvarchar(10),਀ऀऀ 愀琀琀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
         long_textval nvarchar(max),਀ऀऀ 猀琀攀瀀漀爀搀攀爀 椀渀琀Ⰰ 
		 edgeid bigint,਀ऀऀ 琀漀开渀漀搀攀椀搀 戀椀最椀渀琀Ⰰ 
		 ruleval int,਀ऀऀ 搀愀琀攀瘀愀氀 搀愀琀攀琀椀洀攀 
  )਀    
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀开猀琀攀瀀猀 㴀 　㬀 
  SET @num_records = 0;਀ 
  -- Data Validation਀ 
 	  IF @instanceid = 0਀ऀऀ 匀䔀吀 䀀椀渀猀琀愀渀挀攀椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an instance id was supplied.਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWFInstanceID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀䘀䤀渀猀琀愀渀挀攀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀 爀攀挀漀爀搀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the record id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
							  FROM workflow_instances.workflow_instance_definitions਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀椀搀⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WFInstanceIDInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀䤀渀猀琀愀渀挀攀䤀䐀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀愀渀挀攀崀 
			  @wf_instance_to_check = @instanceid,਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开愀甀琀栀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
		   IF @object_auth_result = 'Fail'਀ऀऀऀ 䈀䔀䜀䤀一 
		 		   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFInstanceNotAuth.');਀ऀऀऀ 䔀一䐀 
		 END਀ऀऀ 䔀一䐀 
਀ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀  
-- =============================================਀ 
   IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
	 BEGIN TRY਀ 
            WITH AllStepsCTE AS (਀                 匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
                   FROM workflow_instances.workflow_instance_steps਀                  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀椀搀 
                           )਀ 
਀            䤀一匀䔀刀吀 䤀一吀伀 䀀吀爀攀攀䐀愀琀愀 ⠀猀琀攀瀀开猀攀焀甀攀渀挀攀Ⰰ 爀攀挀漀爀搀椀搀Ⰰ 猀琀攀瀀椀搀Ⰰ 昀椀攀氀搀琀礀瀀攀Ⰰ 昀椀攀氀搀椀搀Ⰰ 昀椀攀氀搀洀渀攀洀Ⰰ 昀椀攀氀搀渀愀洀攀Ⰰ 愀琀琀爀椀搀Ⰰ 
			                       attrmnem, attrname, long_textval, steporder, edgeid, to_nodeid, ruleval, dateval)਀             匀䔀䰀䔀䌀吀 
                 DENSE_RANK() OVER (ORDER BY s.workflow_instance_step_id)  AS Sequence,਀                 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 ⠀匀䔀䰀䔀䌀吀 一唀䰀䰀⤀⤀Ⰰ  
                 s.workflow_instance_step_id ,               ਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ ✀✀⤀Ⰰ                   
                 sd.field_id,਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
                 ISNULL(sd.field_name, ''),਀ऀऀऀऀ 猀搀⸀愀琀琀爀开椀搀Ⰰ 
				 ISNULL(sd.attr_mnemonic, ''),਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀搀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
                 ISNULL(sd.long_text_val, ''),਀ऀऀऀऀ 猀搀⸀猀琀攀瀀开漀爀搀攀爀Ⰰ 
				 sd.edge_id,਀ऀऀऀऀ 猀搀⸀琀漀开渀漀搀攀开椀搀Ⰰ 
				 sd.rule_val,਀ऀऀऀऀ 猀搀⸀搀愀琀攀开瘀愀氀 
             FROM AllStepsCTE AS s਀             䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开眀昀开椀渀猀琀开猀琀攀瀀开搀愀琀愀开䤀吀嘀䘀崀⠀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 䄀匀 猀搀 
             ORDER BY Sequence;਀ 
             SELECT਀ऀऀऀ     䀀椀渀猀琀愀渀挀攀椀搀          䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 䤀䐀✀Ⰰ 
                 step_sequence        AS 'Sequence',਀                 爀攀挀漀爀搀椀搀             䄀匀 ✀刀攀挀漀爀搀 䤀䐀✀Ⰰ 
                 stepid               AS 'Workflow Instance Step ID',਀                 昀椀攀氀搀琀礀瀀攀            䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ 
                 fieldid              AS 'Field ID',਀                 昀椀攀氀搀洀渀攀洀            䄀匀 ✀䘀椀攀氀搀 䴀渀攀洀漀渀椀挀✀Ⰰ 
                 fieldname            AS 'Field Name',਀ऀऀऀऀ 愀琀琀爀椀搀               䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				 attrmnem             AS 'Attribute Mnemonic',਀ऀऀऀऀ 愀琀琀爀渀愀洀攀             䄀匀 ✀䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 long_textval         AS 'Long Text Value',਀ऀऀऀऀ 猀琀攀瀀漀爀搀攀爀            䄀匀 ✀匀琀攀瀀 伀爀搀攀爀✀Ⰰ 
				 edgeid               AS 'Step Transition ID',਀ऀऀऀऀ 琀漀开渀漀搀攀椀搀            䄀匀 ✀吀漀 匀琀攀瀀 䤀䐀✀Ⰰ 
				 ruleval		      AS 'Rule Value',਀ऀऀऀऀ 搀愀琀攀瘀愀氀              䄀匀 ✀䐀愀琀攀 嘀愀氀甀攀✀  
             FROM @TreeData਀             伀刀䐀䔀刀 䈀夀 匀攀焀甀攀渀挀攀Ⰰ 嬀刀攀挀漀爀搀 䤀䐀崀㬀 
          SET @num_records = @@ROWCOUNT;਀          匀䔀吀 䀀渀甀洀开猀琀攀瀀猀 㴀 ⠀匀䔀䰀䔀䌀吀 䌀伀唀一吀⠀䐀䤀匀吀䤀一䌀吀 猀琀攀瀀椀搀⤀ 䘀刀伀䴀 䀀吀爀攀攀䐀愀琀愀⤀㬀 
਀  ऀ  䤀䘀 䀀渀甀洀开爀攀挀漀爀搀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
 END -- END IF @transaction_ready = 'Ready'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开瀀攀漀瀀氀攀开戀礀开猀琀攀瀀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 眀漀爀欀昀氀漀眀 瀀愀爀琀椀挀椀瀀愀渀琀猀 昀漀爀 愀 最椀瘀攀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 䤀䐀 
-- Only include records linked to a document that the user has viewing rights to਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开瀀攀漀瀀氀攀开戀礀开猀琀攀瀀开椀搀崀 
਀ऀ  䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
	  @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
	  -- Check the workflow instance step id਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
	     SET @instance_step_id = NULL;਀      䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀      䔀䰀匀䔀 ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			   FROM workflow_instances.workflow_instance_steps਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'WfInstStepIdInvalid',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
		END਀ऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀愀渀挀攀崀 
			  @wf_instance_to_check = @instance_step_id,਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开愀甀琀栀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
		   IF @object_auth_result = 'Fail'਀ऀऀऀ 䈀䔀䜀䤀一 
		 		   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFInstanceNotAuth.');਀ऀऀऀ 䔀一䐀 
		 END਀ 
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀ऀ 䰀䔀䘀吀 䨀伀䤀一 ⠀ 
		  SELECT DISTINCT -- Select all docs that have no group + all that have a group with no user + all that have a group that the user is linked to਀ऀऀ                  ⴀⴀ 渀愀洀攀氀礀 漀渀氀礀 琀栀攀 爀攀挀漀爀搀猀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀ 
				  dil.doc_id            AS ID ਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
		LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀ   伀一   搀椀氀⸀搀漀挀开椀搀  
				  = dgl.doc_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
			   ON   dgl.doc_group_id ਀ऀऀऀऀ  㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀ   伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				  = dgvp.doc_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			   ON   dgvp.sid_id਀ऀऀऀऀ  㴀   猀氀⸀猀椀搀开椀搀 
			WHERE (dgl.doc_group_id IS NULL)਀ऀऀऀऀ  伀刀 
				  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀ䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
				  OR਀ऀऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
					AND dgvp.sid_id IS NOT NULL਀ऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
					) ਀ऀऀऀ⤀ 䄀匀 䄀氀氀䐀漀挀䤀搀猀  
		   ON    searchtable.doc_id਀ऀऀऀ  㴀 䄀氀氀䐀漀挀䤀搀猀⸀䤀䐀 
					   )਀ 
	  SELECT @instance_step_id             AS 'Workflow Instance Step ID',਀ऀ         猀氀⸀渀愀洀攀                       䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
			 sl.email_address              AS 'Email Address',਀ऀऀऀ 猀氀⸀猀椀搀开椀搀                     䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
		     ISNULL(sl.username, '')       AS 'System Username',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀氀⸀搀攀猀挀爀Ⰰ ✀✀⤀          䄀匀 ✀唀猀攀爀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                 䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ 
	    FROM workflow_instances.workflow_step_participants AS wsp਀   䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
          ON  wsp.sid_id਀ऀऀ     㴀 猀氀⸀猀椀搀开椀搀 
   LEFT JOIN workflow_instances.workflow_instance_steps AS wis਀          伀一   眀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		     = wis.workflow_instance_step_id਀   䤀一一䔀刀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀挀 
          ON   wis.workflow_instance_id਀ऀऀ     㴀  搀挀⸀椀渀猀琀愀渀挀攀椀搀 
       WHERE wsp.workflow_instance_step_id਀ऀ         㴀           䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
    ORDER BY 'Database Username';਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
  	  IF @numrows = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_people_files_by_step]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects workflow participant output files for a given instance step਀ⴀⴀ 伀渀氀礀 椀渀挀氀甀搀攀 爀攀挀漀爀搀猀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_people_files_by_step]਀ 
	  @instance_step_id  bigint        = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
-- Data validation	  ਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
	  IF @instance_step_id = 0਀ऀ     匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
      IF @instance_step_id IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
      ELSE -- A workflow instance step id has been supplied਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT workflow_instance_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
			  WHERE workflow_instance_step_id = @instance_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀ䔀一䐀 
		ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC [internal].[usp_AUTHENTICATE_wf_instance]਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
			  @wf_instance_auth_result = @object_auth_result OUTPUT;਀ऀऀ   䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			 BEGIN਀ऀऀ ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WFInstanceNotAuth', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀⸀✀⤀㬀 
			 END਀ऀऀ 䔀一䐀 
਀ 
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀    䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
        ON searchtable.doc_id = perm.doc_id  -- Apply permission filtering਀ऀऀऀऀऀ   ⤀ 
਀ 
	  SELECT @instance_step_id             AS 'Workflow Instance Step ID',਀ऀ         眀瀀漀昀⸀昀椀氀攀开椀搀                  䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			 fm.filename                   AS 'Filename',਀ऀ         猀氀⸀渀愀洀攀                       䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
			 sl.email_address              AS 'Email Address',਀ऀऀऀ 猀氀⸀猀椀搀开椀搀                     䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
		     ISNULL(sl.username, '')       AS 'System Username',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                 AS 'Windows Account Current'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 䄀匀 眀瀀漀昀ऀ 
   LEFT JOIN workflow_instances.workflow_step_participants AS wsp਀          伀一    眀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		     = wpof.workflow_instance_step_id	਀ऀऀ 䄀一䐀  眀瀀漀昀⸀猀椀搀开椀搀 
		     = wsp.sid_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
          ON   wsp.workflow_instance_step_id਀ऀऀ     㴀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
  INNER JOIN docidsCTE AS dc਀          伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		     =  dc.instanceid਀   䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 愀猀 昀洀 
          ON wpof.file_id਀ऀऀ     㴀 昀洀⸀昀椀氀攀开椀搀 
   LEFT JOIN user_restr.sid_list AS sl਀ऀ      伀一    眀猀瀀⸀猀椀搀开椀搀 
			 =   sl.sid_id਀       圀䠀䔀刀䔀 眀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	         =           @instance_step_id਀    伀刀䐀䔀刀 䈀夀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
  END -- END IF @data_validation_status = 'Pass'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开瀀攀漀瀀氀攀开漀甀琀瀀甀琀开昀椀氀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 眀漀爀欀昀氀漀眀 瀀愀爀琀椀挀椀瀀愀渀琀 漀甀琀瀀甀琀 昀椀氀攀猀 
-- Only include records linked to a document that the user has viewing rights to਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开瀀攀漀瀀氀攀开漀甀琀瀀甀琀开昀椀氀攀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀    䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀 
        ON searchtable.doc_id = perm.doc_id  -- Apply permission filtering਀ऀऀऀऀऀ   ⤀ 
਀ 
	  SELECT ਀ऀ         眀瀀漀昀⸀昀椀氀攀开椀搀                  䄀匀 ✀䘀椀氀攀 䤀䐀✀Ⰰ 
			 fm.filename                   AS 'Filename',਀ऀ         猀氀⸀渀愀洀攀                       䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
			 sl.sid_id                     AS 'User ID',਀ऀऀ     䤀匀一唀䰀䰀⠀猀氀⸀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀       䄀匀 ✀匀礀猀琀攀洀 唀猀攀爀渀愀洀攀✀Ⰰ 
	         dc.instanceid                 AS 'Workflow Instance ID',਀ऀ         眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀         䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 䤀䐀✀Ⰰ 
	         wmn.attr_name                 AS 'Workflow Model Name',਀ऀ         䤀匀一唀䰀䰀⠀眀洀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䴀漀搀攀氀 䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(wmn.descr, '')         AS 'Model Description',਀ऀऀऀ 眀洀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀             䄀匀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
			 wis.workflow_instance_step_id AS 'Workflow Instance Step ID',਀ऀऀऀ 搀挀⸀瀀爀攀猀攀渀琀开猀琀攀瀀椀搀             䄀匀 ✀倀爀攀猀攀渀琀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 wis.step_status_id            AS 'Step Status ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀猀搀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀匀琀愀琀甀猀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 ssd.attr_name                 AS 'Status Name',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀猀搀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀匀琀愀琀甀猀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 ssd.list_position             AS 'Status List Position',਀ऀऀऀ 眀猀瀀⸀漀甀琀瀀甀琀开椀搀                 䄀匀 ✀圀漀爀欀昀氀漀眀 伀甀琀瀀甀琀 䤀䐀✀Ⰰ 
			 ISNULL(wod.mnem, '')          AS 'Output Definition Mnemonic',਀ऀऀऀ 眀漀搀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 一愀洀攀✀Ⰰ 
			 ISNULL(wod.descr, '')         AS 'Output Definition Description',਀ऀऀऀऀ  䌀䄀匀䔀  
					 WHEN SUSER_SNAME(sl.sid) IS NOT NULL THEN 'Yes'਀ऀऀऀऀऀ 䔀䰀匀䔀 ✀一漀✀ 
				  END                 AS 'Windows Account Current'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 䄀匀 眀瀀漀昀ऀ 
   LEFT JOIN workflow_instances.workflow_step_participants AS wsp਀          伀一    眀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		     = wpof.workflow_instance_step_id	਀ऀऀ 䄀一䐀  眀瀀漀昀⸀猀椀搀开椀搀 
		     = wsp.sid_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
          ON   wsp.workflow_instance_step_id਀ऀऀ     㴀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
  INNER JOIN docidsCTE AS dc਀          伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		     =  dc.instanceid਀   䰀䔀䘀吀 䨀伀䤀一 戀愀猀攀⸀昀椀氀攀开洀攀琀愀搀愀琀愀 愀猀 昀洀 
          ON wpof.file_id਀ऀऀ     㴀 昀洀⸀昀椀氀攀开椀搀 
   LEFT JOIN workflow_models.workflow_model_names AS wmn਀ऀ      伀一             搀挀⸀洀漀搀攀氀椀搀 
		     = wmn.workflow_model_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀猀搀 
          ON   wis.step_status_id਀ऀऀ     㴀 猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀  
   LEFT JOIN workflow_instances.workflow_output_definitions AS wod਀          伀一   眀猀瀀⸀漀甀琀瀀甀琀开椀搀 
		     = wod.output_id਀   䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
          ON  wsp.sid_id਀ऀऀ     㴀 猀氀⸀猀椀搀开椀搀 
    ORDER BY 'Model List Position';਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
  	  IF @numrows = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_rules_by_model_step]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects the workflow rules records linked to a given workflow step definitions਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开爀甀氀攀猀开戀礀开洀漀搀攀氀开猀琀攀瀀崀 
਀ऀ  䀀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀搀 椀渀琀Ⰰ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)   = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
      -- Workflow step validation਀  ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀 攀砀椀猀琀猀   
	  IF @workflow_step_id = 0 ਀ऀऀ 匀䔀吀 䀀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
		IF @workflow_step_id IS NULL਀ऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 猀琀攀瀀 椀搀 栀愀猀 渀漀琀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀ 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀漀爀欀昀氀漀眀匀琀攀瀀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀   
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWorkflowStepID.');਀ऀऀऀ䔀一䐀 
਀ऀ  䔀䰀匀䔀 ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
		 BEGIN ਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
							  FROM workflow_models.workflow_step_definitions ਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 㴀 䀀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀搀⤀  
				 BEGIN  -- The workflow step does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WorkflowStepInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END ਀ऀऀ 䔀一䐀   
਀ 
਀ 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀   
   BEGIN਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT @workflow_step_id       AS 'Workflow Model Step ID',਀ऀऀऀ 眀爀⸀爀甀氀攀开椀搀              䄀匀 ✀圀漀爀欀昀氀漀眀 刀甀氀攀 䤀䐀✀Ⰰ 
	         wr.attr_name            AS 'Workflow Rule Name',਀ऀ         䤀匀一唀䰀䰀⠀眀爀⸀洀渀攀洀Ⰰ ✀✀⤀     䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(wr.descr, '')    AS 'Description',਀ऀऀऀ 眀爀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀        䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
       FROM workflow_models.workflow_step_definitions AS wsd਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
         ON   wsd.$node_id਀ऀऀ    㴀 眀猀琀⸀␀昀爀漀洀开椀搀 
 INNER JOIN workflow_models.workflow_step_definitions AS wsd_to ਀         伀一      眀猀琀⸀␀琀漀开椀搀  
		    = wsd_to.$node_id਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开爀甀氀攀开氀椀渀欀猀 䄀匀 眀爀氀  
         ON   wst.step_transition_id ਀ऀऀ    㴀 眀爀氀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开椀搀 
  LEFT JOIN workflow_models.workflow_rules AS wr ਀         伀一  眀爀氀⸀爀甀氀攀开椀搀  
		    = wr.rule_id਀ऀ   圀䠀䔀刀䔀 眀猀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
	         =  @workflow_step_id਀    伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
  END -- END IF @transaction_ready = 'Ready'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 11-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 搀甀琀礀 昀甀渀挀琀椀漀渀猀 氀椀渀欀攀搀 琀漀 眀漀爀欀昀氀漀眀 猀琀攀瀀猀⸀ 
-- Only include records linked to a document that the user has viewing rights to਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀ 
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀ऀ 䰀䔀䘀吀 䨀伀䤀一 ⠀ 
		  SELECT DISTINCT -- Select all docs that have no group + all that have a group with no user + all that have a group that the user is linked to਀ऀऀ                  ⴀⴀ 渀愀洀攀氀礀 漀渀氀礀 琀栀攀 爀攀挀漀爀搀猀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀ 
				  dil.doc_id            AS ID ਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
		LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀ   伀一   搀椀氀⸀搀漀挀开椀搀  
				  = dgl.doc_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
			   ON   dgl.doc_group_id ਀ऀऀऀऀ  㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀ   伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				  = dgvp.doc_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			   ON   dgvp.sid_id਀ऀऀऀऀ  㴀   猀氀⸀猀椀搀开椀搀 
			WHERE (dgl.doc_group_id IS NULL)਀ऀऀऀऀ  伀刀 
				  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀ䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
				  OR਀ऀऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
					AND dgvp.sid_id IS NOT NULL਀ऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
						 ) ਀ऀऀऀ⤀ 䄀匀 䄀氀氀䐀漀挀䤀搀猀  
		   ON    searchtable.doc_id਀ऀऀऀ  㴀 䄀氀氀䐀漀挀䤀搀猀⸀䤀䐀 
					   )਀ 
਀ऀ  匀䔀䰀䔀䌀吀  
			 df.function_id                AS 'Duty Function ID',਀ऀऀऀ 搀昀⸀洀渀攀洀                       䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 df.name                       AS 'Duty Function Name',਀ऀऀऀ 搀昀⸀搀攀猀挀爀椀瀀琀椀漀渀                䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 df.list_position              AS 'Duty Function List Position',਀ऀ         搀挀⸀椀渀猀琀愀渀挀攀椀搀                 䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 䤀䐀✀Ⰰ 
	         wmn.workflow_model_id         AS 'Workflow Model ID',਀ऀ         眀洀渀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 一愀洀攀✀Ⰰ 
	         ISNULL(wmn.mnem, '')          AS 'Model Mnemonic',਀             䤀匀一唀䰀䰀⠀眀洀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀䴀漀搀攀氀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 wmn.list_position             AS 'Model List Position',਀ऀऀऀ 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 dc.present_stepid             AS 'Present Step ID',਀ऀऀऀ 眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀            䄀匀 ✀匀琀攀瀀 匀琀愀琀甀猀 䤀䐀✀Ⰰ 
			 ISNULL(ssd.mnem, '')          AS 'Status Mnemonic',਀ऀऀऀ 猀猀搀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀匀琀愀琀甀猀 一愀洀攀✀Ⰰ 
			 ISNULL(ssd.descr, '')         AS 'Status Description',਀ऀऀऀ 猀猀搀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀             䄀匀 ✀匀琀愀琀甀猀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
			 wsdf.output_id                AS 'Workflow Output ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀眀漀搀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 wod.attr_name                 AS 'Output Definition Name',਀ऀऀऀ 䤀匀一唀䰀䰀⠀眀漀搀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 䐀攀猀挀爀椀瀀琀椀漀渀✀ 
	    FROM workflow_instances.workflow_step_duty_functions AS wsdf਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
          ON   wsdf.workflow_instance_step_id਀ऀऀ     㴀  眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
  INNER JOIN docidsCTE AS dc਀          伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		     =  dc.instanceid਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
	      ON             dc.modelid਀ऀऀ     㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
   LEFT JOIN people.duty_functions AS df਀          伀一 眀猀搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
		     = df.function_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀猀搀 
          ON   wis.step_status_id਀ऀऀ     㴀 猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀  
   LEFT JOIN workflow_instances.workflow_output_definitions AS wod਀          伀一   眀猀搀昀⸀漀甀琀瀀甀琀开椀搀 
		     =  wod.output_id਀    伀刀䐀䔀刀 䈀夀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
  	  IF @numrows = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_step_get_ancestors]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects de-normalised data for all the ancestors of a given instance step. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_step_get_ancestors]਀ 
	  @instance_step_id bigint         = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀开渀漀搀攀猀 戀椀最椀渀琀                㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀漀琀愀氀 渀甀洀戀攀爀 漀昀 渀漀搀攀猀 
	  @num_records bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ 
		@object_auth_result nvarchar(10)    = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)   = 'Pass';਀ 
DECLARE @TreeData TABLE਀  ⠀ 
         step_sequence int,਀         爀攀挀漀爀搀椀搀 戀椀最椀渀琀Ⰰ 
         stepid bigint,਀         昀椀攀氀搀琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
         fieldid bigint,਀         昀椀攀氀搀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
         fieldname nvarchar(50),਀ऀऀ 愀琀琀爀椀搀 戀椀最椀渀琀Ⰰ 
		 attrmnem nvarchar(10),਀ऀऀ 愀琀琀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
         long_textval nvarchar(max),਀ऀऀ 猀琀攀瀀漀爀搀攀爀 椀渀琀Ⰰ 
		 edgeid bigint,਀ऀऀ 琀漀开渀漀搀攀椀搀 戀椀最椀渀琀Ⰰ 
		 ruleval int,਀ऀऀ 搀愀琀攀瘀愀氀 搀愀琀攀琀椀洀攀 
  )਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀开渀漀搀攀猀 㴀 　㬀 
  SET @num_records = 0;਀ 
  -- Data Validation਀ 
	  -- Check the workflow instance step id਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
	     SET @instance_step_id = NULL;਀      䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀      䔀䰀匀䔀 ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			   FROM workflow_instances.workflow_instance_steps਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'WfInstStepIdInvalid',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
		END਀ऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀愀渀挀攀崀 
			  @wf_instance_to_check = @instance_step_id,਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开愀甀琀栀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
		   IF @object_auth_result = 'Fail'਀ऀऀऀ 䈀䔀䜀䤀一 
		 		   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFInstanceNotAuth.');਀ऀऀऀ 䔀一䐀 
		 END਀ 
-- End data validation ਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀   䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ऀ 䈀䔀䜀䤀一 吀刀夀 
਀ऀऀऀ圀䤀吀䠀 刀攀挀甀爀猀椀瘀攀䄀渀挀攀猀琀漀爀猀䌀吀䔀 䄀匀 ⠀ 
				-- Start with the current step਀ऀऀऀऀ匀䔀䰀䔀䌀吀 瀀愀爀攀渀琀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 瀀愀爀攀渀琀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
				  FROM workflow_instances.workflow_instance_steps child਀ऀऀ    䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 眀渀开挀栀椀氀搀 
					ON      child.workflow_model_step_id ਀ऀऀऀऀऀ   㴀 眀渀开挀栀椀氀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
			INNER JOIN workflow_models.workflow_step_transitions AS wst਀ऀऀऀऀऀ伀一        眀猀琀⸀␀琀漀开椀搀  
					   = wn_child.$node_id਀ऀऀऀ䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀渀开瀀愀爀攀渀琀 
					ON         wst.$from_id ਀ऀऀऀऀऀ   㴀 眀渀开瀀愀爀攀渀琀⸀␀渀漀搀攀开椀搀 
			INNER JOIN workflow_instances.workflow_instance_steps AS parent਀ऀऀऀऀऀ伀一      瀀愀爀攀渀琀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
					   = wn_parent.workflow_model_step_id਀ऀऀऀऀ 圀䠀䔀刀䔀 挀栀椀氀搀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
				       =             @instance_step_id਀ 
				UNION ALL਀ 
				-- Recursively find all ancestors (upstream steps)਀ऀऀऀऀ匀䔀䰀䔀䌀吀 最爀愀渀搀瀀愀爀攀渀琀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 最爀愀渀搀瀀愀爀攀渀琀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
				  FROM RecursiveAncestorsCTE rec਀ऀऀ    䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀渀开爀攀挀 
					ON      rec.workflow_model_step_id ਀ऀऀऀऀऀ   㴀 眀渀开爀攀挀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
			INNER JOIN workflow_models.workflow_step_transitions AS wst਀ऀऀऀऀऀ伀一      眀猀琀⸀␀琀漀开椀搀  
					   = wn_rec.$node_id਀ऀऀऀ䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀渀开最爀愀渀搀瀀愀爀攀渀琀 
					ON              wst.$from_id ਀ऀऀऀऀऀ   㴀 眀渀开最爀愀渀搀瀀愀爀攀渀琀⸀␀渀漀搀攀开椀搀 
			INNER JOIN workflow_instances.workflow_instance_steps grandparent਀ऀऀऀऀऀ伀一      最爀愀渀搀瀀愀爀攀渀琀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
					   = wn_grandparent.workflow_model_step_id਀ऀऀऀ⤀ 
਀            䤀一匀䔀刀吀 䤀一吀伀 䀀吀爀攀攀䐀愀琀愀 ⠀猀琀攀瀀开猀攀焀甀攀渀挀攀Ⰰ 爀攀挀漀爀搀椀搀Ⰰ 猀琀攀瀀椀搀Ⰰ 昀椀攀氀搀琀礀瀀攀Ⰰ 昀椀攀氀搀椀搀Ⰰ 昀椀攀氀搀洀渀攀洀Ⰰ 昀椀攀氀搀渀愀洀攀Ⰰ 愀琀琀爀椀搀Ⰰ 
			                       attrmnem, attrname, long_textval, steporder, edgeid, to_nodeid, ruleval, dateval)਀             匀䔀䰀䔀䌀吀 
                 DENSE_RANK() OVER (ORDER BY s.workflow_instance_step_id)  AS Sequence,਀                 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 ⠀匀䔀䰀䔀䌀吀 一唀䰀䰀⤀⤀Ⰰ  
                 s.workflow_instance_step_id ,               ਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ ✀✀⤀Ⰰ                   
                 sd.field_id,਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
                 ISNULL(sd.field_name, ''),਀ऀऀऀऀ 猀搀⸀愀琀琀爀开椀搀Ⰰ 
				 ISNULL(sd.attr_mnemonic, ''),਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀搀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
                 ISNULL(sd.long_text_val, ''),਀ऀऀऀऀ 猀搀⸀猀琀攀瀀开漀爀搀攀爀Ⰰ 
				 sd.edge_id,਀ऀऀऀऀ 猀搀⸀琀漀开渀漀搀攀开椀搀Ⰰ 
				 sd.rule_val,਀ऀऀऀऀ 猀搀⸀搀愀琀攀开瘀愀氀 
             FROM RecursiveAncestorsCTE AS s਀             䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开眀昀开椀渀猀琀开猀琀攀瀀开搀愀琀愀开䤀吀嘀䘀崀⠀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 䄀匀 猀搀 
             ORDER BY Sequence;਀ 
             SELECT਀                         ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 攀挀栀漀 挀漀氀甀洀渀 昀漀爀 琀栀椀猀 猀攀氀攀挀琀 戀攀挀愀甀猀攀 椀琀 眀漀甀氀搀 氀漀最椀挀愀氀氀礀 挀氀愀猀栀 眀椀琀栀 琀栀攀 猀琀攀瀀椀搀 挀漀氀甀洀渀 
						 -- and confuse the application layer. The application has to remember the input parameter value. ਀                 猀琀攀瀀开猀攀焀甀攀渀挀攀        䄀匀 ✀匀攀焀甀攀渀挀攀✀Ⰰ 
                 recordid             AS 'Record ID',਀                 猀琀攀瀀椀搀               䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀Ⰰ ⴀⴀ 䄀渀挀攀猀琀漀爀 匀琀攀瀀 䤀䐀 
                 fieldtype            AS 'Field Type',਀                 昀椀攀氀搀椀搀              䄀匀 ✀䘀椀攀氀搀 䤀䐀✀Ⰰ 
                 fieldmnem            AS 'Field Mnemonic',਀                 昀椀攀氀搀渀愀洀攀            䄀匀 ✀䘀椀攀氀搀 一愀洀攀✀Ⰰ 
				 attrid               AS 'Attribute ID',਀ऀऀऀऀ 愀琀琀爀洀渀攀洀             䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 attrname             AS 'Attribute Name',਀ऀऀऀऀ 氀漀渀最开琀攀砀琀瘀愀氀         䄀匀 ✀䰀漀渀最 吀攀砀琀 嘀愀氀甀攀✀Ⰰ 
				 steporder            AS 'Step Order',਀ऀऀऀऀ 攀搀最攀椀搀               䄀匀 ✀匀琀攀瀀 吀爀愀渀猀椀琀椀漀渀 䤀䐀✀Ⰰ 
				 to_nodeid            AS 'To Step ID',਀ऀऀऀऀ 爀甀氀攀瘀愀氀ऀऀ      䄀匀 ✀刀甀氀攀 嘀愀氀甀攀✀Ⰰ 
				 dateval              AS 'Date Value' ਀             䘀刀伀䴀 䀀吀爀攀攀䐀愀琀愀 
             ORDER BY Sequence, [Record ID];਀          匀䔀吀 䀀渀甀洀开爀攀挀漀爀搀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
          SET @num_nodes = (SELECT COUNT(DISTINCT stepid) FROM @TreeData);਀ 
  	  IF @num_records = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_step_get_descendts]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects de-normalised data for all the descendant of a given instance step. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_step_get_descendts]਀ 
	  @instance_step_id bigint         = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀开渀漀搀攀猀 戀椀最椀渀琀                㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ ⴀⴀ 吀漀琀愀氀 渀甀洀戀攀爀 漀昀 渀漀搀攀猀 
	  @num_records bigint              = NULL OUTPUT਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀     㴀 ✀✀Ⰰ 
		@object_auth_result nvarchar(10)    = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀        㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)   = 'Pass';਀ 
DECLARE @TreeData TABLE਀  ⠀ 
         step_sequence int,਀         爀攀挀漀爀搀椀搀 戀椀最椀渀琀Ⰰ 
         stepid bigint,਀         昀椀攀氀搀琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
         fieldid bigint,਀         昀椀攀氀搀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
         fieldname nvarchar(50),਀ऀऀ 愀琀琀爀椀搀 戀椀最椀渀琀Ⰰ 
		 attrmnem nvarchar(10),਀ऀऀ 愀琀琀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
         long_textval nvarchar(max),਀ऀऀ 猀琀攀瀀漀爀搀攀爀 椀渀琀Ⰰ 
		 edgeid bigint,਀ऀऀ 琀漀开渀漀搀攀椀搀 戀椀最椀渀琀Ⰰ 
		 ruleval int,਀ऀऀ 搀愀琀攀瘀愀氀 搀愀琀攀琀椀洀攀 
  )਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀开渀漀搀攀猀 㴀 　㬀 
  SET @num_records = 0;਀ 
  -- Data Validation਀ 
	  -- Check the workflow instance step id਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
	     SET @instance_step_id = NULL;਀      䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀      䔀䰀匀䔀 ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			   FROM workflow_instances.workflow_instance_steps਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'WfInstStepIdInvalid',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
		END਀ऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀愀渀挀攀崀 
			  @wf_instance_to_check = @instance_step_id,਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开愀甀琀栀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
		   IF @object_auth_result = 'Fail'਀ऀऀऀ 䈀䔀䜀䤀一 
		 		   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFInstanceNotAuth.');਀ऀऀऀ 䔀一䐀 
		 END਀ 
-- End data validation ਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀   䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ऀ 䈀䔀䜀䤀一 吀刀夀 
਀ऀ圀䤀吀䠀 䐀攀猀挀攀渀搀愀渀琀匀琀攀瀀猀䌀吀䔀 䄀匀 ⠀ 
    -- Get the $node_id for the given @instance_step_id਀ऀऀ匀䔀䰀䔀䌀吀 挀栀椀氀搀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 挀栀椀氀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
		  FROM workflow_instances.workflow_instance_steps parent਀    䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 眀渀开瀀愀爀攀渀琀 
			ON parent.workflow_model_step_id = wn_parent.workflow_model_step_id਀    䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
			ON         wst.$from_id ਀ऀऀऀ   㴀 眀渀开瀀愀爀攀渀琀⸀␀渀漀搀攀开椀搀 
	INNER JOIN workflow_models.workflow_step_definitions wn_child਀ऀऀऀ伀一        眀猀琀⸀␀琀漀开椀搀  
			   = wn_child.$node_id਀ऀ䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 挀栀椀氀搀 
			ON      child.workflow_model_step_id ਀ऀऀऀ   㴀 眀渀开挀栀椀氀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
		 WHERE parent.workflow_instance_step_id ਀ऀऀ       㴀              䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
	)਀ 
            INSERT INTO @TreeData (step_sequence, recordid, stepid, fieldtype, fieldid, fieldmnem, fieldname, attrid,਀ऀऀऀ                       愀琀琀爀洀渀攀洀Ⰰ 愀琀琀爀渀愀洀攀Ⰰ 氀漀渀最开琀攀砀琀瘀愀氀Ⰰ 猀琀攀瀀漀爀搀攀爀Ⰰ 攀搀最攀椀搀Ⰰ 琀漀开渀漀搀攀椀搀Ⰰ 爀甀氀攀瘀愀氀Ⰰ 搀愀琀攀瘀愀氀⤀ 
             SELECT਀                 䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀  䄀匀 匀攀焀甀攀渀挀攀Ⰰ 
                 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), ਀                 猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 Ⰰ                
                 ISNULL(sd.field_type, ''),                  ਀                 猀搀⸀昀椀攀氀搀开椀搀Ⰰ 
                 ISNULL(sd.field_mnemonic, ''),਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
				 sd.attr_id,਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀搀⸀愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
				 ISNULL(sd.attr_name, ''),਀                 䤀匀一唀䰀䰀⠀猀搀⸀氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ ✀✀⤀Ⰰ 
				 sd.step_order,਀ऀऀऀऀ 猀搀⸀攀搀最攀开椀搀Ⰰ 
				 sd.to_node_id,਀ऀऀऀऀ 猀搀⸀爀甀氀攀开瘀愀氀Ⰰ 
				 sd.date_val਀             䘀刀伀䴀 䐀攀猀挀攀渀搀愀渀琀匀琀攀瀀猀䌀吀䔀 䄀匀 猀 
             CROSS APPLY [internal].[ufn_SEL_wf_inst_step_data_ITVF](s.workflow_instance_step_id) AS sd਀             伀刀䐀䔀刀 䈀夀 匀攀焀甀攀渀挀攀㬀 
਀             匀䔀䰀䔀䌀吀 
                         -- There is no echo column for this select because it would logically clash with the stepid column਀ऀऀऀऀऀऀ ⴀⴀ 愀渀搀 挀漀渀昀甀猀攀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 栀愀猀 琀漀 爀攀洀攀洀戀攀爀 琀栀攀 椀渀瀀甀琀 瀀愀爀愀洀攀琀攀爀 瘀愀氀甀攀⸀  
                 step_sequence        AS 'Sequence',਀                 爀攀挀漀爀搀椀搀             䄀匀 ✀刀攀挀漀爀搀 䤀䐀✀Ⰰ 
                 stepid               AS 'Workflow Instance Step ID',  -- Descendant workflow instance step ID਀                 昀椀攀氀搀琀礀瀀攀            䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ 
                 fieldid              AS 'Field ID',਀                 昀椀攀氀搀洀渀攀洀            䄀匀 ✀䘀椀攀氀搀 䴀渀攀洀漀渀椀挀✀Ⰰ 
                 fieldname            AS 'Field Name',਀ऀऀऀऀ 愀琀琀爀椀搀               䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				 attrmnem             AS 'Attribute Mnemonic',਀ऀऀऀऀ 愀琀琀爀渀愀洀攀             䄀匀 ✀䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 long_textval         AS 'Long Text Value',਀ऀऀऀऀ 猀琀攀瀀漀爀搀攀爀            䄀匀 ✀匀琀攀瀀 伀爀搀攀爀✀Ⰰ 
				 edgeid               AS 'Step Transition ID',਀ऀऀऀऀ 琀漀开渀漀搀攀椀搀            䄀匀 ✀吀漀 匀琀攀瀀 䤀䐀✀Ⰰ 
				 ruleval		      AS 'Rule Value',਀ऀऀऀऀ 搀愀琀攀瘀愀氀              䄀匀 ✀䐀愀琀攀 嘀愀氀甀攀✀  
             FROM @TreeData਀             伀刀䐀䔀刀 䈀夀 匀攀焀甀攀渀挀攀Ⰰ 嬀刀攀挀漀爀搀 䤀䐀崀㬀 
          SET @num_records = @@ROWCOUNT;਀          匀䔀吀 䀀渀甀洀开渀漀搀攀猀 㴀 ⠀匀䔀䰀䔀䌀吀 䌀伀唀一吀⠀䐀䤀匀吀䤀一䌀吀 猀琀攀瀀椀搀⤀ 䘀刀伀䴀 䀀吀爀攀攀䐀愀琀愀⤀㬀 
਀  ऀ  䤀䘀 䀀渀甀洀开爀攀挀漀爀搀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
 END -- END IF @transaction_ready = 'Ready'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开猀琀攀瀀开最攀琀开瀀愀爀攀渀琀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 搀攀ⴀ渀漀爀洀愀氀椀猀攀搀 搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 瀀愀爀攀渀琀猀 漀昀 愀 最椀瘀攀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀⸀  
-- Input is an instance step id. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开猀琀攀瀀开最攀琀开瀀愀爀攀渀琀猀崀 
਀ऀ  䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
	  @num_nodes bigint                = NULL OUTPUT, -- Total number of nodes਀ऀ  䀀渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)     = '',਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@transaction_ready nchar(10)        = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀吀爀攀攀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀         猀琀攀瀀开猀攀焀甀攀渀挀攀 椀渀琀Ⰰ 
         recordid bigint,਀         猀琀攀瀀椀搀 戀椀最椀渀琀Ⰰ 
         fieldtype nvarchar(50),਀         昀椀攀氀搀椀搀 戀椀最椀渀琀Ⰰ 
         fieldmnem nvarchar(10),਀         昀椀攀氀搀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		 attrid bigint,਀ऀऀ 愀琀琀爀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		 attrname nvarchar(50),਀         氀漀渀最开琀攀砀琀瘀愀氀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		 steporder int,਀ऀऀ 攀搀最攀椀搀 戀椀最椀渀琀Ⰰ 
		 to_nodeid bigint,਀ऀऀ 爀甀氀攀瘀愀氀 椀渀琀Ⰰ 
		 dateval datetime਀  ⤀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @num_nodes = 0;਀  匀䔀吀 䀀渀甀洀开爀攀挀漀爀搀猀 㴀 　㬀 
਀  ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
	  IF @instance_step_id = 0਀ऀ     匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
      IF @instance_step_id IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
      ELSE -- A workflow instance step id has been supplied਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT workflow_instance_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
			  WHERE workflow_instance_step_id = @instance_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀ䔀一䐀 
		ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC [internal].[usp_AUTHENTICATE_wf_instance]਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
			  @wf_instance_auth_result = @object_auth_result OUTPUT;਀ऀऀ   䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			 BEGIN਀ऀऀ ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WFInstanceNotAuth', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀⸀✀⤀㬀 
			 END਀ऀऀ 䔀一䐀 
਀ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀  
-- =============================================਀ 
   IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
	 BEGIN TRY਀ 
	WITH ParentStepsCTE AS (਀    ⴀⴀ 䜀攀琀 琀栀攀 ␀渀漀搀攀开椀搀 昀漀爀 琀栀攀 最椀瘀攀渀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			SELECT parent.workflow_instance_step_id, parent.workflow_model_step_id਀ऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 挀栀椀氀搀 
	    INNER JOIN workflow_models.workflow_step_definitions AS wn_child਀ऀऀऀऀ伀一      挀栀椀氀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
				   = wn_child.workflow_model_step_id਀ऀ    䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
				ON        wst.$to_id ਀ऀऀऀऀ   㴀 眀渀开挀栀椀氀搀⸀␀渀漀搀攀开椀搀 
		INNER JOIN workflow_models.workflow_step_definitions AS wn_parent਀ऀऀऀऀ伀一         眀猀琀⸀␀昀爀漀洀开椀搀  
				   = wn_parent.$node_id਀   ऀ    䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 瀀愀爀攀渀琀 
				ON      parent.workflow_model_step_id ਀ऀऀऀऀ   㴀 眀渀开瀀愀爀攀渀琀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
			 WHERE child.workflow_instance_step_id ਀ऀऀऀ       㴀             䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		)਀ 
            INSERT INTO @TreeData (step_sequence, recordid, stepid, fieldtype, fieldid, fieldmnem, fieldname, attrid,਀ऀऀऀ                       愀琀琀爀洀渀攀洀Ⰰ 愀琀琀爀渀愀洀攀Ⰰ 氀漀渀最开琀攀砀琀瘀愀氀Ⰰ 猀琀攀瀀漀爀搀攀爀Ⰰ 攀搀最攀椀搀Ⰰ 琀漀开渀漀搀攀椀搀Ⰰ 爀甀氀攀瘀愀氀Ⰰ 搀愀琀攀瘀愀氀⤀ 
             SELECT਀                 䐀䔀一匀䔀开刀䄀一䬀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀  䄀匀 匀攀焀甀攀渀挀攀Ⰰ 
                 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), ਀                 猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 Ⰰ                
                 ISNULL(sd.field_type, ''),                  ਀                 猀搀⸀昀椀攀氀搀开椀搀Ⰰ 
                 ISNULL(sd.field_mnemonic, ''),਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
				 sd.attr_id,਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀搀⸀愀琀琀爀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
				 ISNULL(sd.attr_name, ''),਀                 䤀匀一唀䰀䰀⠀猀搀⸀氀漀渀最开琀攀砀琀开瘀愀氀Ⰰ ✀✀⤀Ⰰ 
				 sd.step_order,਀ऀऀऀऀ 猀搀⸀攀搀最攀开椀搀Ⰰ 
				 sd.to_node_id,਀ऀऀऀऀ 猀搀⸀爀甀氀攀开瘀愀氀Ⰰ 
				 sd.date_val਀             䘀刀伀䴀 倀愀爀攀渀琀匀琀攀瀀猀䌀吀䔀 䄀匀 猀 
             CROSS APPLY [internal].[ufn_SEL_wf_inst_step_data_ITVF](s.workflow_instance_step_id) AS sd਀             伀刀䐀䔀刀 䈀夀 匀攀焀甀攀渀挀攀㬀 
਀             匀䔀䰀䔀䌀吀 
                         -- There is no echo column for this select because it would logically clash with the stepid column਀ऀऀऀऀऀऀ ⴀⴀ 愀渀搀 挀漀渀昀甀猀攀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀ 吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 栀愀猀 琀漀 爀攀洀攀洀戀攀爀 琀栀攀 椀渀瀀甀琀 瀀愀爀愀洀攀琀攀爀 瘀愀氀甀攀⸀  
                 step_sequence        AS 'Sequence',਀                 爀攀挀漀爀搀椀搀             䄀匀 ✀刀攀挀漀爀搀 䤀䐀✀Ⰰ 
                 stepid               AS 'Workflow Instance Step ID',  -- Parent workflow instance step ID਀                 昀椀攀氀搀琀礀瀀攀            䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ 
                 fieldid              AS 'Field ID',਀                 昀椀攀氀搀洀渀攀洀            䄀匀 ✀䘀椀攀氀搀 䴀渀攀洀漀渀椀挀✀Ⰰ 
                 fieldname            AS 'Field Name',਀ऀऀऀऀ 愀琀琀爀椀搀               䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				 attrmnem             AS 'Attribute Mnemonic',਀ऀऀऀऀ 愀琀琀爀渀愀洀攀             䄀匀 ✀䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 long_textval         AS 'Long Text Value',਀ऀऀऀऀ 猀琀攀瀀漀爀搀攀爀            䄀匀 ✀匀琀攀瀀 伀爀搀攀爀✀Ⰰ 
				 edgeid               AS 'Step Transition ID',਀ऀऀऀऀ 琀漀开渀漀搀攀椀搀            䄀匀 ✀吀漀 匀琀攀瀀 䤀䐀✀Ⰰ 
				 ruleval		      AS 'Rule Value',਀ऀऀऀऀ 搀愀琀攀瘀愀氀              䄀匀 ✀䐀愀琀攀 嘀愀氀甀攀✀  
             FROM @TreeData਀             伀刀䐀䔀刀 䈀夀 匀攀焀甀攀渀挀攀Ⰰ 嬀刀攀挀漀爀搀 䤀䐀崀㬀 
          SET @num_records = @@ROWCOUNT;਀          匀䔀吀 䀀渀甀洀开渀漀搀攀猀 㴀 ⠀匀䔀䰀䔀䌀吀 䌀伀唀一吀⠀䐀䤀匀吀䤀一䌀吀 猀琀攀瀀椀搀⤀ 䘀刀伀䴀 䀀吀爀攀攀䐀愀琀愀⤀㬀 
਀  ऀ  䤀䘀 䀀渀甀洀开爀攀挀漀爀搀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
 END -- END IF @transaction_ready = 'Ready'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开猀琀攀瀀开最攀琀开猀椀戀氀椀渀最猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 18-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 搀攀ⴀ渀漀爀洀愀氀椀猀攀搀 搀愀琀愀 昀漀爀 愀氀氀 琀栀攀 猀椀戀氀椀渀最猀 漀昀 愀 最椀瘀攀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀⸀  
-- Input is an instance step id. ਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开猀琀攀瀀开最攀琀开猀椀戀氀椀渀最猀崀 
਀ऀ  䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
	  @num_nodes bigint                = NULL OUTPUT, -- Total number of nodes਀ऀ  䀀渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)     = '',਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@transaction_ready nchar(10)        = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀吀爀攀攀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀         猀琀攀瀀开猀攀焀甀攀渀挀攀 椀渀琀Ⰰ 
         recordid bigint,਀         猀琀攀瀀椀搀 戀椀最椀渀琀Ⰰ 
         fieldtype nvarchar(50),਀         昀椀攀氀搀椀搀 戀椀最椀渀琀Ⰰ 
         fieldmnem nvarchar(10),਀         昀椀攀氀搀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		 attrid bigint,਀ऀऀ 愀琀琀爀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		 attrname nvarchar(50),਀         氀漀渀最开琀攀砀琀瘀愀氀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		 steporder int,਀ऀऀ 攀搀最攀椀搀 戀椀最椀渀琀Ⰰ 
		 to_nodeid bigint,਀ऀऀ 爀甀氀攀瘀愀氀 椀渀琀Ⰰ 
		 dateval datetime਀  ⤀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @num_nodes = 0;਀  匀䔀吀 䀀渀甀洀开爀攀挀漀爀搀猀 㴀 　㬀 
਀  ⴀⴀ 䐀愀琀愀 嘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 
	  IF @instance_step_id = 0਀ऀ     匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
      IF @instance_step_id IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀऀ 䔀一䐀 
      ELSE -- A workflow instance step id has been supplied਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
			(SELECT workflow_instance_step_id਀ऀऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
			  WHERE workflow_instance_step_id = @instance_step_id)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀渀✀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀ䔀一䐀 
		ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀ 䈀䔀䜀䤀一 
		   EXEC [internal].[usp_AUTHENTICATE_wf_instance]਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
			  @wf_instance_auth_result = @object_auth_result OUTPUT;਀ऀऀ   䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
			 BEGIN਀ऀऀ ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WFInstanceNotAuth', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀⸀✀⤀㬀 
			 END਀ऀऀ 䔀一䐀 
਀ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀  
-- =============================================਀ 
   IF @transaction_ready = 'Ready'਀    䈀䔀䜀䤀一 
	 BEGIN TRY਀ 
WITH ParentStepsCTE (parent_node_id) AS (਀    ⴀⴀ 䜀攀琀 琀栀攀 椀洀洀攀搀椀愀琀攀 瀀愀爀攀渀琀 ␀渀漀搀攀开椀搀⠀猀⤀ 漀昀 琀栀攀 最椀瘀攀渀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
				SELECT wn_parent.$node_id AS parent_node_id਀ऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 挀栀椀氀搀 
		    INNER JOIN workflow_models.workflow_step_definitions AS wn_child਀ऀऀऀऀऀ伀一      挀栀椀氀搀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀  
					   = wn_child.workflow_model_step_id਀ऀऀऀ䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
					ON        wst.$to_id ਀ऀऀऀऀऀ   㴀 眀渀开挀栀椀氀搀⸀␀渀漀搀攀开椀搀 
			INNER JOIN workflow_models.workflow_step_definitions AS wn_parent਀ऀऀऀऀऀ伀一         眀猀琀⸀␀昀爀漀洀开椀搀  
					   = wn_parent.$node_id਀ऀऀऀऀ 圀䠀䔀刀䔀 挀栀椀氀搀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
				       =             @instance_step_id਀ऀऀऀ⤀Ⰰ 
਀ऀऀऀ匀椀戀氀椀渀最匀琀攀瀀猀䌀吀䔀 䄀匀 ⠀ 
				-- Get all the siblings (steps sharing the same parent)਀ऀऀऀऀ匀䔀䰀䔀䌀吀 猀椀戀氀椀渀最⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 猀椀戀氀椀渀最⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
				  FROM ParentStepsCTE AS p਀ऀऀऀ䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
					ON                   wst.$from_id ਀ऀऀऀऀऀ   㴀 瀀⸀瀀愀爀攀渀琀开渀漀搀攀开椀搀 
		    INNER JOIN workflow_models.workflow_step_definitions AS wn_sibling਀ऀऀऀऀऀ伀一          眀猀琀⸀␀琀漀开椀搀  
					   = wn_sibling.$node_id਀ऀऀ    䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 猀椀戀氀椀渀最 
					ON      sibling.workflow_model_step_id ਀ऀऀऀऀऀ   㴀 眀渀开猀椀戀氀椀渀最⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀 
				-- Exclude the given step itself from the result਀ऀऀऀऀ 圀䠀䔀刀䔀 猀椀戀氀椀渀最⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
				       !=              @instance_step_id਀ऀऀऀ⤀ 
਀            䤀一匀䔀刀吀 䤀一吀伀 䀀吀爀攀攀䐀愀琀愀 ⠀猀琀攀瀀开猀攀焀甀攀渀挀攀Ⰰ 爀攀挀漀爀搀椀搀Ⰰ 猀琀攀瀀椀搀Ⰰ 昀椀攀氀搀琀礀瀀攀Ⰰ 昀椀攀氀搀椀搀Ⰰ 昀椀攀氀搀洀渀攀洀Ⰰ 昀椀攀氀搀渀愀洀攀Ⰰ 愀琀琀爀椀搀Ⰰ 
			                       attrmnem, attrname, long_textval, steporder, edgeid, to_nodeid, ruleval, dateval)਀             匀䔀䰀䔀䌀吀 
                 DENSE_RANK() OVER (ORDER BY s.workflow_instance_step_id)  AS Sequence,਀                 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 ⠀匀䔀䰀䔀䌀吀 一唀䰀䰀⤀⤀Ⰰ  
                 s.workflow_instance_step_id ,               ਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ ✀✀⤀Ⰰ                   
                 sd.field_id,਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
                 ISNULL(sd.field_name, ''),਀ऀऀऀऀ 猀搀⸀愀琀琀爀开椀搀Ⰰ 
				 ISNULL(sd.attr_mnemonic, ''),਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀搀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
                 ISNULL(sd.long_text_val, ''),਀ऀऀऀऀ 猀搀⸀猀琀攀瀀开漀爀搀攀爀Ⰰ 
				 sd.edge_id,਀ऀऀऀऀ 猀搀⸀琀漀开渀漀搀攀开椀搀Ⰰ 
				 sd.rule_val,਀ऀऀऀऀ 猀搀⸀搀愀琀攀开瘀愀氀 
             FROM SiblingStepsCTE AS s਀             䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开眀昀开椀渀猀琀开猀琀攀瀀开搀愀琀愀开䤀吀嘀䘀崀⠀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 䄀匀 猀搀 
             ORDER BY Sequence;਀ 
             SELECT਀                         ⴀⴀ 吀栀攀爀攀 椀猀 渀漀 攀挀栀漀 挀漀氀甀洀渀 昀漀爀 琀栀椀猀 猀攀氀攀挀琀 戀攀挀愀甀猀攀 椀琀 眀漀甀氀搀 氀漀最椀挀愀氀氀礀 挀氀愀猀栀 眀椀琀栀 琀栀攀 猀琀攀瀀椀搀 挀漀氀甀洀渀 
						 -- and confuse the application layer. The application has to remember the input parameter value. ਀                 猀琀攀瀀开猀攀焀甀攀渀挀攀        䄀匀 ✀匀攀焀甀攀渀挀攀✀Ⰰ 
                 recordid             AS 'Record ID',਀                 猀琀攀瀀椀搀               䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀Ⰰ ⴀⴀ 匀椀戀氀椀渀最 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 䤀䐀 
                 fieldtype            AS 'Field Type',਀                 昀椀攀氀搀椀搀              䄀匀 ✀䘀椀攀氀搀 䤀䐀✀Ⰰ 
                 fieldmnem            AS 'Field Mnemonic',਀                 昀椀攀氀搀渀愀洀攀            䄀匀 ✀䘀椀攀氀搀 一愀洀攀✀Ⰰ 
				 attrid               AS 'Attribute ID',਀ऀऀऀऀ 愀琀琀爀洀渀攀洀             䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				 attrname             AS 'Attribute Name',਀ऀऀऀऀ 氀漀渀最开琀攀砀琀瘀愀氀         䄀匀 ✀䰀漀渀最 吀攀砀琀 嘀愀氀甀攀✀Ⰰ 
				 steporder            AS 'Step Order',਀ऀऀऀऀ 攀搀最攀椀搀               䄀匀 ✀匀琀攀瀀 吀爀愀渀猀椀琀椀漀渀 䤀䐀✀Ⰰ 
				 to_nodeid            AS 'To Step ID',਀ऀऀऀऀ 爀甀氀攀瘀愀氀ऀऀ      䄀匀 ✀刀甀氀攀 嘀愀氀甀攀✀Ⰰ 
				 dateval              AS 'Date Value' ਀             䘀刀伀䴀 䀀吀爀攀攀䐀愀琀愀 
             ORDER BY Sequence, [Record ID];਀          匀䔀吀 䀀渀甀洀开爀攀挀漀爀搀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
          SET @num_nodes = (SELECT COUNT(DISTINCT stepid) FROM @TreeData);਀ 
  	  IF @num_records = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_step_get_step_data]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㐀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects de-normalised data for a given instance step. ਀ⴀⴀ 䤀渀瀀甀琀 椀猀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀⸀  
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_step_get_step_data]਀ 
	  @instance_step_id bigint         = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)     = '',਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@transaction_ready nchar(10)        = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀䐀䔀䌀䰀䄀刀䔀 䀀吀爀攀攀䐀愀琀愀 吀䄀䈀䰀䔀 
  (਀         爀攀挀漀爀搀椀搀 戀椀最椀渀琀Ⰰ 
         fieldtype nvarchar(50),਀         昀椀攀氀搀椀搀 戀椀最椀渀琀Ⰰ 
         fieldmnem nvarchar(10),਀         昀椀攀氀搀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
		 attrid bigint,਀ऀऀ 愀琀琀爀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
		 attrname nvarchar(50),਀         氀漀渀最开琀攀砀琀瘀愀氀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		 steporder int,਀ऀऀ 攀搀最攀椀搀 戀椀最椀渀琀Ⰰ 
		 to_nodeid bigint,਀ऀऀ 爀甀氀攀瘀愀氀 椀渀琀Ⰰ 
		 dateval datetime਀  ⤀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @num_records = 0;਀ 
  -- Data Validation਀ 
	  -- Check the workflow instance step id਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
	     SET @instance_step_id = NULL;਀      䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			 END਀      䔀䰀匀䔀 ⴀⴀ 䄀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
	 IF NOT EXISTS ਀ऀऀऀ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
			   FROM workflow_instances.workflow_instance_steps਀ऀऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 
		BEGIN -- Record doesn't exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'WfInstStepIdInvalid',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
		END਀ऀऀ䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
		 BEGIN਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀愀渀挀攀崀 
			  @wf_instance_to_check = @instance_step_id,਀ऀऀऀ  䀀眀昀开椀渀猀琀愀渀挀攀开愀甀琀栀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
		   IF @object_auth_result = 'Fail'਀ऀऀऀ 䈀䔀䜀䤀一 
		 		   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀䤀渀猀琀愀渀挀攀一漀琀䄀甀琀栀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFInstanceNotAuth.');਀ऀऀऀ 䔀一䐀 
		 END਀ 
-- End data validation ਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀   䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ऀ 䈀䔀䜀䤀一 吀刀夀 
਀ 
            INSERT INTO @TreeData (recordid, fieldtype, fieldid, fieldmnem, fieldname, attrid,਀ऀऀऀ                       愀琀琀爀洀渀攀洀Ⰰ 愀琀琀爀渀愀洀攀Ⰰ 氀漀渀最开琀攀砀琀瘀愀氀Ⰰ 猀琀攀瀀漀爀搀攀爀Ⰰ 攀搀最攀椀搀Ⰰ 琀漀开渀漀搀攀椀搀Ⰰ 爀甀氀攀瘀愀氀Ⰰ 搀愀琀攀瘀愀氀⤀ 
             SELECT਀ 
                 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), ਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开琀礀瀀攀Ⰰ ✀✀⤀Ⰰ                   
                 sd.field_id,਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ 
                 ISNULL(sd.field_name, ''),਀ऀऀऀऀ 猀搀⸀愀琀琀爀开椀搀Ⰰ 
				 ISNULL(sd.attr_mnemonic, ''),਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀猀搀⸀愀琀琀爀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
                 ISNULL(sd.long_text_val, ''),਀ऀऀऀऀ 猀搀⸀猀琀攀瀀开漀爀搀攀爀Ⰰ 
				 sd.edge_id,਀ऀऀऀऀ 猀搀⸀琀漀开渀漀搀攀开椀搀Ⰰ 
				 sd.rule_val,਀ऀऀऀऀ 猀搀⸀搀愀琀攀开瘀愀氀 
             FROM workflow_instances.workflow_instance_steps AS wis਀      䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开眀昀开椀渀猀琀开猀琀攀瀀开搀愀琀愀开䤀吀嘀䘀崀⠀眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀⤀ 䄀匀 猀搀 
            WHERE wis.workflow_instance_step_id = @instance_step_id;਀ 
             SELECT਀ऀऀऀ     䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀    䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀Ⰰ 
                 recordid             AS 'Record ID',਀                 昀椀攀氀搀琀礀瀀攀            䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ 
                 fieldid              AS 'Field ID',਀                 昀椀攀氀搀洀渀攀洀            䄀匀 ✀䘀椀攀氀搀 䴀渀攀洀漀渀椀挀✀Ⰰ 
                 fieldname            AS 'Field Name',਀ऀऀऀऀ 愀琀琀爀椀搀               䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				 attrmnem             AS 'Attribute Mnemonic',਀ऀऀऀऀ 愀琀琀爀渀愀洀攀             䄀匀 ✀䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				 long_textval         AS 'Long Text Value',਀ऀऀऀऀ 猀琀攀瀀漀爀搀攀爀            䄀匀 ✀匀琀攀瀀 伀爀搀攀爀✀Ⰰ 
				 edgeid               AS 'Step Transition ID',਀ऀऀऀऀ 琀漀开渀漀搀攀椀搀            䄀匀 ✀吀漀 匀琀攀瀀 䤀䐀✀Ⰰ 
				 ruleval		      AS 'Rule Value',਀ऀऀऀऀ 搀愀琀攀瘀愀氀              䄀匀 ✀䐀愀琀攀 嘀愀氀甀攀✀  
             FROM @TreeData਀             伀刀䐀䔀刀 䈀夀 ✀刀攀挀漀爀搀 䤀䐀✀㬀 
          SET @num_records = @@ROWCOUNT;਀ 
  	  IF @num_records = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_step_participants]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects all workflow participants਀ⴀⴀ 伀渀氀礀 椀渀挀氀甀搀攀 爀攀挀漀爀搀猀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_step_participants]਀ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
	  @numrows bigint                  = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user	਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ      
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
  SET @numrows = 0;਀ 
਀ 
਀ऀ䈀䔀䜀䤀一 吀刀夀 
		WITH docidsCTE AS (਀ऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀               䄀匀 搀漀挀椀搀Ⰰ 
		       searchtable.workflow_instance_id AS instanceid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀    䄀匀 洀漀搀攀氀椀搀Ⰰ 
			   searchtable.present_step_id      AS present_stepid਀ऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀攀愀爀挀栀琀愀戀氀攀  ⴀⴀ⌀⌀⌀ 吀栀攀 猀攀愀爀挀栀 挀爀椀琀攀爀椀愀 琀愀戀氀攀 
	 LEFT JOIN (਀ऀऀ  匀䔀䰀䔀䌀吀 䐀䤀匀吀䤀一䌀吀 ⴀⴀ 匀攀氀攀挀琀 愀氀氀 搀漀挀猀 琀栀愀琀 栀愀瘀攀 渀漀 最爀漀甀瀀 ⬀ 愀氀氀 琀栀愀琀 栀愀瘀攀 愀 最爀漀甀瀀 眀椀琀栀 渀漀 甀猀攀爀 ⬀ 愀氀氀 琀栀愀琀 栀愀瘀攀 愀 最爀漀甀瀀 琀栀愀琀 琀栀攀 甀猀攀爀 椀猀 氀椀渀欀攀搀 琀漀 
		                  -- namely only the records with a document that the user has viewing rights to.਀ऀऀऀऀ  搀椀氀⸀搀漀挀开椀搀            䄀匀 䤀䐀  
			 FROM base.document_id_list AS dil਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开氀椀渀欀猀 䄀匀 搀最氀 
			   ON   dil.doc_id ਀ऀऀऀऀ  㴀 搀最氀⸀搀漀挀开椀搀 
		LEFT JOIN xref.doc_group_names AS dgn਀ऀऀऀ   伀一   搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀  
				  = dgn.doc_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀搀漀挀开最爀漀甀瀀开瘀椀攀眀开瀀攀爀洀椀猀猀椀漀渀猀 䄀匀 搀最瘀瀀 
			   ON    dgn.doc_group_id਀ऀऀऀऀ  㴀 搀最瘀瀀⸀搀漀挀开最爀漀甀瀀开椀搀 
		LEFT JOIN user_restr.sid_list AS sl਀ऀऀऀ   伀一   搀最瘀瀀⸀猀椀搀开椀搀 
				  =   sl.sid_id਀ऀऀऀ圀䠀䔀刀䔀 ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一唀䰀䰀⤀ 
				  OR਀ऀऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
					AND dgvp.sid_id IS NULL)਀ऀऀऀऀ  伀刀 
				  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀ䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一伀吀 一唀䰀䰀 
					AND sl.sid = @connectedusersid਀ऀऀऀऀऀऀ ⤀  
			) AS AllDocIds ਀ऀऀ   伀一    猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀 
			  = AllDocIds.ID਀ऀऀऀऀऀ   ⤀ 
਀ 
	  SELECT ਀ऀ         猀氀⸀渀愀洀攀                       䄀匀 ✀䐀愀琀愀戀愀猀攀 唀猀攀爀渀愀洀攀✀Ⰰ 
			 sl.email_address              AS 'Email Address',਀ऀऀऀ 猀氀⸀猀椀搀开椀搀                     䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
		     ISNULL(sl.username, '')       AS 'System Username',਀ऀ         搀挀⸀椀渀猀琀愀渀挀攀椀搀                 䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 䤀䐀✀Ⰰ 
	         wmn.workflow_model_id         AS 'Workflow Model ID',਀ऀ         眀洀渀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 一愀洀攀✀Ⰰ 
	         ISNULL(wmn.mnem, '')          AS 'Model Mnemonic',਀             䤀匀一唀䰀䰀⠀眀洀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀䴀漀搀攀氀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 wmn.list_position             AS 'Model List Position',਀ऀऀऀ 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䄀匀 ✀圀漀爀欀昀氀漀眀 䤀渀猀琀愀渀挀攀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 dc.present_stepid             AS 'Present Step ID',਀ऀऀऀ 眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀            䄀匀 ✀匀琀攀瀀 匀琀愀琀甀猀 䤀䐀✀Ⰰ 
			 ISNULL(ssd.mnem, '')          AS 'Status Mnemonic',਀ऀऀऀ 猀猀搀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀匀琀愀琀甀猀 一愀洀攀✀Ⰰ 
			 ISNULL(ssd.descr, '')         AS 'Status Description',਀ऀऀऀ 猀猀搀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀             䄀匀 ✀匀琀愀琀甀猀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
			 wsp.output_id                 AS 'Workflow Output ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀眀漀搀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 wod.attr_name                 AS 'Output Definition Name',਀ऀऀऀ 䤀匀一唀䰀䰀⠀眀漀搀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				  CASE ਀ऀऀऀऀऀ 圀䠀䔀一 匀唀匀䔀刀开匀一䄀䴀䔀⠀猀氀⸀猀椀搀⤀ 䤀匀 一伀吀 一唀䰀䰀 吀䠀䔀一 ✀夀攀猀✀ 
					 ELSE 'No'਀ऀऀऀऀ  䔀一䐀                             䄀匀 ✀圀椀渀搀漀眀猀 䄀挀挀漀甀渀琀 䌀甀爀爀攀渀琀✀ऀ 
	    FROM workflow_instances.workflow_step_participants AS wsp਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 䄀匀 眀椀猀 
          ON   wsp.workflow_instance_step_id਀ऀऀ     㴀 眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
  INNER JOIN docidsCTE AS dc਀          伀一   眀椀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 
		     =  dc.instanceid਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 䄀匀 眀洀渀 
	      ON             dc.modelid਀ऀऀ     㴀 眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 
   LEFT JOIN workflow_instances.step_status_definitions AS ssd਀          伀一   眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
		     = ssd.step_status_id ਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀漀搀 
          ON   wsp.output_id਀ऀऀ     㴀 眀漀搀⸀漀甀琀瀀甀琀开椀搀 
   LEFT JOIN user_restr.sid_list AS sl਀          伀一  眀猀瀀⸀猀椀搀开椀搀 
		     = sl.sid_id਀    伀刀䐀䔀刀 䈀夀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开猀琀攀瀀开猀琀愀琀甀猀开搀攀昀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 眀漀爀欀昀氀漀眀 猀琀攀瀀 猀琀愀琀甀猀 搀攀昀椀渀椀琀椀漀渀 渀愀洀攀 爀攀挀漀爀搀猀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_step_status_defs]਀ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀   
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	         step_status_id          AS 'Step Status Definition ID',਀ऀ         愀琀琀爀开渀愀洀攀               䄀匀 ✀匀琀攀瀀 匀琀愀琀甀猀 䐀攀昀椀渀椀琀椀漀渀 一愀洀攀✀Ⰰ 
	         ISNULL(mnem, '')        AS 'Mnemonic',਀             䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀       䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 list_position           AS 'List Position'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 
    ORDER BY 'List Position';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_steps_by_duty_funct]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects workflow steps for a given function ID਀ⴀⴀ 伀渀氀礀 椀渀挀氀甀搀攀 爀攀挀漀爀搀猀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_steps_by_duty_funct]਀ 
	  @functionid  bigint              = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 椀搀 
	  IF @functionid = 0਀ऀ     匀䔀吀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
      IF @functionid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionID.');਀ऀऀऀ 䔀一䐀 
		    -- Check if the function id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctionIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀ऀ 䰀䔀䘀吀 䨀伀䤀一 ⠀ 
		  SELECT DISTINCT -- Select all docs that have no group + all that have a group with no user + all that have a group that the user is linked to਀ऀऀ                  ⴀⴀ 渀愀洀攀氀礀 漀渀氀礀 琀栀攀 爀攀挀漀爀搀猀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀ 
				  dil.doc_id            AS ID ਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
		LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀ   伀一   搀椀氀⸀搀漀挀开椀搀  
				  = dgl.doc_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
			   ON   dgl.doc_group_id ਀ऀऀऀऀ  㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀ   伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				  = dgvp.doc_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			   ON   dgvp.sid_id਀ऀऀऀऀ  㴀   猀氀⸀猀椀搀开椀搀 
			WHERE (dgl.doc_group_id IS NULL)਀ऀऀऀऀ  伀刀 
				  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀ䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
				  OR਀ऀऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
					AND dgvp.sid_id IS NOT NULL਀ऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
						 ) ਀ऀऀऀ⤀ 䄀匀 䄀氀氀䐀漀挀䤀搀猀  
		   ON    searchtable.doc_id਀ऀऀऀ  㴀 䄀氀氀䐀漀挀䤀搀猀⸀䤀䐀 
					   )਀ 
਀ऀ  匀䔀䰀䔀䌀吀 䀀昀甀渀挀琀椀漀渀椀搀                   䄀匀 ✀䐀甀琀礀 䘀甀渀挀琀椀漀渀 䤀䐀✀Ⰰ 
	         dc.instanceid                 AS 'Workflow Instance ID',਀ऀ         眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀         䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 䤀䐀✀Ⰰ 
	         wmn.attr_name                 AS 'Workflow Model Name',਀ऀ         䤀匀一唀䰀䰀⠀眀洀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䴀漀搀攀氀 䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(wmn.descr, '')         AS 'Model Description',਀ऀऀऀ 眀洀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀             䄀匀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
			 wis.workflow_instance_step_id AS 'Workflow Instance Step ID',਀ऀऀऀ 搀挀⸀瀀爀攀猀攀渀琀开猀琀攀瀀椀搀             䄀匀 ✀倀爀攀猀攀渀琀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 wis.step_status_id            AS 'Step Status ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀猀搀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀匀琀愀琀甀猀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 ssd.attr_name                 AS 'Status Name',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀猀搀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀匀琀愀琀甀猀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 ssd.list_position             AS 'Status List Position',਀ऀऀऀ 眀猀搀昀⸀漀甀琀瀀甀琀开椀搀                䄀匀 ✀圀漀爀欀昀氀漀眀 伀甀琀瀀甀琀 䤀䐀✀Ⰰ 
			 ISNULL(wod.mnem, '')          AS 'Output Definition Mnemonic',਀ऀऀऀ 眀漀搀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 一愀洀攀✀Ⰰ 
			 ISNULL(wod.descr, '')         AS 'Output Definition Description'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 眀猀搀昀 
   LEFT JOIN workflow_instances.workflow_instance_steps AS wis਀          伀一   眀猀搀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		     =  wis.workflow_instance_step_id਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀挀 
          ON   wis.workflow_instance_id਀ऀऀ     㴀  搀挀⸀椀渀猀琀愀渀挀攀椀搀 
   LEFT JOIN workflow_models.workflow_model_names AS wmn਀ऀ      伀一             搀挀⸀洀漀搀攀氀椀搀 
		     = wmn.workflow_model_id਀   䰀䔀䘀吀 䨀伀䤀一 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 䄀匀 搀昀 
          ON wsdf.function_id਀ऀऀ     㴀 搀昀⸀昀甀渀挀琀椀漀渀开椀搀 
   LEFT JOIN workflow_instances.step_status_definitions AS ssd਀          伀一   眀椀猀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀 
		     = ssd.step_status_id ਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 眀漀搀 
          ON   wsdf.output_id਀ऀऀ     㴀  眀漀搀⸀漀甀琀瀀甀琀开椀搀 
       WHERE wsdf.function_id਀ऀ         㴀   䀀昀甀渀挀琀椀漀渀椀搀 
    ORDER BY 'Model List Position';਀ऀ匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
  	  IF @numrows = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_steps_by_model_name]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㈀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects all workflow steps for a given model਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开猀琀攀瀀猀开戀礀开洀漀搀攀氀开渀愀洀攀崀 
਀ऀ  䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
	  @num_steps bigint                = NULL OUTPUT, -- Total number of nodes਀ऀ  䀀渀甀洀开爀攀挀漀爀搀猀 戀椀最椀渀琀              㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@tempvalidationstatus nchar(10)         = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
DECLARE @TreeData TABLE਀  ⠀ 
           step_sequence int,਀ऀऀ   爀攀挀漀爀搀椀搀 椀渀琀Ⰰ 
		   stepid bigint,਀           昀椀攀氀搀琀礀瀀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
           fieldid bigint,਀           昀椀攀氀搀洀渀攀洀 渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ 
           fieldname nvarchar(50),਀ऀऀ   昀椀攀氀搀搀攀猀挀爀 渀瘀愀爀挀栀愀爀⠀洀愀砀⤀Ⰰ 
		   steporder int,਀ऀऀ   攀搀最攀椀搀 戀椀最椀渀琀Ⰰ 
		   to_nodeid bigint,਀ऀऀ   爀甀氀攀开瘀愀氀㄀ 椀渀琀Ⰰ 
		   rule_val2 int,਀ऀऀ   爀甀氀攀开瘀愀氀㌀ 椀渀琀 
  )਀ 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀开猀琀攀瀀猀 㴀 　㬀 
  SET @num_records = 0;਀ 
  -- Data Validation਀ 
  	-- Validate model id਀ऀ  䤀䘀 䀀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 㴀 　 
		 SET @workflow_model_id = NULL;਀ऀ  ⴀⴀ 䌀栀攀挀欀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
	  IF @workflow_model_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀漀爀欀昀氀䴀漀搀攀氀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWorkflModelID.');਀ऀऀ 䔀一䐀 
	  ELSE -- A record id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 爀攀挀漀爀搀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_model_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀 
							 WHERE workflow_model_id = @workflow_model_id) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀漀爀欀昀氀䴀漀搀攀氀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WorkflModelInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 END਀ 
-- End data validation ਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
਀   䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
    BEGIN਀ऀ 䈀䔀䜀䤀一 吀刀夀 
਀            圀䤀吀䠀 䄀氀氀匀琀攀瀀猀䌀吀䔀 䄀匀 ⠀ 
                 SELECT workflow_model_step_id਀                   䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀攀昀椀渀椀琀椀漀渀猀 
                  WHERE workflow_model_id = @workflow_model_id਀                           ⤀ 
਀            䤀一匀䔀刀吀 䤀一吀伀 䀀吀爀攀攀䐀愀琀愀 ⠀猀琀攀瀀开猀攀焀甀攀渀挀攀Ⰰ 爀攀挀漀爀搀椀搀Ⰰ 猀琀攀瀀椀搀Ⰰ  
			                       fieldtype, fieldid, fieldmnem, fieldname, fielddescr, steporder, ਀ऀऀऀऀऀऀऀऀ   攀搀最攀椀搀Ⰰ 琀漀开渀漀搀攀椀搀Ⰰ 爀甀氀攀开瘀愀氀㄀Ⰰ 爀甀氀攀开瘀愀氀㈀Ⰰ 爀甀氀攀开瘀愀氀㌀⤀ 
             SELECT਀ 
                 DENSE_RANK() OVER (ORDER BY s.workflow_model_step_id) as Sequence,਀                 刀伀圀开一唀䴀䈀䔀刀⠀⤀ 伀嘀䔀刀 ⠀伀刀䐀䔀刀 䈀夀 ⠀匀䔀䰀䔀䌀吀 一唀䰀䰀⤀⤀Ⰰ 
				 s.workflow_model_step_id,਀ 
                 ISNULL(sd.field_type, ''),਀                 猀搀⸀昀椀攀氀搀开椀搀Ⰰ 
                 ISNULL(sd.field_mnem, ''),਀                 䤀匀一唀䰀䰀⠀猀搀⸀昀椀攀氀搀开渀愀洀攀Ⰰ ✀✀⤀Ⰰ 
				 ISNULL(sd.field_descr, ''),਀ऀऀऀऀ 猀搀⸀猀琀攀瀀开漀爀搀攀爀Ⰰ 
				 sd.edge_id,਀ऀऀऀऀ 猀搀⸀琀漀开渀漀搀攀开椀搀Ⰰ 
				 sd.rule_value1,਀ऀऀऀऀ 猀搀⸀爀甀氀攀开瘀愀氀甀攀㈀Ⰰ 
				 sd.rule_value3਀ 
             FROM AllStepsCTE AS s਀             䌀刀伀匀匀 䄀倀倀䰀夀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀昀渀开匀䔀䰀开眀昀开洀漀搀开猀琀攀瀀开搀愀琀愀开䤀吀嘀䘀崀⠀猀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀⤀ 䄀匀 猀搀 
             ORDER BY Sequence;਀ 
਀             匀䔀䰀䔀䌀吀 
			     @workflow_model_id   AS 'Workflow Model ID',਀                 猀琀攀瀀开猀攀焀甀攀渀挀攀        䄀匀 ✀匀攀焀甀攀渀挀攀✀Ⰰ 
                 recordid             AS 'Record ID',਀                 猀琀攀瀀椀搀               䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 匀琀攀瀀 䤀䐀✀Ⰰ 
                 fieldtype            AS 'Field Type',਀                 昀椀攀氀搀椀搀              䄀匀 ✀䘀椀攀氀搀 䤀䐀✀Ⰰ 
                 fieldmnem            AS 'Mnemonic',਀                 昀椀攀氀搀渀愀洀攀            䄀匀 ✀䘀椀攀氀搀 一愀洀攀✀Ⰰ 
				 fielddescr           AS 'Field Description',਀ऀऀऀऀ 猀琀攀瀀漀爀搀攀爀            䄀匀 ✀匀琀攀瀀 伀爀搀攀爀✀Ⰰ 
				 edgeid               AS 'Step Transition ID',਀ऀऀऀऀ 琀漀开渀漀搀攀椀搀            䄀匀 ✀吀漀 匀琀攀瀀 䤀䐀✀Ⰰ 
				 rule_val1            AS 'Rule Value 1',਀ऀऀऀऀ 爀甀氀攀开瘀愀氀㈀            䄀匀 ✀刀甀氀攀 嘀愀氀甀攀 ㈀✀Ⰰ 
				 rule_val3            AS 'Rule Value 3'਀             䘀刀伀䴀 䀀吀爀攀攀䐀愀琀愀 
             ORDER BY Sequence, [Record ID];਀          匀䔀吀 䀀渀甀洀开爀攀挀漀爀搀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
          SET @num_steps = (SELECT COUNT(DISTINCT stepid) FROM @TreeData);਀ 
  	  IF @num_records = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_steps_by_person]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㄀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects workflow steps for a given person ID.  Defaults to the connected user if no user ID supplied. ਀ⴀⴀ 伀渀氀礀 椀渀挀氀甀搀攀 爀攀挀漀爀搀猀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_steps_by_person]਀ 
	  @sidid  bigint                   = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN(),     ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  匀䔀吀 䀀渀甀洀爀漀眀猀 㴀 　㬀 
਀  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
   -- Check the person id਀ऀ  䤀䘀 䀀猀椀搀椀搀 㴀 　 
	     SET @sidid = NULL;਀      䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ ⴀⴀ 刀攀琀爀椀攀瘀攀 琀栀攀 猀椀搀椀搀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀Ⰰ 椀昀 椀琀 攀砀椀猀琀猀⸀   
				  SET @sidid = (SELECT sl.sid_id਀ऀऀऀऀऀऀऀऀ  䘀刀伀䴀 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			  					 WHERE sl.sid = @connectedusersid)	਀ऀऀऀऀ  䤀䘀 䀀猀椀搀椀搀 䤀匀 一唀䰀䰀 
				     BEGIN਀ऀऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					   SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'NoSidId', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					   ELSE ਀ऀऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀匀椀搀䤀搀⸀✀⤀㬀 
				     END਀ऀऀऀ 䔀一䐀 
		    -- Check if the person id exists਀ऀऀ䔀䰀匀䔀 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 猀椀搀开椀搀 
			                 FROM user_restr.sid_list਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 猀椀搀开椀搀 㴀 䀀猀椀搀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'SidIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀椀搀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ 
	BEGIN TRY਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀ऀ 䰀䔀䘀吀 䨀伀䤀一 ⠀ 
		  SELECT DISTINCT -- Select all docs that have no group + all that have a group with no user + all that have a group that the user is linked to਀ऀऀ                  ⴀⴀ 渀愀洀攀氀礀 漀渀氀礀 琀栀攀 爀攀挀漀爀搀猀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀ 
				  dil.doc_id            AS ID ਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
		LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀ   伀一   搀椀氀⸀搀漀挀开椀搀  
				  = dgl.doc_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
			   ON   dgl.doc_group_id ਀ऀऀऀऀ  㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀ   伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				  = dgvp.doc_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			   ON   dgvp.sid_id਀ऀऀऀऀ  㴀   猀氀⸀猀椀搀开椀搀 
			WHERE (dgl.doc_group_id IS NULL)਀ऀऀऀऀ  伀刀 
				  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀ䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
				  OR਀ऀऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
					AND dgvp.sid_id IS NOT NULL਀ऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
						 ) ਀ऀऀऀ⤀ 䄀匀 䄀氀氀䐀漀挀䤀搀猀  
		   ON    searchtable.doc_id਀ऀऀऀ  㴀 䄀氀氀䐀漀挀䤀搀猀⸀䤀䐀 
					   )਀ 
਀ऀ  匀䔀䰀䔀䌀吀 䀀猀椀搀椀搀                        䄀匀 ✀唀猀攀爀 䤀䐀✀Ⰰ 
	         dc.instanceid                 AS 'Workflow Instance ID',਀ऀ         眀洀渀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀         䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 䤀䐀✀Ⰰ 
	         wmn.attr_name                 AS 'Workflow Model Name',਀ऀ         䤀匀一唀䰀䰀⠀眀洀渀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀䴀漀搀攀氀 䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(wmn.descr, '')         AS 'Model Description',਀ऀऀऀ 眀洀渀⸀氀椀猀琀开瀀漀猀椀琀椀漀渀             䄀匀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀Ⰰ 
			 wis.workflow_instance_step_id AS 'Workflow Instance Step ID',਀ऀऀऀ 搀挀⸀瀀爀攀猀攀渀琀开猀琀攀瀀椀搀             䄀匀 ✀倀爀攀猀攀渀琀 匀琀攀瀀 䤀䐀✀Ⰰ 
			 wis.step_status_id            AS 'Step Status ID',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀猀搀⸀洀渀攀洀Ⰰ ✀✀⤀          䄀匀 ✀匀琀愀琀甀猀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			 ssd.attr_name                 AS 'Status Name',਀ऀऀऀ 䤀匀一唀䰀䰀⠀猀猀搀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀匀琀愀琀甀猀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 ssd.list_position             AS 'Status List Position',਀ऀऀऀ 眀猀瀀⸀漀甀琀瀀甀琀开椀搀                 䄀匀 ✀圀漀爀欀昀氀漀眀 伀甀琀瀀甀琀 䤀䐀✀Ⰰ 
			 ISNULL(wod.mnem, '')          AS 'Output Definition Mnemonic',਀ऀऀऀ 眀漀搀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 一愀洀攀✀Ⰰ 
			 ISNULL(wod.descr, '')         AS 'Output Definition Description'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 䄀匀 眀猀瀀 
   LEFT JOIN workflow_instances.workflow_instance_steps AS wis਀          伀一   眀猀瀀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		     = wis.workflow_instance_step_id਀  䤀一一䔀刀 䨀伀䤀一 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀挀 
          ON   wis.workflow_instance_id਀ऀऀ     㴀  搀挀⸀椀渀猀琀愀渀挀攀椀搀 
   LEFT JOIN workflow_models.workflow_model_names AS wmn਀ऀ      伀一             搀挀⸀洀漀搀攀氀椀搀 
		     = wmn.workflow_model_id਀   䰀䔀䘀吀 䨀伀䤀一 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀猀琀攀瀀开猀琀愀琀甀猀开搀攀昀椀渀椀琀椀漀渀猀 䄀匀 猀猀搀 
          ON   wis.step_status_id਀ऀऀ     㴀 猀猀搀⸀猀琀攀瀀开猀琀愀琀甀猀开椀搀  
   LEFT JOIN workflow_instances.workflow_output_definitions AS wod਀          伀一   眀猀瀀⸀漀甀琀瀀甀琀开椀搀 
		     = wod.output_id਀       圀䠀䔀刀䔀 眀猀瀀⸀猀椀搀开椀搀 
	         =  @sidid਀    伀刀䐀䔀刀 䈀夀 ✀䴀漀搀攀氀 䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
  END -- END IF @data_validation_status = 'Pass'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开琀爀开氀漀最开椀渀搀攀砀开戀礀开搀漀挀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 19-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ刀攀愀搀猀 眀漀爀欀昀氀漀眀 琀爀愀挀欀 氀漀最 椀渀搀攀砀 爀攀挀漀爀搀猀 愀 最椀瘀攀渀 搀漀挀甀洀攀渀琀 䤀䐀⸀  
਀ⴀⴀ 䤀渀瀀甀琀 椀猀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀    
-- Output is a message and status and the people lists.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_wf_tr_log_index_by_doc] ਀     䀀搀漀挀甀洀攀渀琀椀搀 渀瘀愀爀挀栀愀爀⠀㔀　⤀          㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)           = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @numrecords bigint                = NULL OUTPUT਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀  䐀䔀䌀䰀䄀刀䔀  
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                              -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
        @data_validation_status nchar(10)       = 'Pass';਀ 
DECLARE @AttData TABLE਀  ⠀ 
			       logindexid    bigint,਀ऀऀऀऀ   挀爀攀愀琀攀搀愀琀攀    搀愀琀攀琀椀洀攀㈀⠀㜀⤀Ⰰ 
				   triggeredby   nvarchar(50),਀ऀऀऀऀ   搀漀挀椀搀         渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
				   model_id      bigint,਀ऀऀऀऀ   洀漀搀攀氀渀愀洀攀     渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
				   presentstepid bigint਀  ⤀ 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
਀ऀⴀⴀ 嘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀 
਀ ⴀⴀ 䐀漀挀甀洀攀渀琀 椀搀 瘀愀氀椀搀愀琀椀漀渀 
	  IF @documentid = ''਀ऀऀ 匀䔀吀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	  IF @documentid IS NOT NULL਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		   EXEC [internal].[usp_AUTHENTICATE_user_doc_id] ਀ ऀ            䀀搀漀挀开椀搀开琀漀开挀栀攀挀欀 㴀  䀀搀漀挀甀洀攀渀琀椀搀Ⰰ 
	            @user_authentication_result = @docauthenticationstatus OUTPUT;਀ऀऀऀ 䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ऀऀऀ䔀一䐀 
		-- End document id validation਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 昀愀椀氀攀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		     SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
	  -- End data validation਀ 
਀  ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
਀ऀ   ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一伀吀 一唀䰀䰀 
			SELECT @documentid            AS 'Document ID',਀ऀऀऀ       眀琀氀椀⸀眀昀开氀漀最开椀渀搀攀砀开椀搀   䄀匀 ✀䰀漀最 䤀渀搀攀砀 䤀䐀✀Ⰰ 
				   wtli.create_date       AS 'Date',਀ऀऀऀऀ   眀琀氀椀⸀琀爀椀最最攀爀攀搀开戀礀      䄀匀 ✀吀爀椀最最攀爀攀搀 䈀礀✀Ⰰ 
				   wtli.doc_id            AS 'Document ID',਀ऀऀऀऀ   眀琀氀椀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 䄀匀 ✀䴀漀搀攀氀 䤀䐀✀Ⰰ 
				   wtli.model_name        AS 'Model Name',਀ऀऀऀऀ   眀琀氀椀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀   䄀匀 ✀倀爀攀猀攀渀琀 匀琀攀瀀 䤀䐀✀ 
			  FROM workflow_instances.workflow_track_log_index AS wtli਀ऀऀऀ 圀䠀䔀刀䔀 眀琀氀椀⸀搀漀挀开椀搀 㴀 䀀搀漀挀甀洀攀渀琀椀搀 
		     ORDER BY Date DESC;਀          䔀䰀匀䔀 
		   BEGIN਀ 
			WITH docidsCTE AS (਀ऀऀऀ匀䔀䰀䔀䌀吀 猀攀愀爀挀栀琀愀戀氀攀⸀搀漀挀开椀搀    䄀匀 搀漀挀椀搀 
			  FROM workflow_instances.workflow_track_log_index AS searchtable  --### The search criteria table਀ऀऀ䤀一一䔀刀 䨀伀䤀一 椀渀琀攀爀渀愀氀⸀甀昀渀开匀䔀䰀开搀漀挀猀开瀀攀爀洀椀猀猀椀漀渀开昀椀氀琀爀开䤀吀嘀䘀⠀䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ 䄀匀 瀀攀爀洀  ⴀⴀ 䄀瀀瀀氀礀 琀栀攀 瀀攀爀洀椀猀猀椀漀渀 昀椀氀琀攀爀 
				ON    searchtable.doc_id਀ऀऀऀऀऀ㴀 瀀攀爀洀⸀搀漀挀开椀搀 
				)਀ 
		 INSERT INTO @AttData(logindexid, createdate, triggeredby, docid, model_id, modelname, presentstepid) ਀ 
			(SELECT DISTINCT਀ऀऀऀ       眀琀氀椀⸀眀昀开氀漀最开椀渀搀攀砀开椀搀   䄀匀 氀漀最椀渀搀攀砀椀搀Ⰰ 
				   wtli.create_date       AS createdate,਀ऀऀऀऀ   眀琀氀椀⸀琀爀椀最最攀爀攀搀开戀礀      䄀匀 琀爀椀最最攀爀攀搀戀礀Ⰰ 
				   wtli.doc_id            AS docid,਀ऀऀऀऀ   眀琀氀椀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀 䄀匀 洀漀搀攀氀开椀搀Ⰰ 
				   wtli.model_name        AS modelname,਀ऀऀऀऀ   眀琀氀椀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀   䄀匀 瀀爀攀猀攀渀琀猀琀攀瀀椀搀 
			  FROM docidsCTE਀ऀऀऀ  伀唀吀䔀刀 䄀倀倀䰀夀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开椀渀搀攀砀 䄀匀 眀琀氀椀 
		    );਀ऀऀऀ匀䔀䰀䔀䌀吀 䀀搀漀挀甀洀攀渀琀椀搀       䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
			       ad.logindexid     AS 'Log Index ID',਀ऀऀऀऀ   愀搀⸀挀爀攀愀琀攀搀愀琀攀     䄀匀 ✀䐀愀琀攀✀Ⰰ 
				   ad.triggeredby    AS 'Triggered By',਀ऀऀऀऀ   愀搀⸀搀漀挀椀搀          䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
				   ad.model_id       AS 'Model ID',਀ऀऀऀऀ   愀搀⸀洀漀搀攀氀渀愀洀攀      䄀匀 ✀䴀漀搀攀氀 一愀洀攀✀Ⰰ 
				   ad.presentstepid  AS 'Present Step ID'਀ऀऀऀ  䘀刀伀䴀 䀀䄀琀琀䐀愀琀愀 䄀匀 愀搀 
		     ORDER BY Date DESC;਀ 
		   END਀ 
		 SET @numrecords = @@ROWCOUNT;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀऀ 匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
	     SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT_WS(' | ', @message, @tempmessage, ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    䔀一䐀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_wf_track_log_by_id]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀㤀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Reads workflow track log records a given log index ID. ਀ 
-- Input is the log index ID.   ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 洀攀猀猀愀最攀 愀渀搀 猀琀愀琀甀猀 愀渀搀 琀栀攀 瀀攀漀瀀氀攀 氀椀猀琀猀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀昀开琀爀愀挀欀开氀漀最开戀礀开椀搀崀  
     @logindexid bigint                = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀           㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)  = NULL OUTPUT,਀ऀ 䀀渀甀洀爀攀挀漀爀搀猀 戀椀最椀渀琀                㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
  DECLARE ਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀              㴀 ✀✀Ⰰ 
		@docauthenticationstatus nchar(10)      = '', -- Communicates if the user is not authorised to access the document਀ऀऀ                                              ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@transaction_ready nchar(10)            = 'Ready',਀        䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
  -- Execute the query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
			SELECT ਀ऀऀऀ       眀琀氀⸀眀昀开氀漀最开椀搀                  䄀匀 ✀䰀漀最 䤀䐀✀Ⰰ 
				   wtl.record_id                  AS 'Record ID',਀ऀऀऀऀ   眀琀氀⸀昀椀攀氀搀开琀礀瀀攀                 䄀匀 ✀䘀椀攀氀搀 吀礀瀀攀✀Ⰰ 
				   wtl.field_id                   AS 'Field ID',਀ऀऀऀऀ   䤀匀一唀䰀䰀⠀眀琀氀⸀昀椀攀氀搀开洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀ 䄀匀 ✀䘀椀攀氀搀 䴀渀攀洀漀渀椀挀✀Ⰰ 
				   wtl.field_name                 AS 'Field Name',਀ऀऀऀऀ   眀琀氀⸀愀琀琀爀开椀搀                    䄀匀 ✀䄀琀琀爀椀戀甀琀攀 䤀䐀✀Ⰰ 
				   ISNULL(wtl.attr_mnemonic, '')  AS 'Attribute Mnemonic',਀ऀऀऀऀ   眀琀氀⸀愀琀琀爀开渀愀洀攀                  䄀匀 ✀䄀琀琀爀椀戀甀琀攀 一愀洀攀✀Ⰰ 
				   wtl.long_text_val              AS 'Long Text Value',਀ऀऀऀऀ   眀琀氀⸀猀琀攀瀀开漀爀搀攀爀                 䄀匀 ✀匀琀攀瀀 伀爀搀攀爀✀Ⰰ 
				   wtl.edge_id                    AS 'Step Transition ID',਀ऀऀऀऀ   眀琀氀⸀琀漀开渀漀搀攀开椀搀                 䄀匀 ✀吀漀 一漀搀攀 䤀䐀✀Ⰰ 
				   wtl.rule_val                   AS 'Rule Value',਀ऀऀऀऀ   眀琀氀⸀搀愀琀攀开瘀愀氀                   䄀匀 ✀䐀愀琀攀 嘀愀氀甀攀✀ 
			  FROM workflow_instances.workflow_track_log AS wtl਀ऀऀऀ 圀䠀䔀刀䔀 眀琀氀⸀眀昀开氀漀最开椀渀搀攀砀开椀搀 㴀 䀀氀漀最椀渀搀攀砀椀搀 
		  ORDER BY 'Log ID' DESC;਀ऀऀ 匀䔀吀 䀀渀甀洀爀攀挀漀爀搀猀 㴀 䀀䀀刀伀圀䌀伀唀一吀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		     SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
			 SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
			SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀栀漀椀猀琀栀椀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 14-01-2026਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Returns the details of the connected user that the database can see.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀⨀⼀ 
-- =============================================਀ 
CREATE PROCEDURE [reading].[usp_SEL_whoisthis] ਀ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
	 @username nvarchar(150)          = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = ''਀ 
 ਀ 
	  BEGIN TRY਀ 
	       SET @username = ORIGINAL_LOGIN(); ਀ऀऀ   䤀䘀 䀀甀猀攀爀渀愀洀攀 䤀匀 一唀䰀䰀 匀䔀吀 䀀甀猀攀爀渀愀洀攀 㴀 ✀唀猀攀爀 甀渀爀攀猀漀氀瘀愀戀氀攀✀㬀 
਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
		਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_workflow_actions]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects all workflow action records਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT  -- Transaction status passed back to the application਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  ਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ         眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀      䄀匀 ✀圀漀爀欀昀氀漀眀 䄀挀琀椀漀渀 䤀䐀✀Ⰰ 
	         attr_name               AS 'Workflow Action Name',਀ऀ         䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(descr, '')       AS 'Description',਀ऀऀऀ 氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	    FROM workflow_models.workflow_actions਀    伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 搀攀昀椀渀椀琀椀漀渀 爀攀挀漀爀搀猀 
-- Only include records which include a document that the user has viewing rights for਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开搀攀昀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT,  -- Transaction status passed back to the application਀ऀ  䀀渀甀洀爀漀眀猀 戀椀最椀渀琀                  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀   㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀ऀ 
	    @username nvarchar(150)            = ORIGINAL_LOGIN();     ਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀   
	BEGIN TRY਀ 
਀ऀऀ圀䤀吀䠀 搀漀挀椀搀猀䌀吀䔀 䄀匀 ⠀ 
		SELECT searchtable.doc_id               AS docid,਀ऀऀ       猀攀愀爀挀栀琀愀戀氀攀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开椀搀 䄀匀 椀渀猀琀愀渀挀攀椀搀Ⰰ 
		       searchtable.workflow_model_id    AS modelid,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀瀀爀攀猀攀渀琀开猀琀攀瀀开椀搀      䄀匀 瀀爀攀猀攀渀琀开猀琀攀瀀椀搀Ⰰ 
			   searchtable.create_date          AS createdate,਀ऀऀऀ   猀攀愀爀挀栀琀愀戀氀攀⸀渀漀琀攀猀                䄀匀 椀渀猀琀愀渀挀攀开渀漀琀攀猀 
		  FROM workflow_instances.workflow_instance_definitions AS searchtable  --### The search criteria table਀ऀ 䰀䔀䘀吀 䨀伀䤀一 ⠀ 
		  SELECT DISTINCT -- Select all docs that have no group + all that have a group with no user + all that have a group that the user is linked to਀ऀऀ                  ⴀⴀ 渀愀洀攀氀礀 漀渀氀礀 琀栀攀 爀攀挀漀爀搀猀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瘀椀攀眀椀渀最 爀椀最栀琀猀 琀漀⸀ 
				  dil.doc_id            AS ID ਀ऀऀऀ 䘀刀伀䴀 戀愀猀攀⸀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀 䄀匀 搀椀氀 
		LEFT JOIN xref.doc_group_links AS dgl਀ऀऀऀ   伀一   搀椀氀⸀搀漀挀开椀搀  
				  = dgl.doc_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 砀爀攀昀⸀搀漀挀开最爀漀甀瀀开渀愀洀攀猀 䄀匀 搀最渀 
			   ON   dgl.doc_group_id ਀ऀऀऀऀ  㴀 搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
		LEFT JOIN user_restr.doc_group_view_permissions AS dgvp਀ऀऀऀ   伀一    搀最渀⸀搀漀挀开最爀漀甀瀀开椀搀 
				  = dgvp.doc_group_id਀ऀऀ䰀䔀䘀吀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
			   ON   dgvp.sid_id਀ऀऀऀऀ  㴀   猀氀⸀猀椀搀开椀搀 
			WHERE (dgl.doc_group_id IS NULL)਀ऀऀऀऀ  伀刀 
				  (dgl.doc_group_id IS NOT NULL ਀ऀऀऀऀऀ䄀一䐀 搀最瘀瀀⸀猀椀搀开椀搀 䤀匀 一唀䰀䰀⤀ 
				  OR਀ऀऀऀऀ  ⠀搀最氀⸀搀漀挀开最爀漀甀瀀开椀搀 䤀匀 一伀吀 一唀䰀䰀  
					AND dgvp.sid_id IS NOT NULL਀ऀऀऀऀऀ䄀一䐀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 
						 ) ਀ऀऀऀ⤀ 䄀匀 䄀氀氀䐀漀挀䤀搀猀  
		   ON    searchtable.doc_id਀ऀऀऀ  㴀 䄀氀氀䐀漀挀䤀搀猀⸀䤀䐀 
					   )਀ 
਀ऀ  匀䔀䰀䔀䌀吀  
	         dc.instanceid                 AS 'Workflow Instance ID',਀ऀ         搀挀⸀搀漀挀椀搀                      䄀匀 ✀䐀漀挀甀洀攀渀琀 䤀䐀✀Ⰰ 
	         wmn.workflow_model_id         AS 'Workflow Model ID',਀ऀ         眀洀渀⸀愀琀琀爀开渀愀洀攀                 䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 一愀洀攀✀Ⰰ 
	         ISNULL(wmn.mnem, '')          AS 'Mnemonic',਀             䤀匀一唀䰀䰀⠀眀洀渀⸀搀攀猀挀爀Ⰰ ✀✀⤀         䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 dc.present_stepid             AS 'Present Step ID',਀ऀऀऀ 䌀伀一嘀䔀刀吀⠀一嘀䄀刀䌀䠀䄀刀⠀㌀　⤀Ⰰ 搀挀⸀挀爀攀愀琀攀搀愀琀攀Ⰰ ㄀㈀　⤀  䄀匀 ✀䌀爀攀愀琀攀 䐀愀琀攀✀Ⰰ 
			 ISNULL(dc.instance_notes, '') As 'Notes'਀ऀ    䘀刀伀䴀 搀漀挀椀搀猀䌀吀䔀 䄀匀 搀挀 
   LEFT JOIN workflow_models.workflow_model_names AS wmn਀ऀ      伀一             搀挀⸀洀漀搀攀氀椀搀 
		     = wmn.workflow_model_id਀    伀刀䐀䔀刀 䈀夀 ✀䌀爀攀愀琀攀 䐀愀琀攀✀ 䐀䔀匀䌀Ⰰ ✀䐀漀挀甀洀攀渀琀 䤀䐀✀㬀 
	SET @numrows = @@ROWCOUNT;਀  ऀ  䤀䘀 䀀渀甀洀爀漀眀猀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_workflow_model_names]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects all workflow model name records਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT  -- Transaction status passed back to the application਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  ਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ         眀漀爀欀昀氀漀眀开洀漀搀攀氀开椀搀       䄀匀 ✀圀漀爀欀昀氀漀眀 䴀漀搀攀氀 䤀䐀✀Ⰰ 
	         attr_name               AS 'Workflow Model Name',਀ऀ         䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(descr, '')       AS 'Description',਀ऀऀऀ 氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	    FROM workflow_models.workflow_model_names਀    伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 愀氀氀 眀漀爀欀昀氀漀眀 漀甀琀瀀甀琀 搀攀昀椀渀椀琀椀漀渀 渀愀洀攀 爀攀挀漀爀搀猀 
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_workflow_output_defs]਀ 
      @message nvarchar(1000)          = '' OUTPUT, -- Error messages passed back to the application਀      䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀  ⴀⴀ 吀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀䐀䔀䌀䰀䄀刀䔀 
        @tempmessage nvarchar(300)          = '';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀   
	BEGIN TRY਀ऀ  匀䔀䰀䔀䌀吀  
	         output_id               AS 'Output Definition ID',਀ऀ         愀琀琀爀开渀愀洀攀               䄀匀 ✀伀甀琀瀀甀琀 䐀攀昀椀渀椀琀椀漀渀 一愀洀攀✀Ⰰ 
	         ISNULL(mnem, '')        AS 'Mnemonic',਀             䤀匀一唀䰀䰀⠀搀攀猀挀爀Ⰰ ✀✀⤀       䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			 list_position           AS 'List Position'਀ऀ    䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀 
    ORDER BY 'List Position';਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_SEL_workflow_rules]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 　㠀ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Selects all workflow rules records਀ⴀⴀ 倀爀攀挀漀渀搀椀琀椀漀渀猀㨀 渀漀渀攀⸀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀漀爀欀昀氀漀眀开爀甀氀攀猀崀 
਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT  -- Transaction status passed back to the application਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
  ਀ऀ䈀䔀䜀䤀一 吀刀夀 
	  SELECT ਀ऀ         爀甀氀攀开椀搀                 䄀匀 ✀圀漀爀欀昀氀漀眀 刀甀氀攀 䤀䐀✀Ⰰ 
	         attr_name               AS 'Workflow Rule Name',਀ऀ         䤀匀一唀䰀䰀⠀洀渀攀洀Ⰰ ✀✀⤀        䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
             ISNULL(descr, '')       AS 'Description',਀ऀऀऀ 氀椀猀琀开瀀漀猀椀琀椀漀渀           䄀匀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀ 
	    FROM workflow_models.workflow_rules਀    伀刀䐀䔀刀 䈀夀 ✀䰀椀猀琀 倀漀猀椀琀椀漀渀✀㬀 
  	  IF @@ROWCOUNT = 0਀ऀ    䈀䔀䜀䤀一 
	      EXEC internal.usp_SEL_message ਀               䀀洀攀猀猀愀最攀开椀搀   㴀 ✀娀攀爀漀刀攀挀漀爀搀猀✀Ⰰ  
               @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on ZeroRecords.');਀ऀ    䔀一䐀 
	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	          SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ       䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀ऀ䔀一䐀 吀刀夀 
	BEGIN CATCH਀      匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	     SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀ     䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀渀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 08-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ匀攀氀攀挀琀猀 琀栀攀 搀愀琀愀 昀漀爀 愀 最椀瘀攀渀 眀漀爀欀昀氀漀眀 猀琀攀瀀 琀爀愀渀猀椀琀椀漀渀⸀  
-- Preconditions: none.਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_SEL_workflow_step_transn]਀ 
	  @step_transitionid int           = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ ⴀⴀ 䔀爀爀漀爀 洀攀猀猀愀最攀猀 瀀愀猀猀攀搀 戀愀挀欀 琀漀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 
      @transaction_status nvarchar(50) = NULL OUTPUT  -- Transaction status passed back to the application਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
DECLARE਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀          㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)        = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
	  -- Data validation਀      ⴀⴀ 圀漀爀欀昀氀漀眀 猀琀攀瀀 瘀愀氀椀搀愀琀椀漀渀 
  	  -- Check if the workflow step exists  ਀ऀ  䤀䘀 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 㴀 　 
		 SET @step_transitionid = NULL;਀ऀऀ䤀䘀 䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			BEGIN -- A workflow rule id has not been supplied.਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWorkflowStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE  ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀漀爀欀昀氀漀眀匀琀攀瀀䤀䐀⸀✀⤀㬀 
			END਀ 
	  ELSE -- Workflow step ID has been supplied.  Check if it exists. ਀ऀऀ 䈀䔀䜀䤀一  
			 IF NOT EXISTS (SELECT step_transition_id ਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀  
							 WHERE step_transition_id = @step_transitionid) ਀ऀऀऀऀ 䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀漀爀欀昀氀漀眀匀琀攀瀀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
				      SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ       䔀䰀匀䔀   
				      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WorkflowStepInvalid.');਀ऀऀऀऀ 䔀一䐀  
		 END  ਀ 
਀ 
 IF @transaction_ready = 'Ready'  ਀   䈀䔀䜀䤀一 
	BEGIN TRY਀     匀䔀䰀䔀䌀吀 
            wst.step_transition_id                AS 'Step Transition ID',਀            䤀匀一唀䰀䰀⠀眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开洀渀攀洀Ⰰ ✀✀⤀  䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
            wst.step_transition_name              AS 'Step Transition Name',਀ऀऀ    䤀匀一唀䰀䰀⠀眀猀琀⸀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀开搀攀猀挀爀Ⰰ ✀✀⤀ 䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
			wst.workflow_action_id                AS 'Action ID',਀ऀऀऀ眀愀⸀洀渀攀洀                               䄀匀 ✀䄀挀琀椀漀渀 䴀渀攀洀漀渀椀挀✀Ⰰ 
			wa.attr_name                          AS 'Action Name',਀ऀऀऀ䤀匀一唀䰀䰀⠀眀愀⸀搀攀猀挀爀Ⰰ ✀✀⤀                  䄀匀 ✀䄀挀琀椀漀渀 䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
		    wsd.model_step_order                  AS 'Step Order',਀ऀऀ    眀猀搀开琀漀⸀眀漀爀欀昀氀漀眀开洀漀搀攀氀开猀琀攀瀀开椀搀         䄀匀 ✀吀漀 匀琀攀瀀 䤀䐀✀ 
       FROM workflow_models.workflow_step_definitions AS wsd਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀猀 䄀匀 眀猀琀 
         ON   wsd.$node_id਀ऀऀ    㴀 眀猀琀⸀␀昀爀漀洀开椀搀 
 INNER JOIN workflow_models.workflow_step_definitions AS wsd_to ਀         伀一      眀猀琀⸀␀琀漀开椀搀  
		    = wsd_to.$node_id਀ 䤀一一䔀刀 䨀伀䤀一 眀漀爀欀昀氀漀眀开洀漀搀攀氀猀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀猀 䄀匀 眀愀 
         ON  wst.workflow_action_id਀ऀऀ    㴀 眀愀⸀眀漀爀欀昀氀漀眀开愀挀琀椀漀渀开椀搀 
      WHERE wst.step_transition_id ਀ऀ        㴀  䀀猀琀攀瀀开琀爀愀渀猀椀琀椀漀渀椀搀 
਀  ऀ  䤀䘀 䀀䀀刀伀圀䌀伀唀一吀 㴀 　 
	    BEGIN਀ऀ      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
               @message_id   = 'ZeroRecords', ਀               䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 娀攀爀漀刀攀挀漀爀搀猀⸀✀⤀㬀 
	    END਀ऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
           @message_id   = 'Success', ਀           䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	       IF @tempmessage IS NOT NULL ਀ऀ          匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	       ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
	  SET @transaction_status = 'Good';਀ 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀      䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
        @message_id   = 'SelectError', ਀        䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	  IF @tempmessage IS NOT NULL ਀ऀ     匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
	     CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀ  䔀䰀匀䔀 
		   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ䔀一䐀 䌀䄀吀䌀䠀 
  END -- END IF @transaction_ready = 'Ready'਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开砀爀攀昀开琀礀瀀攀猀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Lists all the cross reference types.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 氀椀猀琀 漀昀 爀攀挀漀爀搀 搀攀琀愀椀氀猀Ⰰ 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 愀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开匀䔀䰀开砀爀攀昀开琀礀瀀攀猀崀  
਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
		਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 猀攀氀攀挀琀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ      匀䔀䰀䔀䌀吀 
				 xrt.xref_type_id                AS 'Cross-Reference ID', ਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀砀爀琀⸀洀渀攀洀Ⰰ ✀✀⤀            䄀匀 ✀䴀渀攀洀漀渀椀挀✀Ⰰ 
				 ISNULL(xrt.attr_name, '')       AS 'Cross-Reference Name',਀ऀऀऀऀ 䤀匀一唀䰀䰀⠀砀爀琀⸀搀攀猀挀爀Ⰰ ✀✀⤀           䄀匀 ✀䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 
				 ISNULL(xrt.list_position, 0)    AS 'List Position'਀            䘀刀伀䴀 砀爀攀昀⸀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀 䄀匀 砀爀琀 
		ORDER BY 'List Position' ASC;਀ऀ         
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'SelectError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on SelectError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开戀爀开琀爀攀攀开渀洀开椀渀搀椀瘀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 04-10-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates the tag browsing tree name for the tag browsing tree linked to the connected user.਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开戀爀开琀爀攀攀开渀洀开椀渀搀椀瘀崀  
਀     䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 戀椀最椀渀琀     㴀 一唀䰀䰀Ⰰ 
	 @mnemonic nvarchar(10)           = NULL,਀ऀ 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㔀　⤀Ⰰ 
	 @description nvarchar(max)       = NULL,਀ऀ 䀀氀椀猀琀瀀漀猀椀琀椀漀渀 椀渀琀                㴀 一唀䰀䰀Ⰰ  
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀ 
	    @connectedusersid varbinary(100)        = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀                 㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@userauthentication_status nchar(10)    = 'Fail', -- The outcome of the authentication check of the user ਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀऀ 
		@transaction_ready nchar(10)            = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀倀愀猀猀✀㬀 
਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀ 
਀ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀ ✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀     ⴀⴀ䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 椀猀 爀攀最椀猀琀攀爀攀搀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀⸀  
			     IF NOT EXISTS਀ऀऀऀऀ               ⠀ 匀䔀䰀䔀䌀吀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  
					               FROM tagging.tag_browsing_tree_names AS tbtn਀ऀऀऀऀऀऀ     䤀一一䔀刀 䨀伀䤀一 甀猀攀爀开爀攀猀琀爀⸀猀椀搀开氀椀猀琀 䄀匀 猀氀 
									 ON  tbtn.sid_id਀ऀऀऀऀऀऀऀऀऀ    㴀  猀氀⸀猀椀搀开椀搀 
							  WHERE sl.sid = @connectedusersid਀ऀऀऀऀऀऀऀ    䄀一䐀 琀戀琀渀⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 㴀 䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
  							         )਀ऀऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 戀爀漀眀猀椀渀最 琀爀攀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
					   SET @data_validation_status = 'Fail';਀ऀऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
					   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䤀渀搀吀愀最䈀爀吀爀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
						  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀ   䔀䰀匀䔀  
				          SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on IndTagBrTrNotExist.');਀ऀऀऀऀऀ 䔀一䐀 
਀ 
	  -- Data validation਀ऀ  ⴀⴀ 䄀琀琀爀椀戀甀琀攀 渀愀洀攀 挀栀攀挀欀 
		IF @browsing_tree_name = ''਀ऀऀ   匀䔀吀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 㴀 一唀䰀䰀㬀 
		-- Attribute name must be unique਀ऀऀ䤀䘀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 渀愀洀攀  
		 			 FROM tagging.tag_browsing_tree_names ਀ऀऀऀऀऀ圀䠀䔀刀䔀 渀愀洀攀 㴀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀 
					  AND tag_browsing_tree_id਀ऀऀऀऀऀ      㰀㸀 䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀⤀  
			BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NameNotUnique', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䰀䔀䘀吀⠀䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀Ⰰ ㄀　⤀Ⰰ ✀✀⤀Ⰰ ✀⸀⸀⸀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一愀洀攀一漀琀唀渀椀焀甀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			END਀ 
	  -- Perform generic data validation checks.  (Does not require access to the table.) ਀ऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开洀渀攀洀开渀愀洀攀开搀攀猀挀爀 
			@mnem             = @mnemonic,਀ऀऀऀ䀀愀琀琀爀开渀愀洀攀        㴀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀Ⰰ 
			@descr            = @description,਀ऀऀऀ䀀搀愀琀愀开瘀愀氀渀开猀琀愀琀甀猀 㴀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀Ⰰ 
			@messg            = @validationmessage OUTPUT;਀ऀऀ䤀䘀 䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
			BEGIN਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀⤀㬀 
			END਀ 
਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀    䔀一䐀 ⴀⴀ 䔀渀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 倀愀猀猀 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀  
		    SET           mnem਀ऀऀऀ    㴀 䤀匀一唀䰀䰀⠀䀀洀渀攀洀漀渀椀挀Ⰰ ✀✀⤀Ⰰ  
				                 name਀ऀऀऀऀ㴀 䀀戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀Ⰰ   
				      descr਀ऀऀऀऀ㴀 䤀匀一唀䰀䰀⠀䀀搀攀猀挀爀椀瀀琀椀漀渀Ⰰ ✀✀⤀Ⰰ 
				 list_position਀ऀऀऀऀ㴀    䀀氀椀猀琀瀀漀猀椀琀椀漀渀 
		  WHERE tag_browsing_tree_id਀ऀऀ        㴀  䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
    END਀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开戀爀开琀爀攀攀开琀愀最崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 30-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Replaces the tag at a given tag browsing tree node.਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 昀漀爀 戀漀琀栀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀  
-- Input and output parameters are as declared below. ਀ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀猀 戀漀琀栀 昀漀爀 挀漀渀琀爀漀氀氀攀爀 愀渀搀 攀搀椀琀漀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_UPD_tag_br_tree_tag] ਀ 
     @tag_br_tree_node_id bigint      = NULL,਀     䀀渀攀眀开琀愀最椀搀 戀椀最椀渀琀                㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@tag_treeid bigint,਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
਀ऀ匀䔀吀 䀀琀愀最开琀爀攀攀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
	                     FROM tagging.tag_browsing_tree_nodes਀ऀ                    圀䠀䔀刀䔀    戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀  
	                          = @tag_br_tree_node_id)਀ 
	  -- Data validation਀ 
 -- Check the tag tree node ID਀ 䤀䘀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 㴀 　 
    SET @tag_br_tree_node_id = NULL;਀ 䤀䘀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 䤀匀 一唀䰀䰀 
 	    BEGIN਀ऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id   = 'NoNode', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀一漀搀攀✀⤀㬀 
				SET @data_validation_status = 'Fail';਀ऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		END਀  䔀䰀匀䔀 ⴀⴀ 䄀 渀漀搀攀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 椀昀 椀琀 攀砀椀猀琀猀⸀  
    BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
		                 FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @tag_br_tree_node_id)਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TreeNodeNotExist');		   ਀ऀऀऀऀऀ 䔀一䐀  
਀                 䔀䰀匀䔀 ⴀⴀ 䄀 瘀愀氀椀搀 渀漀搀攀 椀搀 攀砀椀猀琀猀⸀  
                   BEGIN         -- Check if the user has edit permission for the tag tree਀ऀऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开戀爀开琀爀攀攀崀 
						   @tag_brtreeid_ep = @tag_treeid,਀ऀऀऀऀऀऀ   䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @temp_userauth_status = 'Fail'਀ऀऀऀऀऀऀ  䈀䔀䜀䤀一 
							SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
							EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀倀攀爀洀✀Ⰰ  
								@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
								SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀऀ䔀䰀匀䔀  
								SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTreePerm.');਀ऀऀऀऀऀऀ  䔀一䐀 
					END਀ऀ   䔀一䐀 
਀   ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 渀攀眀 琀愀最 椀搀 
਀   ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 愀 琀愀最 眀愀猀 猀甀瀀瀀氀椀攀搀 
	  IF @new_tagid = 0 ਀ऀ    匀䔀吀 䀀渀攀眀开琀愀最椀搀 㴀 一唀䰀䰀㬀 
	  IF @new_tagid IS NULL਀ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagID');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 攀砀椀猀琀猀 
	  ELSE IF NOT EXISTS (SELECT tag_id਀ऀ                        䘀刀伀䴀 琀愀最最椀渀最⸀搀漀挀开琀愀最猀 
					       WHERE tag_id = @new_tagid)਀ऀऀ 䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT(@message, ' | ', CONVERT(nvarchar(10), @new_tagid), '  ', @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagIDNotExist');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ 䔀一䐀 
਀ऀऀ 䔀䰀匀䔀  ⴀⴀ 吀愀最 攀砀椀猀琀猀⸀  䌀栀攀挀欀 椀昀 琀栀攀 甀猀攀爀 栀愀猀 爀椀最栀琀猀 琀漀 攀搀椀琀 琀栀攀 琀愀最 
               -- Adding a tag to a relationship tree changes the tag function਀ऀ           ⴀⴀ 䠀攀渀挀攀 琀栀攀 甀猀攀爀 洀甀猀琀 栀愀瘀攀 攀搀椀琀 爀椀最栀琀猀 昀漀爀 琀栀攀 琀愀最 椀渀 漀爀搀攀爀 琀漀 愀搀搀 椀琀 琀漀 愀 琀爀攀攀⸀ 
			  BEGIN਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开攀搀椀琀崀 
					 @tag_id_ep = @new_tagid,਀ऀऀऀऀऀ 䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开琀愀最 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
				  IF @temp_userauth_status = 'Fail'਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀吀愀最倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
 						   SET @message = CONCAT(@message, ' | ', ISNULL(@username, '') + '  ' + @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagPermission');		   ਀ऀऀऀऀऀ 䔀一䐀 
			  END਀  
 ਀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 琀愀最 愀氀爀攀愀搀礀 攀砀椀猀琀猀 椀渀 琀栀攀 最椀瘀攀渀 琀愀最 爀攀氀愀琀椀漀渀猀栀椀瀀 琀爀攀攀 
   IF @data_validation_status = 'Pass'AND਀     䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
	           FROM tagging.tag_browsing_tree_nodes਀ऀऀऀ  圀䠀䔀刀䔀        琀愀最开椀搀 
			        = @new_tagid਀ऀऀऀ    䄀一䐀    琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀 
				    = @tag_treeid਀ऀऀऀऀ䄀一䐀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 琀愀最开椀搀 
				                 FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀऀऀऀऀ圀䠀䔀刀䔀  戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
								      = @tag_br_tree_node_id਀ऀऀऀऀऀऀऀऀ  䄀一䐀   琀愀最开椀搀 
								      = @new_tagid))਀ऀऀऀऀऀ 䈀䔀䜀䤀一 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀ        匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀吀愀最䐀甀瀀䤀渀吀爀攀攀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					       SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
						   SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on TagDupInTree');		   ਀ऀऀऀऀऀ 䔀一䐀 
਀  
		-- Output the data validation status failed message਀ऀऀ䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id   = 'FailedDataValidation', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			ELSE ਀ऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀⸀✀⤀㬀 
		END਀ऀऀⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
  END -- END IF @userauthentication_status = 'Pass'਀  
-- Execute the update query਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	  BEGIN TRY    ਀ऀऀऀ䈀䔀䜀䤀一 
			  UPDATE tagging.tag_browsing_tree_nodes਀ऀऀऀऀ 匀䔀吀        琀愀最开椀搀 
				     = @new_tagid਀ऀऀऀ   圀䠀䔀刀䔀   戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
			         =  @tag_br_tree_node_id਀ऀऀ    䔀一䐀 
਀         䌀伀䴀䴀䤀吀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
	        SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀ     䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success.');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
   	  END TRY਀ 
	  BEGIN CATCH਀ऀ  ऀ 䤀䘀 䀀䀀吀刀䄀一䌀伀唀一吀 㸀 　   
		    ROLLBACK TRANSACTION;਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀唀瀀搀愀琀攀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 唀瀀搀愀琀攀䔀爀爀漀爀⸀✀⤀㬀 
	  END CATCH਀    
	END -- END  IF @transaction_ready = 'Ready'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reading].[usp_UPD_tag_browsing_tree_node]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㌀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀 渀漀搀攀 琀漀 洀漀瘀攀 椀琀 琀漀 愀 搀椀昀昀攀爀攀渀琀 渀漀搀攀⸀ 
-- Authenticates for both controller, editor and reader. ਀ⴀⴀ 䤀渀瀀甀琀 愀渀搀 漀甀琀瀀甀琀 瀀愀爀愀洀攀琀攀爀猀 愀爀攀 愀猀 搀攀挀氀愀爀攀搀 戀攀氀漀眀⸀  
-- Authenticates both for controller and editor.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ 
-- =============================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀崀  
਀     䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 戀椀最椀渀琀        㴀 一唀䰀䰀Ⰰ 
     @new_parentid bigint               = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀            㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50)   = NULL OUTPUT,਀ऀ 䀀渀攀眀渀漀搀攀 渀瘀愀爀挀栀愀爀⠀㐀　　　⤀            㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀        㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)                 = ORIGINAL_LOGIN(),     -- The username ਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@temp_userauth_status nchar(10)         = 'Fail',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀        㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
        @tempmessage nvarchar(300)              = '',਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀✀Ⰰऀ 
		@tag_browsing_treeid bigint,਀        䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
        @new_parent_hierarchyid hierarchyid,਀ऀऀ䀀渀攀眀开猀椀戀氀椀渀最开栀椀攀爀愀爀挀栀礀椀搀 栀椀攀爀愀爀挀栀礀椀搀Ⰰ 
		@new_hierarchyid hierarchyid,	਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀            㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)       = 'Pass';਀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
਀ 
-- Connected user authentication਀ ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Controller',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀䔀搀椀琀漀爀✀Ⰰ 
		@user_authentication_result = @temp_userauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Reader',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @temp_userauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀ ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀ ⬀ ✀  ✀ ⬀ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
	  SET @tag_browsing_treeid = (SELECT tag_browsing_tree_id਀ऀ                                䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
								   WHERE        browsing_tree_node_id ਀ऀऀऀऀऀऀऀऀ         㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀ 
਀ ⴀⴀ 䌀栀攀挀欀 琀栀攀 琀愀最 琀爀攀攀 渀漀搀攀 䤀䐀 
 IF @tag_br_tree_node_id = 0਀    匀䔀吀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀 㴀 一唀䰀䰀㬀 
 IF @tag_br_tree_node_id IS NULL਀ ऀ    䈀䔀䜀䤀一 
				EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀一漀搀攀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀ऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoNode');਀ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				SET @transaction_ready      = 'Fail';਀ऀऀ䔀一䐀 
  ELSE -- A node ID has been supplied.  Check if it exists. ਀    䈀䔀䜀䤀一 
	     IF NOT EXISTS(SELECT browsing_tree_node_id਀ऀऀ                 䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
						WHERE   browsing_tree_node_id਀ऀऀऀऀऀऀ      㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'TreeNodeNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 吀爀攀攀一漀搀攀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀                 䔀䰀匀䔀 ⴀⴀ 䄀 瘀愀氀椀搀 渀漀搀攀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 爀椀最栀琀猀 昀漀爀 琀栀攀 琀爀攀攀⸀  
				  BEGIN਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开琀愀最开戀爀开琀爀攀攀崀 
					   @tag_brtreeid_ep = @tag_browsing_treeid,਀ऀऀऀऀऀ   䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开戀琀 㴀 䀀琀攀洀瀀开甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
					IF @temp_userauth_status = 'Fail'਀ऀऀऀऀऀ  䈀䔀䜀䤀一 
						SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀吀愀最吀爀攀攀倀攀爀洀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoTagTreePerm.');਀ 
					  END਀ऀऀऀऀऀ䔀一䐀 
	END਀ 
਀  ⴀⴀ 嘀愀氀椀搀愀琀攀 琀栀攀 瀀愀爀攀渀琀 䤀䐀 
    IF @new_parentid = 0਀ऀ    匀䔀吀 䀀渀攀眀开瀀愀爀攀渀琀椀搀 㴀 一唀䰀䰀㬀 
	IF @new_parentid IS NULL਀ऀ   䈀䔀䜀䤀一 
	    -- Check if a root node already exists for this tag tree਀ऀऀ  䤀䘀 䔀堀䤀匀吀匀⠀ 
		       SELECT tag_browsing_tree_id਀ऀऀऀ     䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
				WHERE    tag_browsing_tree_id਀ऀऀऀऀ      㴀 䀀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀椀搀 
				  AND browsing_tree_hierarchyid = hierarchyid::GetRoot()਀ऀऀऀऀ  ⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'RootNodeExists', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀漀漀琀一漀搀攀䔀砀椀猀琀猀✀⤀㬀ऀऀ    
					 END਀ऀ   䔀一䐀 
	ELSE -- A parent id has been supplied.  NULL is permitted and will be stored as root if a root does not already exist.਀ऀ     ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 瀀愀爀攀渀琀 䤀䐀 攀砀椀猀琀猀 昀漀爀 琀栀愀琀 琀爀攀攀 䤀䐀 
	   BEGIN਀ऀ     䤀䘀 一伀吀 䔀堀䤀匀吀匀⠀匀䔀䰀䔀䌀吀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
		                 FROM tagging.tag_browsing_tree_nodes਀ऀऀऀऀऀऀ圀䠀䔀刀䔀   戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 
						      = @new_parentid਀ऀऀऀऀऀऀ  䄀一䐀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开椀搀  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 渀攀眀 瀀愀爀攀渀琀 椀搀 椀猀 漀渀 琀栀攀 猀愀洀攀 琀爀攀攀 
						      = (SELECT tag_browsing_tree_id਀ऀऀऀऀऀऀ           䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
								  WHERE        browsing_tree_node_id਀ऀऀऀऀऀऀऀऀ        㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀⤀⤀ 
					 BEGIN਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				        SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id   = 'ParentNotExist', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
						IF (@tempmessage IS NOT NULL) ਀  ऀऀऀऀऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀ   匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 倀愀爀攀渀琀一漀琀䔀砀椀猀琀✀⤀㬀ऀऀ    
					 END ਀ 
	   END਀ऀ   
	  -- Check if the new node is a descendant of the existing਀ऀऀ匀䔀䰀䔀䌀吀 䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 㴀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
		  FROM tagging.tag_browsing_tree_nodes਀ऀऀ 圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀㬀 
਀ऀऀ匀䔀䰀䔀䌀吀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀 㴀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 
		  FROM tagging.tag_browsing_tree_nodes਀ऀऀ 圀䠀䔀刀䔀 戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀开椀搀 㴀 䀀渀攀眀开瀀愀爀攀渀琀椀搀㬀 
਀             䤀䘀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䤀猀䐀攀猀挀攀渀搀愀渀琀伀昀⠀䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⤀ 㴀 ㄀  
             BEGIN ਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'NodeIsDescendant', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀搀攀䤀猀䐀攀猀挀攀渀搀愀渀琀⸀✀⤀㬀 
             END਀ 
 ਀ऀऀⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
		IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
			EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀ऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ䔀䰀匀䔀  
				SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation.');਀ऀऀ䔀一䐀 
		-- End data validation਀  䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
 ਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 甀瀀搀愀琀攀 焀甀攀爀礀 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRANSACTION;਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	    SELECT @current_hierarchyid = browsing_tree_hierarchyid਀ऀऀ  䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
		 WHERE        browsing_tree_node_id਀ऀऀ       㴀 䀀琀愀最开戀爀开琀爀攀攀开渀漀搀攀开椀搀㬀 
਀             䤀䘀 䀀渀攀眀开瀀愀爀攀渀琀椀搀 䤀匀 一唀䰀䰀 
             BEGIN਀                 ⴀⴀ 䴀漀瘀攀 琀漀 爀漀漀琀 氀攀瘀攀氀 
                 SET @new_hierarchyid = hierarchyid::GetRoot();਀             䔀一䐀 
             ELSE਀             䈀䔀䜀䤀一 
				 SELECT @new_parent_hierarchyid = browsing_tree_hierarchyid ਀ऀऀऀऀ   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
				  WHERE browsing_tree_node_id = @new_parentid; ਀                 ⴀⴀ 䜀攀渀攀爀愀琀攀 渀攀眀 栀椀攀爀愀爀挀栀礀 椀搀 愀猀 挀栀椀氀搀 漀昀 渀攀眀 瀀愀爀攀渀琀 
                 SELECT @new_sibling_hierarchyid = MAX(browsing_tree_hierarchyid)  ਀                   䘀刀伀䴀 琀愀最最椀渀最⸀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 
                  WHERE browsing_tree_hierarchyid.IsDescendantOf(@new_parent_hierarchyid) = 1਀                    䄀一䐀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䰀攀瘀攀氀⠀⤀ 㴀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䰀攀瘀攀氀⠀⤀ ⬀ ㄀㬀 
਀                 匀䔀吀 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀 㴀 䀀渀攀眀开瀀愀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀䐀攀猀挀攀渀搀愀渀琀⠀䀀渀攀眀开猀椀戀氀椀渀最开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 一唀䰀䰀⤀㬀 
             END਀ 
			IF NOT (@new_parent_hierarchyid IS NOT NULL AND @current_hierarchyid.GetAncestor(1) = @new_parent_hierarchyid)਀ऀऀऀ䈀䔀䜀䤀一 
				UPDATE tagging.tag_browsing_tree_nodes਀ऀऀऀऀ匀䔀吀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀 㴀 戀爀漀眀猀椀渀最开琀爀攀攀开栀椀攀爀愀爀挀栀礀椀搀⸀䜀攀琀刀攀瀀愀爀攀渀琀攀搀嘀愀氀甀攀⠀䀀挀甀爀爀攀渀琀开栀椀攀爀愀爀挀栀礀椀搀Ⰰ 䀀渀攀眀开栀椀攀爀愀爀挀栀礀椀搀⤀ 
				WHERE browsing_tree_hierarchyid.IsDescendantOf(@current_hierarchyid) = 1;਀ 
				SET @newnode = @new_hierarchyid.ToString();਀ऀऀऀ䔀一䐀 
			ELSE  SET @newnode = @current_hierarchyid.ToString();਀ 
         COMMIT TRANSACTION;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀ऀ        匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	     ELSE ਀ऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀⸀✀⤀㬀 
		 SET @transaction_status = 'Good';਀   ऀ  䔀一䐀 吀刀夀 
਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	  	 IF @@TRANCOUNT > 0  ਀ऀऀ    刀伀䰀䰀䈀䄀䌀䬀 吀刀䄀一匀䄀䌀吀䤀伀一㬀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		      SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError.');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
   ਀ऀ䔀一䐀 ⴀⴀ 䔀一䐀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀愀搀椀渀最崀⸀嬀甀猀瀀开嘀䄀䰀䤀䐀䄀吀䔀开搀漀挀甀洀攀渀琀开椀搀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 06-08-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䌀栀攀挀欀猀 眀栀攀琀栀攀爀 愀 猀甀瀀瀀氀椀攀搀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 瘀愀氀椀搀 漀爀 渀漀琀⸀  
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema, stored procedures and functions are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reading].[usp_VALIDATE_document_id] ਀ 
      @documentid nvarchar(50)         = NULL,਀      䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 一唀䰀䰀 伀唀吀倀唀吀Ⰰ 
      @transaction_status nvarchar(50) = NULL OUTPUT,਀ऀ  䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀  㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
 DECLARE਀ 
	    @connectedusersid varbinary(100)   = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀            㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀      
	    @tempmessage nvarchar(300)         = '',਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
	    @docauthenticationstatus nchar(10) = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                          ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
	    @transaction_ready nchar(10)       = 'Ready',਀ऀ    䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀倀愀猀猀✀㬀 
਀䈀䔀䜀䤀一 吀刀夀 
  -- Document id validation਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 㴀 ✀✀ 
		 SET @documentid = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 搀漀挀 椀搀 攀砀椀猀琀猀⸀  䘀愀椀氀 椀昀 椀琀 搀漀攀猀渀✀琀⸀ 
	   -- Check if a doc id was supplied.਀ऀ  䤀䘀 䀀搀漀挀甀洀攀渀琀椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			 SET @transaction_ready      = 'Fail';਀ऀऀऀ 匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀      㴀 ✀䘀愀椀氀✀㬀 
			 EXEC internal.usp_SEL_message ਀ऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䐀漀挀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
			 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE  ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䐀漀挀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䐀漀挀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check if it exists and the user has permission to access the document਀ऀऀ   䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开搀漀挀开椀搀崀  
 	            @doc_id_to_check =  @documentid,਀ऀ            䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
		   SET @validation_result   = @docauthenticationstatus;਀ऀऀ   䤀䘀 䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
				 BEGIN -- Doc id does not exist or the user does not have permission to access it਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END	਀ऀऀऀ 䔀䰀匀䔀 
				 BEGIN -- Doc id is valid਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'DocIdIsValid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF @tempmessage IS NOT NULL ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			       ELSE  ਀ऀऀऀऀ      匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䐀漀挀䤀搀䤀猀嘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀ 䔀一䐀 
		 	  EXEC internal.usp_SEL_message ਀           䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
           @message_text = @tempmessage OUTPUT;਀  ऀ       䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀ  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
	END TRY਀ऀ䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
      SET @transaction_status = 'Bad';਀ऀ  匀䔀吀 䀀瘀愀氀椀搀愀琀椀漀渀开爀攀猀甀氀琀  㴀 ✀䘀愀椀氀✀㬀 
      EXEC internal.usp_SEL_message ਀        䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀攀氀攀挀琀䔀爀爀漀爀✀Ⰰ  
        @message_text = @tempmessage OUTPUT;਀ऀ  䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
	    SET @message = CONCAT_WS(' | ', @message, @tempmessage,  ਀ऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
	  ELSE਀ऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀攀氀攀挀琀䔀爀爀漀爀✀⤀㬀 
	END CATCH਀ 
	SET @validation_result = RTRIM(@validation_result);਀   
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀瘀椀攀眀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀昀开昀甀渀挀琀开漀甀琀瀀甀琀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Inserts a record into workflow_instances.workflow_function_output_files to create a new record of output files for a given function and step.  ਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reviewing].[usp_INS_wf_funct_output_file] ਀ 
     @fileid bigint                   = NULL,    ਀ऀ 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @functionid bigint               = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@fileauthenticationstatus nchar(10)  = '',     -- Status of authorisation for the connected user to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀ 
  IF @userauthentication_status = 'Fail'਀    䈀䔀䜀䤀一  ⴀⴀ 吀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀椀猀 愀挀琀椀漀渀 
		SET @transaction_ready      = 'Fail';਀ऀ    䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
            @message_id   = 'NoPermission', ਀ऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
	    IF (@tempmessage IS NOT NULL) ਀  ऀ       匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䤀匀一唀䰀䰀⠀䀀甀猀攀爀渀愀洀攀Ⰰ ✀✀⤀Ⰰ ✀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
	    ELSE ਀ऀऀ   匀䔀吀  䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀洀椀猀猀椀漀渀⸀✀⤀㬀 
	END਀ 
  IF @userauthentication_status = 'Pass' -- Don't do anything if the user is not authorised.਀    䈀䔀䜀䤀一 
	  -- Data validation਀ 
		  -- Check that a file id was supplied਀ऀऀ  䤀䘀 ⠀䀀昀椀氀攀椀搀 䤀匀 一唀䰀䰀 伀刀 䀀昀椀氀攀椀搀 㴀 　⤀  
			 BEGIN਀ऀऀऀऀ 匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				 SET @transaction_ready      = 'Fail';਀ऀऀऀऀ 䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					  @message_id = 'NoFileID', @message_text = @tempmessage OUTPUT;਀ऀऀऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ 䔀䰀匀䔀   
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFileID.');਀ऀऀऀ 䔀一䐀 
		  ELSE  -- File id has been supplied਀ऀऀऀऀ䈀䔀䜀䤀一  ऀⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀椀氀攀 䤀䐀 攀砀椀猀琀猀 愀渀搀 琀栀攀 甀猀攀爀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 琀栀攀 昀椀氀攀 
					EXEC [internal].[usp_AUTHENTICATE_file_ed_perm] ਀ ऀऀऀऀऀऀ䀀昀椀氀攀开椀搀开琀漀开挀栀攀挀欀开攀瀀 㴀  䀀昀椀氀攀椀搀Ⰰ 
						@user_authentication_result_fep = @fileauthenticationstatus OUTPUT;਀ऀऀऀऀऀऀ䤀䘀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
							BEGIN -- File id does not exist or the user does not have permission to access it਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
								SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
									@message_id = 'NoFileIDAccess', ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  								IF @tempmessage IS NOT NULL ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ ✀䘀椀氀攀 䤀䐀㨀 ✀Ⰰ 䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㈀　⤀Ⰰ 䀀昀椀氀攀椀搀⤀Ⰰ ✀⸀  ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
								ELSE ਀ऀऀऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀䄀挀挀攀猀猀⸀✀⤀㬀 
							END਀ऀऀऀऀ䔀一䐀 
		 -- End checking the file id਀ 
	  IF @instance_step_id = 0਀ऀऀ 匀䔀吀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an instance step id was supplied.਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the instance step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
							  FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
							       =       @instance_step_id ) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀऀऀ 䔀一䐀 
			 ELSE -- The record exists.  Check that the use has permission for it, in relation to the linked document. ਀ऀऀऀऀ䈀䔀䜀䤀一 
				EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
					@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀऀऀ 䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
					BEGIN਀ऀऀ ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
		 END਀ 
	  -- Check the duty function id਀ऀ  䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 㴀 　  
	     SET @functionid = NULL;਀      䤀䘀 䀀昀甀渀挀琀椀漀渀椀搀 䤀匀 一唀䰀䰀 
			 BEGIN਀ऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			   SET @transaction_ready      = 'Fail';਀ऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
					@message_id = 'NoFunctionID', ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  			   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
			   ELSE ਀ऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ    ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 昀甀渀挀琀椀漀渀 椀搀 攀砀椀猀琀猀 
			IF NOT EXISTS (SELECT function_id਀ऀऀऀ                 䘀刀伀䴀 瀀攀漀瀀氀攀⸀搀甀琀礀开昀甀渀挀琀椀漀渀猀 
							WHERE function_id = @functionid)਀ऀऀऀऀ 䈀䔀䜀䤀一 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FunctionIDNotExist.');਀ऀऀऀऀ 䔀一䐀 
਀ऀऀ  
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
		  WHERE    file_id਀ऀऀ        㴀 䀀昀椀氀攀椀搀ऀऀ   
		    AND workflow_instance_step_id ਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND    function_id ਀ऀऀऀऀ㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
-- Check that there is a matching record of workflow instance step id and function id in workflow_instances.workflow_step_duty_functions਀    䤀䘀 一伀吀 䔀堀䤀匀吀匀 
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 
		  WHERE workflow_instance_step_id ਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND    function_id ਀ऀऀऀऀ㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀  
		BEGIN -- The person is not linked to the workflow step਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NoFunctionStepLink',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀匀琀攀瀀䰀椀渀欀⸀✀⤀㬀 
		END਀   䔀一䐀  ⴀⴀ䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 愀昀琀攀爀 椀渀椀琀椀愀氀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀ 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 椀渀猀攀爀琀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     INSERT INTO workflow_instances.workflow_function_output_files਀ऀऀ             ⠀ 昀椀氀攀开椀搀Ⰰ 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ  昀甀渀挀琀椀漀渀开椀搀⤀ 
		      VALUES (@fileid,          @instance_step_id, @functionid); ਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'InsertError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on InsertError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reviewing].[usp_INS_wf_people_output_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 䤀渀猀攀爀琀猀 愀 爀攀挀漀爀搀 椀渀琀漀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 琀漀 挀爀攀愀琀攀 愀 渀攀眀 爀攀挀漀爀搀 漀昀 漀甀琀瀀甀琀 昀椀氀攀猀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 愀渀搀 猀琀攀瀀⸀   
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀瘀椀攀眀椀渀最崀⸀嬀甀猀瀀开䤀一匀开眀昀开瀀攀漀瀀氀攀开漀甀琀瀀甀琀开昀椀氀攀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ     
	 @instance_step_id bigint         = NULL,਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
	    @sidid bigint,                                 -- The user id਀ऀऀ䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀  㴀 ✀✀Ⰰ     ⴀⴀ 匀琀愀琀甀猀 漀昀 愀甀琀栀漀爀椀猀愀琀椀漀渀 昀漀爀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 琀漀 愀挀挀攀猀猀 琀栀攀 昀椀氀攀 
		                                               -- or alternatively if the file does not exist.  The result does not distinguish either.਀ऀ    䀀瘀愀氀椀搀愀琀椀漀渀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㈀　　⤀     㴀 ✀✀Ⰰ ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 琀栀愀琀 琀栀攀 琀爀愀渀猀愀挀琀椀漀渀 昀愀椀氀攀搀 搀甀攀 琀漀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
		@userauthentication_status nchar(10) = 'Fail', -- The outcome of the authentication check of the user ਀ऀऀ䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 渀瘀愀爀挀栀愀爀⠀㄀　⤀     㴀 ✀倀愀猀猀✀Ⰰ ⴀⴀ 刀攀猀甀氀琀 漀昀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀 昀漀爀 琀栀攀 最椀瘀攀渀 漀戀樀攀挀琀⸀  
		@docauthenticationstatus nchar(10)   = '',  -- Communicates if the user is not authorised to access the document਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 搀漀挀甀洀攀渀琀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀  
		@tempvalidationstatus nchar(10)      = '',਀ऀऀ䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 渀挀栀愀爀⠀㄀　⤀         㴀 ✀刀攀愀搀礀✀Ⰰ 
		@data_validation_status nchar(10)    = 'Pass';਀ 
	਀  ⴀⴀ 倀愀爀愀洀攀琀攀爀猀 眀栀椀挀栀 栀愀瘀攀 戀攀攀渀 椀渀椀琀椀愀氀椀猀攀搀 愀琀 搀攀挀氀愀爀愀琀椀漀渀 戀甀琀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 猀攀琀 洀椀最栀琀 戀攀 漀甀琀瀀甀琀 愀猀 渀甀氀氀 琀漀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀猀⸀ 
  SET @transaction_status = 'Transaction not attempted';  ਀  
  -- Connected user authentication਀  ⴀⴀ 䄀甀琀栀攀渀琀椀挀愀琀攀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 昀漀爀 琀栀攀 爀漀氀攀 
਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@fileid IS NULL OR @fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
		 SET @instance_step_id = NULL;਀ऀ   ⴀⴀ 䌀栀攀挀欀 椀昀 愀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀⸀ 
	  IF @instance_step_id IS NULL਀ऀऀ 䈀䔀䜀䤀一 
		   SET @data_validation_status = 'Fail';਀ऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
		   EXEC internal.usp_SEL_message ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀✀Ⰰ  
				@message_text = @tempmessage OUTPUT;਀  ऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
			  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ   䔀䰀匀䔀  
			  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoWfInstanceStepID.');਀ऀऀ 䔀一䐀 
	  ELSE -- An instance step id has been supplied਀ऀऀ 䈀䔀䜀䤀一  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 攀砀椀猀琀猀 
			 IF NOT EXISTS (SELECT workflow_instance_step_id਀ऀऀऀऀऀऀऀ  䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀猀 
							 WHERE workflow_instance_step_id = @instance_step_id ) ਀ऀऀऀऀ 䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
				   SET @data_validation_status = 'Fail';਀ऀऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀✀Ⰰ  
						@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ   䔀䰀匀䔀  
					  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WfInstStepIdInvalid.');਀ऀऀऀऀ 䔀一䐀 
		 ELSE -- The record exists.  Check that the user has permission for it, in relation to the linked document. ਀ऀऀऀ䈀䔀䜀䤀一 
			EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
				@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀऀ 䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
				BEGIN਀ऀऀ ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
					SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
					ELSE ਀ऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
				END਀ऀऀऀ䔀一䐀 
		 END਀ 
-- Check that there is a matching record of workflow instance step id and person id in workflow_instances.workflow_step_participant਀ 
	 -- Retrieve the sidid਀ऀऀ  匀䔀吀 䀀猀椀搀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			              FROM user_restr.sid_list AS sl਀ऀऀऀ  ऀऀ     圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ऀऀ  
		 ਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	 IF EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀瀀漀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_person_output_files AS wpof਀ऀऀ  圀䠀䔀刀䔀 眀瀀漀昀⸀昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀瀀漀昀⸀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =            @instance_step_id਀ऀऀ    䄀一䐀 眀瀀漀昀⸀猀椀搀开椀搀  
				=   @sidid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀ䔀一䐀 
਀ 
਀    䤀䘀 一伀吀 䔀堀䤀匀吀匀 
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 
		  WHERE workflow_instance_step_id ਀ऀऀ        㴀            䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND      sid_id ਀ऀऀऀऀ㴀   䀀猀椀搀椀搀⤀  
		BEGIN -- The person is not linked to the workflow step਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NoPersonStepLink',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀倀攀爀猀漀渀匀琀攀瀀䰀椀渀欀⸀✀⤀㬀 
		END਀   䔀一䐀  ⴀⴀ䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 愀昀琀攀爀 椀渀椀琀椀愀氀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀ 
਀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ 
-- Execute the insert query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     䤀一匀䔀刀吀 䤀一吀伀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
		             ( file_id, workflow_instance_step_id, sid_id)਀ऀऀ      嘀䄀䰀唀䔀匀 ⠀䀀昀椀氀攀椀搀Ⰰ          䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 䀀猀椀搀椀搀⤀㬀  
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀匀甀挀挀攀猀猀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀  ऀ     䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on Success');਀ऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䜀漀漀搀✀㬀 
਀   ऀ  䔀一䐀 吀刀夀 
	  BEGIN CATCH਀ऀ     匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䈀愀搀✀㬀 
         EXEC internal.usp_SEL_message ਀              䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䤀渀猀攀爀琀䔀爀爀漀爀✀Ⰰ  
              @message_text = @tempmessage OUTPUT;਀ऀऀ 䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
		    SET @message = CONCAT(@message, ' | ', @tempmessage, ' | ', ਀ऀऀ    䌀伀一嘀䔀刀吀⠀渀瘀愀爀挀栀愀爀⠀㄀　⤀Ⰰ䔀刀刀伀刀开一唀䴀䈀䔀刀⠀⤀⤀Ⰰ ✀ 簀 ✀Ⰰ 䔀刀刀伀刀开䴀䔀匀匀䄀䜀䔀⠀⤀⤀㬀 
		 ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䤀渀猀攀爀琀䔀爀爀漀爀✀⤀㬀 
	  END CATCH਀  
਀   䔀一䐀 ⴀⴀ 䔀一䐀 䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
਀ 䔀一䐀 ⴀⴀ 䔀渀搀 䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀 㴀 ✀倀愀猀猀✀ 
਀䔀一䐀 
GO਀⼀⨀⨀⨀⨀⨀⨀ 伀戀樀攀挀琀㨀  匀琀漀爀攀搀倀爀漀挀攀搀甀爀攀 嬀爀攀瘀椀攀眀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀昀开昀甀渀挀琀开漀甀琀瀀甀琀开昀椀氀攀崀    匀挀爀椀瀀琀 䐀愀琀攀㨀 䴀漀渀 ㈀㌀ⴀ　㌀ⴀ㈀　㈀㘀 㔀㨀㄀㜀㨀㐀㈀ 倀䴀 ⨀⨀⨀⨀⨀⨀⼀ 
SET ANSI_NULLS ON਀䜀伀 
SET QUOTED_IDENTIFIER ON਀䜀伀 
-- =============================================਀ⴀⴀ 䄀甀琀栀漀爀㨀ऀऀ匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 
-- Create date: 10-09-2024਀ⴀⴀ 䐀攀猀挀爀椀瀀琀椀漀渀㨀ऀ䤀渀椀琀椀愀氀 挀爀攀愀琀椀漀渀 
-- Updates a record from workflow_instances.workflow_function_output_files.  ਀ⴀⴀ 䄀氀氀 漀氀搀 愀渀搀 渀攀眀 瀀愀爀愀洀攀琀攀爀猀 洀甀猀琀 戀攀 猀攀渀琀⸀ 
-- Output is a status message and transaction status.  ਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024਀⨀⼀ 
-- =========================================================਀䌀刀䔀䄀吀䔀 倀刀伀䌀䔀䐀唀刀䔀 嬀爀攀瘀椀攀眀椀渀最崀⸀嬀甀猀瀀开唀倀䐀开眀昀开昀甀渀挀琀开漀甀琀瀀甀琀开昀椀氀攀崀  
਀     䀀昀椀氀攀椀搀 戀椀最椀渀琀                   㴀 一唀䰀䰀Ⰰ     
	 @instance_step_id bigint         = NULL,਀ऀ 䀀昀甀渀挀琀椀漀渀椀搀 戀椀最椀渀琀               㴀 一唀䰀䰀Ⰰ  
	 @new_fileid bigint               = NULL,    ਀ऀ 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀     㴀 一唀䰀䰀Ⰰ 
	 @new_functionid bigint           = NULL, ਀ऀ 䀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㄀　　　⤀          㴀 ✀✀ 伀唀吀倀唀吀Ⰰ 
	 @transaction_status nvarchar(50) = NULL OUTPUT਀ 
਀䄀匀 
BEGIN਀ऀⴀⴀ 匀䔀吀 一伀䌀伀唀一吀 伀一 愀搀搀攀搀 琀漀 瀀爀攀瘀攀渀琀 攀砀琀爀愀 爀攀猀甀氀琀 猀攀琀猀 昀爀漀洀 
	-- interfering with SELECT statements.਀ऀ匀䔀吀 一伀䌀伀唀一吀 伀一㬀 
਀  䐀䔀䌀䰀䄀刀䔀  
        @tempmessage nvarchar(300)           = '',਀ऀऀ䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀       㴀 ✀✀Ⰰ 
	    @connectedusersid varbinary(100)     = SUSER_SID(ORIGINAL_LOGIN()),   -- The SID of the connected user਀ऀ    䀀甀猀攀爀渀愀洀攀 渀瘀愀爀挀栀愀爀⠀㄀㔀　⤀              㴀 伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀Ⰰ     ⴀⴀ 吀栀攀 甀猀攀爀渀愀洀攀  
		@fileauthenticationstatus nchar(10)  = '',     -- Status of authorisation for the connected user to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling functions.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@new_fileid IS NULL OR @new_fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @new_fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @new_fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
		 -- Check the instance step id਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
		 SET @instance_step_id = NULL;਀ 
			-- Check that the use has permission for it, in relation to the linked document. ਀ऀऀऀऀ䈀䔀䜀䤀一 
				EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
					@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀऀऀ 䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
					BEGIN਀ऀऀ ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
		 -- End checking the instance step id਀ 
		 -- Check the new instance step id.਀ 
	  IF @new_instance_step_id = 0਀ऀऀ 匀䔀吀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an instance step id was supplied.਀ऀ  䤀䘀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the instance step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
							  FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 ⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
				BEGIN਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
					@instance_step_to_check = @new_instance_step_id,਀ऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
				 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 
		 				SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ 䔀一䐀 
਀ऀ  ⴀⴀ 䌀栀攀挀欀 琀栀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 椀搀 
	  IF @new_functionid = 0਀ऀ     匀䔀吀 䀀渀攀眀开昀甀渀挀琀椀漀渀椀搀 㴀 一唀䰀䰀㬀 
      IF @new_functionid IS NULL਀ऀऀऀ 䈀䔀䜀䤀一 
			   SET @data_validation_status = 'Fail';਀ऀऀऀ   匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			   EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀䤀䐀✀Ⰰ  
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀ   䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
				  SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀ   䔀䰀匀䔀  
				  SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionID.');਀ऀऀऀ 䔀一䐀 
		    -- Check if the function id exists਀ऀऀऀ䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 昀甀渀挀琀椀漀渀开椀搀 
			                 FROM people.duty_functions਀ऀऀऀऀऀऀऀ圀䠀䔀刀䔀 昀甀渀挀琀椀漀渀开椀搀 㴀 䀀渀攀眀开昀甀渀挀琀椀漀渀椀搀⤀ 
				 BEGIN਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'FunctionIDNotExist', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀甀渀挀琀椀漀渀䤀䐀一漀琀䔀砀椀猀琀⸀✀⤀㬀 
				 END਀ 
		 ਀ 
	 -- Check if the record exists਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀  
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
		  WHERE    file_id਀ऀऀ        㴀 䀀昀椀氀攀椀搀ऀऀ   
		    AND workflow_instance_step_id ਀ऀऀ        㴀       䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND    function_id ਀ऀऀऀऀ㴀 䀀昀甀渀挀琀椀漀渀椀搀⤀ 
		BEGIN -- Record does not exist਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NotExist',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀琀䔀砀椀猀琀⸀✀⤀㬀 
		END਀  䔀一䐀 
਀  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 
   BEGIN਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 愀 搀甀瀀氀椀挀愀琀攀 爀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
	 IF EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_function_output_files਀ऀऀ  圀䠀䔀刀䔀        昀椀氀攀开椀搀 
		        = @new_fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =   @new_instance_step_id਀ऀऀ    䄀一䐀        昀甀渀挀琀椀漀渀开椀搀  
				= @new_functionid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 愀氀爀攀愀搀礀 攀砀椀猀琀猀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀刀攀挀漀爀搀䔀砀椀猀琀猀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on RecordExists.');਀ऀऀ䔀一䐀 
਀ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 琀栀攀爀攀 椀猀 愀 洀愀琀挀栀椀渀最 爀攀挀漀爀搀 漀昀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 愀渀搀 昀甀渀挀琀椀漀渀 椀搀 椀渀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开搀甀琀礀开昀甀渀挀琀椀漀渀猀 
    IF NOT EXISTS਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_step_duty_functions਀ऀऀ  圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =       @new_instance_step_id਀ऀऀ    䄀一䐀    昀甀渀挀琀椀漀渀开椀搀  
				= @new_functionid) ਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 吀栀攀 瀀攀爀猀漀渀 椀猀 渀漀琀 氀椀渀欀攀搀 琀漀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀甀渀挀琀椀漀渀匀琀攀瀀䰀椀渀欀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NoFunctionStepLink.');਀ऀऀ䔀一䐀 
   END  --END IF @data_validation_status = 'Pass' after initial validation checks.਀ 
	  -- Output the data validation status failed message਀ऀ  䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
		BEGIN਀ऀऀ  䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
			   @message_id   = 'FailedDataValidation', ਀ऀऀऀ   䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		  IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀⤀㬀 
		END਀  ⴀⴀ 䔀渀搀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ 
-- Execute the delete query਀ 
  IF @transaction_ready = 'Ready'਀ऀ䈀䔀䜀䤀一 
	  BEGIN TRY਀ऀ     唀倀䐀䄀吀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
		    SET file_id                   = @new_fileid,਀ऀऀऀ    眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ      
				function_id               = @new_functionid਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =       @instance_step_id਀ऀऀ    䄀一䐀    昀甀渀挀琀椀漀渀开椀搀  
				= @functionid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
/****** Object:  StoredProcedure [reviewing].[usp_UPD_wf_people_output_file]    Script Date: Mon 23-03-2026 5:17:42 PM ******/਀匀䔀吀 䄀一匀䤀开一唀䰀䰀匀 伀一 
GO਀匀䔀吀 儀唀伀吀䔀䐀开䤀䐀䔀一吀䤀䘀䤀䔀刀 伀一 
GO਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
-- Author:		Silkwood Software਀ⴀⴀ 䌀爀攀愀琀攀 搀愀琀攀㨀 ㄀　ⴀ　㤀ⴀ㈀　㈀㐀 
-- Description:	Initial creation਀ⴀⴀ 唀瀀搀愀琀攀猀 愀 爀攀挀漀爀搀 昀爀漀洀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀⸀   
-- All old and new parameters must be sent.਀ⴀⴀ 伀甀琀瀀甀琀 椀猀 愀 猀琀愀琀甀猀 洀攀猀猀愀最攀 愀渀搀 琀爀愀渀猀愀挀琀椀漀渀 猀琀愀琀甀猀⸀   
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀 
*/਀ⴀⴀ 㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀㴀 
CREATE PROCEDURE [reviewing].[usp_UPD_wf_people_output_file] ਀ 
     @fileid bigint                   = NULL,    ਀ऀ 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀         㴀 一唀䰀䰀Ⰰ 
	 @new_fileid bigint               = NULL,    ਀ऀ 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 戀椀最椀渀琀     㴀 一唀䰀䰀Ⰰ 
	 @message nvarchar(1000)          = '' OUTPUT,਀ऀ 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 渀瘀愀爀挀栀愀爀⠀㔀　⤀ 㴀 一唀䰀䰀 伀唀吀倀唀吀 
਀ 
AS਀䈀䔀䜀䤀一 
	-- SET NOCOUNT ON added to prevent extra result sets from਀ऀⴀⴀ 椀渀琀攀爀昀攀爀椀渀最 眀椀琀栀 匀䔀䰀䔀䌀吀 猀琀愀琀攀洀攀渀琀猀⸀ 
	SET NOCOUNT ON;਀ 
  DECLARE ਀        䀀琀攀洀瀀洀攀猀猀愀最攀 渀瘀愀爀挀栀愀爀⠀㌀　　⤀           㴀 ✀✀Ⰰ 
		@tempuserauth_status nchar(10)       = '',਀ऀ    䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀 瘀愀爀戀椀渀愀爀礀⠀㄀　　⤀     㴀 匀唀匀䔀刀开匀䤀䐀⠀伀刀䤀䜀䤀一䄀䰀开䰀伀䜀䤀一⠀⤀⤀Ⰰ   ⴀⴀ 吀栀攀 匀䤀䐀 漀昀 琀栀攀 挀漀渀渀攀挀琀攀搀 甀猀攀爀 
	    @username nvarchar(150)              = ORIGINAL_LOGIN(),     -- The username ਀ऀ    䀀猀椀搀椀搀 戀椀最椀渀琀Ⰰ                                 ⴀⴀ 吀栀攀 甀猀攀爀 椀搀 
		@fileauthenticationstatus nchar(10)  = '',     -- Status of authorisation for the connected user to access the file਀ऀऀ                                               ⴀⴀ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 椀昀 琀栀攀 昀椀氀攀 搀漀攀猀 渀漀琀 攀砀椀猀琀⸀  吀栀攀 爀攀猀甀氀琀 搀漀攀猀 渀漀琀 搀椀猀琀椀渀最甀椀猀栀 攀椀琀栀攀爀⸀ 
	    @validationmessage nvarchar(200)     = '', -- Communicates that the transaction failed due to data validation਀ऀऀ䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀ 㴀 ✀䘀愀椀氀✀Ⰰ ⴀⴀ 吀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 挀栀攀挀欀 漀昀 琀栀攀 甀猀攀爀  
		@object_auth_result nvarchar(10)     = 'Pass', -- Result of authentication check of the user for the given object. ਀ऀऀ䀀搀漀挀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀   㴀 ✀✀Ⰰ  ⴀⴀ 䌀漀洀洀甀渀椀挀愀琀攀猀 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀 琀漀 愀挀挀攀猀猀 琀栀攀 搀漀挀甀洀攀渀琀 
		                                               -- or alternatively if the document does not exist.  The result does not distinguish either. ਀ऀऀ䀀琀攀洀瀀瘀愀氀椀搀愀琀椀漀渀猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀      㴀 ✀✀Ⰰ 
		@transaction_ready nchar(10)         = 'Ready',਀ऀऀ䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 渀挀栀愀爀⠀㄀　⤀    㴀 ✀倀愀猀猀✀㬀 
਀ऀ 
  -- Parameters which have been initialised at declaration but not explicitly set might be output as null to calling function.਀  匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀吀爀愀渀猀愀挀琀椀漀渀 渀漀琀 愀琀琀攀洀瀀琀攀搀✀㬀   
 ਀  ⴀⴀ 䌀漀渀渀攀挀琀攀搀 甀猀攀爀 愀甀琀栀攀渀琀椀挀愀琀椀漀渀 
  -- Authenticate the connected user for the role਀  䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开甀猀攀爀开爀漀氀攀崀  
        @role_to_check = 'Editor',਀ऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
  IF @tempuserauth_status = 'Pass' SET @userauthentication_status = 'Pass';਀ 
  EXEC [internal].[usp_AUTHENTICATE_user_role] ਀        䀀爀漀氀攀开琀漀开挀栀攀挀欀 㴀 ✀刀攀瘀椀攀眀攀爀✀Ⰰ 
		@user_authentication_result = @tempuserauth_status OUTPUT;਀  䤀䘀 䀀琀攀洀瀀甀猀攀爀愀甀琀栀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 匀䔀吀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀㬀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀ 
    BEGIN  -- The user does not have permission for this action਀ऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
	    EXEC internal.usp_SEL_message ਀            䀀洀攀猀猀愀最攀开椀搀   㴀 ✀一漀倀攀爀洀椀猀猀椀漀渀✀Ⰰ  
			@message_text = @tempmessage OUTPUT;਀ऀ    䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  	       SET @message = CONCAT(@message, ' | ', ISNULL(@username, ''), '  ', @tempmessage);਀ऀ    䔀䰀匀䔀  
		   SET  @message = CONCAT_WS(' | ', @message,'A database level message error occurred on NoPermission.');਀ऀ䔀一䐀 
਀  䤀䘀 䀀甀猀攀爀愀甀琀栀攀渀琀椀挀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ ⴀⴀ 䐀漀渀✀琀 搀漀 愀渀礀琀栀椀渀最 椀昀 琀栀攀 甀猀攀爀 椀猀 渀漀琀 愀甀琀栀漀爀椀猀攀搀⸀ 
    BEGIN਀ऀ  ⴀⴀ 䐀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 
਀ऀऀ  ⴀⴀ 䌀栀攀挀欀 琀栀愀琀 愀 昀椀氀攀 椀搀 眀愀猀 猀甀瀀瀀氀椀攀搀 
		  IF (@new_fileid IS NULL OR @new_fileid = 0) ਀ऀऀऀ 䈀䔀䜀䤀一 
				 SET @data_validation_status = 'Fail';਀ऀऀऀऀ 匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
				 EXEC internal.usp_SEL_message ਀ऀऀऀऀऀ  䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀䘀椀氀攀䤀䐀✀Ⰰ 䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
				 IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				 ELSE  ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀椀氀攀䤀䐀⸀✀⤀㬀 
			 END਀ऀऀ  䔀䰀匀䔀  ⴀⴀ 䘀椀氀攀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
				BEGIN  	-- Check if the file ID exists and the user has edit permission for the file਀ऀऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开昀椀氀攀开攀搀开瀀攀爀洀崀  
 						@file_id_to_check_ep =  @new_fileid,਀ऀऀऀऀऀऀ䀀甀猀攀爀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀开昀攀瀀 㴀 䀀昀椀氀攀愀甀琀栀攀渀琀椀挀愀琀椀漀渀猀琀愀琀甀猀 伀唀吀倀唀吀㬀 
						IF @fileauthenticationstatus = 'Fail'਀ऀऀऀऀऀऀऀ䈀䔀䜀䤀一 ⴀⴀ 䘀椀氀攀 椀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 漀爀 琀栀攀 甀猀攀爀 搀漀攀猀 渀漀琀 栀愀瘀攀 瀀攀爀洀椀猀猀椀漀渀 琀漀 愀挀挀攀猀猀 椀琀 
								SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
								EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀䘀椀氀攀䤀䐀一漀琀䔀砀椀猀琀✀Ⰰ  
									@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀऀऀ䤀䘀 䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀  
									SET @message = CONCAT(@message, ' | ', 'File ID: ', CONVERT(nvarchar(20), @new_fileid), '.  ', @tempmessage);਀ऀऀऀऀऀऀऀऀ䔀䰀匀䔀  
									SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FileIDNotExist.');਀ऀऀऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ ⴀⴀ 䔀渀搀 挀栀攀挀欀椀渀最 琀栀攀 昀椀氀攀 椀搀 
		 -- Check the instance step id਀ऀ  䤀䘀 䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 　 
		 SET @instance_step_id = NULL;਀ 
			-- Check that the user has permission for it, in relation to the linked document. ਀ऀऀऀऀ䈀䔀䜀䤀一 
				EXEC [internal].[usp_AUTHENTICATE_wf_inst_step]਀ऀऀऀऀऀ䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开琀漀开挀栀攀挀欀 㴀䀀椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀Ⰰ 
					@step_authentication_result = @object_auth_result OUTPUT;਀ऀऀऀऀ 䤀䘀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 㴀 ✀䘀愀椀氀✀ 
					BEGIN਀ऀऀ ऀऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
						SET @transaction_ready      = 'Fail';਀ऀऀऀऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
							@message_id = 'WFStepNotAuth', ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  						IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
						ELSE ਀ऀऀऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀䘀匀琀攀瀀一漀琀䄀甀琀栀⸀✀⤀㬀 
					END਀ऀऀऀऀ䔀一䐀 
		 -- End checking the instance step id਀ 
	  IF @new_instance_step_id = 0਀ऀऀ 匀䔀吀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 一唀䰀䰀㬀 
	   -- Check if an instance step id was supplied.਀ऀ  䤀䘀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 䤀匀 一唀䰀䰀 
		 BEGIN਀ऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
		   SET @transaction_ready      = 'Fail';਀ऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
				@message_id = 'NoWfInstanceStepID', ਀ऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  		   IF (@tempmessage IS NOT NULL) ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		   ELSE ਀ऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀圀昀䤀渀猀琀愀渀挀攀匀琀攀瀀䤀䐀⸀✀⤀㬀 
		 END਀ऀ  䔀䰀匀䔀 ⴀⴀ 䄀渀 椀渀猀琀愀渀挀攀 猀琀攀瀀 椀搀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 
		 BEGIN  -- Check that the instance step id exists਀ऀऀऀ 䤀䘀 一伀吀 䔀堀䤀匀吀匀 ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
							  FROM workflow_instances.workflow_instance_steps਀ऀऀऀऀऀऀऀ 圀䠀䔀刀䔀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 㴀 䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 ⤀  
				 BEGIN -- Record id does not exist਀ऀऀऀऀ   匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
				   SET @transaction_ready      = 'Fail';਀ऀऀऀऀ   䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
						@message_id = 'WfInstStepIdInvalid', ਀ऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  				   IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				   ELSE ਀ऀऀऀऀऀ  匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 圀昀䤀渀猀琀匀琀攀瀀䤀搀䤀渀瘀愀氀椀搀⸀✀⤀㬀 
				 END਀ऀऀऀ 䔀䰀匀䔀 ⴀⴀ 吀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀⸀  䌀栀攀挀欀 琀栀愀琀 琀栀攀 甀猀攀爀 栀愀猀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 椀琀Ⰰ 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀攀搀 搀漀挀甀洀攀渀琀⸀  
				BEGIN਀ऀऀऀऀ䔀堀䔀䌀 嬀椀渀琀攀爀渀愀氀崀⸀嬀甀猀瀀开䄀唀吀䠀䔀一吀䤀䌀䄀吀䔀开眀昀开椀渀猀琀开猀琀攀瀀崀 
					@instance_step_to_check = @new_instance_step_id,਀ऀऀऀऀऀ䀀猀琀攀瀀开愀甀琀栀攀渀琀椀挀愀琀椀漀渀开爀攀猀甀氀琀 㴀 䀀漀戀樀攀挀琀开愀甀琀栀开爀攀猀甀氀琀 伀唀吀倀唀吀㬀 
				 IF @object_auth_result = 'Fail'਀ऀऀऀऀऀ䈀䔀䜀䤀一 
		 				SET @data_validation_status = 'Fail';਀ऀऀऀऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
						EXEC internal.usp_SEL_message ਀ऀऀऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀圀䘀匀琀攀瀀一漀琀䄀甀琀栀✀Ⰰ  
							@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
							SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀऀऀ䔀䰀匀䔀  
							SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on WFStepNotAuth.');਀ऀऀऀऀऀ䔀一䐀 
				END਀ऀऀ 䔀一䐀 
਀ऀ 
	 -- Retrieve the sidid਀ऀऀ  匀䔀吀 䀀猀椀搀椀搀 㴀 ⠀匀䔀䰀䔀䌀吀 猀氀⸀猀椀搀开椀搀 
			              FROM user_restr.sid_list AS sl਀ऀऀऀ  ऀऀ     圀䠀䔀刀䔀 猀氀⸀猀椀搀 㴀 䀀挀漀渀渀攀挀琀攀搀甀猀攀爀猀椀搀⤀ऀ 
਀ऀऀ  
਀ऀ ⴀⴀ 䌀栀攀挀欀 椀昀 琀栀攀 爀攀挀漀爀搀 攀砀椀猀琀猀 
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
	 IF NOT EXISTS ਀ऀ    ⠀匀䔀䰀䔀䌀吀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		   FROM workflow_instances.workflow_person_output_files਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =       @instance_step_id਀ऀऀ    䄀一䐀    猀椀搀开椀搀  
				= @sidid)਀ऀऀ䈀䔀䜀䤀一 ⴀⴀ 刀攀挀漀爀搀 搀漀攀猀 渀漀琀 攀砀椀猀琀 
			SET @data_validation_status = 'Fail';਀ऀऀऀ匀䔀吀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀      㴀 ✀䘀愀椀氀✀㬀 
			EXEC internal.usp_SEL_message਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开椀搀 㴀 ✀一漀琀䔀砀椀猀琀✀Ⰰ 
					@message_text = @tempmessage OUTPUT;਀  ऀऀऀऀऀ䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
					SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀऀऀ䔀䰀匀䔀  
					SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on NotExist.');਀ऀऀ䔀一䐀 
  END਀ 
  IF @data_validation_status = 'Pass'਀   䈀䔀䜀䤀一 
	 -- Check if a duplicate record already exists਀ऀ 䤀䘀 䔀堀䤀匀吀匀  
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开瀀攀爀猀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀 
		  WHERE        file_id਀ऀऀ        㴀 䀀渀攀眀开昀椀氀攀椀搀ऀऀ   
		    AND workflow_instance_step_id ਀ऀऀ        㴀   䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND        sid_id ਀ऀऀऀऀ㴀 䀀猀椀搀椀搀⤀ 
		BEGIN -- Record already exists਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'RecordExists',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 刀攀挀漀爀搀䔀砀椀猀琀猀⸀✀⤀㬀 
		END਀ 
-- Check that there is a matching record of workflow instance step id and people id in workflow_instances.workflow_step_duty_functions਀    䤀䘀 一伀吀 䔀堀䤀匀吀匀 
	    (SELECT workflow_instance_step_id਀ऀऀ   䘀刀伀䴀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀⸀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀 
		  WHERE workflow_instance_step_id ਀ऀऀ        㴀       䀀渀攀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀 
		    AND        sid_id ਀ऀऀऀऀ㴀 䀀猀椀搀椀搀⤀  
		BEGIN -- The person is not linked to the workflow step਀ऀऀऀ匀䔀吀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀䘀愀椀氀✀㬀 
			SET @transaction_ready      = 'Fail';਀ऀऀऀ䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀 
					@message_id = 'NoFunctionStepLink',਀ऀऀऀऀऀ䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  					IF (@tempmessage IS NOT NULL) ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
				ELSE ਀ऀऀऀऀऀ匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 一漀䘀甀渀挀琀椀漀渀匀琀攀瀀䰀椀渀欀⸀✀⤀㬀 
		END਀   䔀一䐀  ⴀⴀ䔀一䐀 䤀䘀 䀀搀愀琀愀开瘀愀氀椀搀愀琀椀漀渀开猀琀愀琀甀猀 㴀 ✀倀愀猀猀✀ 愀昀琀攀爀 椀渀椀琀椀愀氀 瘀愀氀椀搀愀琀椀漀渀 挀栀攀挀欀猀⸀ 
਀ऀ  ⴀⴀ 伀甀琀瀀甀琀 琀栀攀 搀愀琀愀 瘀愀氀椀搀愀琀椀漀渀 猀琀愀琀甀猀 昀愀椀氀攀搀 洀攀猀猀愀最攀 
	  IF @data_validation_status = 'Fail'਀ऀऀ䈀䔀䜀䤀一 
		  EXEC internal.usp_SEL_message ਀ऀऀऀ   䀀洀攀猀猀愀最攀开椀搀   㴀 ✀䘀愀椀氀攀搀䐀愀琀愀嘀愀氀椀搀愀琀椀漀渀✀Ⰰ  
			   @message_text = @tempmessage OUTPUT;਀ऀऀ  䤀䘀 ⠀䀀琀攀洀瀀洀攀猀猀愀最攀 䤀匀 一伀吀 一唀䰀䰀⤀  
  		    SET @message = CONCAT_WS(' | ', @message, @tempmessage);਀ऀऀ  䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on FailedDataValidation');਀ऀऀ䔀一䐀 
  -- End data validation਀ 
਀ⴀⴀ 䔀砀攀挀甀琀攀 琀栀攀 搀攀氀攀琀攀 焀甀攀爀礀 
਀  䤀䘀 䀀琀爀愀渀猀愀挀琀椀漀渀开爀攀愀搀礀 㴀 ✀刀攀愀搀礀✀ 
	BEGIN਀ऀ  䈀䔀䜀䤀一 吀刀夀 
	     UPDATE workflow_instances.workflow_person_output_files਀ऀऀ    匀䔀吀 昀椀氀攀开椀搀                   㴀 䀀渀攀眀开昀椀氀攀椀搀Ⰰ 
			    workflow_instance_step_id = @new_instance_step_id਀ऀऀ  圀䠀䔀刀䔀    昀椀氀攀开椀搀 
		        = @fileid		  ਀ऀऀ    䄀一䐀 眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀开猀琀攀瀀开椀搀  
		        =       @instance_step_id਀ऀऀ    䄀一䐀    猀椀搀开椀搀  
				= @sidid;਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'Success', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
  	     IF (@tempmessage IS NOT NULL) ਀  ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀⤀㬀 
		  ELSE ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀开圀匀⠀✀ 簀 ✀Ⰰ 䀀洀攀猀猀愀最攀Ⰰ ✀䄀 搀愀琀愀戀愀猀攀 氀攀瘀攀氀 洀攀猀猀愀最攀 攀爀爀漀爀 漀挀挀甀爀爀攀搀 漀渀 匀甀挀挀攀猀猀✀⤀㬀 
		 SET @transaction_status = 'Good';਀ 
   	  END TRY਀ऀ  䈀䔀䜀䤀一 䌀䄀吀䌀䠀 
	     SET @transaction_status = 'Bad';਀         䔀堀䔀䌀 椀渀琀攀爀渀愀氀⸀甀猀瀀开匀䔀䰀开洀攀猀猀愀最攀  
              @message_id   = 'UpdateError', ਀              䀀洀攀猀猀愀最攀开琀攀砀琀 㴀 䀀琀攀洀瀀洀攀猀猀愀最攀 伀唀吀倀唀吀㬀 
		 IF (@tempmessage IS NOT NULL) ਀ऀऀ    匀䔀吀 䀀洀攀猀猀愀最攀 㴀 䌀伀一䌀䄀吀⠀䀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ 䀀琀攀洀瀀洀攀猀猀愀最攀Ⰰ ✀ 簀 ✀Ⰰ  
		    CONVERT(nvarchar(10),ERROR_NUMBER()), ' | ', ERROR_MESSAGE());਀ऀऀ 䔀䰀匀䔀  
		    SET @message = CONCAT_WS(' | ', @message, 'A database level message error occurred on UpdateError');਀ऀ  䔀一䐀 䌀䄀吀䌀䠀 
 ਀ 
   END -- END IF @transaction_ready = 'Ready'਀ 
 END -- End IF @userauthentication = 'Pass'਀ 
END਀䜀伀 
EXEC [Elyse_DB].sys.sp_addextendedproperty @name=N'Website', @value=N'silkwoodsoftware.com' ਀䜀伀 
EXEC [Elyse_DB].sys.sp_addextendedproperty @name=N'Release Date', @value=N'23 March 2026' ਀䜀伀 
EXEC [Elyse_DB].sys.sp_addextendedproperty @name=N'Publisher', @value=N'Silkwood Software Pty. Ltd.' ਀䜀伀 
EXEC [Elyse_DB].sys.sp_addextendedproperty @name=N'Product Name', @value=N'Elyse® Document Management System' ਀䜀伀 
EXEC [Elyse_DB].sys.sp_addextendedproperty @name=N'Minor Release #', @value=N'1' ਀䜀伀 
EXEC [Elyse_DB].sys.sp_addextendedproperty @name=N'Major Release #', @value=N'1' ਀䜀伀 
EXEC [Elyse_DB].sys.sp_addextendedproperty @name=N'Copyright', @value=N'This database schema, stored procedures and functions are protected by copyright.' ਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the record of linked files when a document is booked in.  Note that documents are booked out, not files.  When the document is booked back in the option exists to attach files that are booked in with the document.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'booked_in_files'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'There is no foreign key constraint for doc_id so that documents can be deleted without needing to clear the booking log history.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'booking_log', @level2type=N'COLUMN',@level2name=N'doc_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'There is no foreign key constraint for user ID so that user records can be deleted without needing to clear the booking log.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'booking_log', @level2type=N'COLUMN',@level2name=N'user_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This field is for storing the release number of the document when a document is booked in.  ਀ 
Note:  The database is designed on the premise that a document controller must manually carry out QA checks to ensure a document file is in order and has been properly authorized before being released as a published document.  The database does not automatically process and release files to published document status.   ਀刀攀氀攀愀猀攀 渀甀洀戀攀爀猀 愀爀攀 椀渀琀攀渀搀攀搀 琀漀 戀攀 攀渀琀椀爀攀氀礀 昀爀攀攀 昀漀爀洀愀琀Ⰰ 愀氀氀漀眀椀渀最 漀爀最愀渀椀稀愀琀椀漀渀猀 琀漀 甀猀攀 愀渀礀 搀攀猀椀爀攀搀 昀漀爀洀愀琀 愀渀搀 琀漀 攀瘀攀渀 挀栀愀渀最攀 琀栀攀 昀漀爀洀愀琀 昀爀漀洀 漀渀攀 爀攀氀攀愀猀攀 琀漀 琀栀攀 渀攀砀琀 椀昀 渀攀挀攀猀猀愀爀礀 ⠀攀⸀最⸀ 刀攀瘀椀猀椀漀渀 㘀 戀攀椀渀最 猀甀瀀攀爀猀攀搀攀搀 戀礀 刀攀瘀椀猀椀漀渀 㘀愀⤀⸀  匀椀渀挀攀 琀栀攀 椀洀洀甀琀愀戀氀攀 昀椀氀攀 猀琀漀爀愀最攀 猀攀挀甀爀椀琀礀 愀爀挀栀椀琀攀挀琀甀爀攀 漀昀 䔀氀礀猀攀 洀攀愀渀猀 琀栀愀琀 琀栀攀 搀愀琀愀戀愀猀攀 搀漀攀猀 渀漀琀 瀀愀爀琀椀挀椀瀀愀琀攀 椀渀 昀椀氀攀 攀搀椀琀椀渀最 椀渀 愀渀礀 眀愀礀Ⰰ 琀栀攀 搀愀琀愀戀愀猀攀 挀愀渀渀漀琀 愀甀琀漀洀愀琀椀挀愀氀氀礀 猀礀渀挀栀爀漀渀椀稀攀 愀 爀攀氀攀愀猀攀 渀甀洀戀攀爀 猀琀漀爀攀搀 眀椀琀栀椀渀 琀栀攀 搀愀琀愀戀愀猀攀 眀椀琀栀 琀栀愀琀 瀀爀椀渀琀攀搀 漀渀 琀栀攀 搀漀挀甀洀攀渀琀Ⰰ 眀栀椀氀攀 猀琀椀氀氀 愀琀 琀栀攀 猀愀洀攀 琀椀洀攀 愀氀氀漀眀椀渀最 甀渀挀漀渀猀琀爀愀椀渀攀搀 昀爀攀攀 昀漀爀洀愀琀 爀攀氀攀愀猀攀 渀甀洀戀攀爀猀 愀渀搀 甀渀挀漀渀猀琀爀愀椀渀攀搀 昀椀氀攀 昀漀爀洀愀琀猀 愀渀搀 昀椀氀攀渀愀洀攀猀⸀  吀栀攀 琀愀猀欀 漀昀 攀渀猀甀爀椀渀最 琀栀愀琀 琀栀攀 爀攀氀攀愀猀攀 渀甀洀戀攀爀 瀀爀椀渀琀攀搀 漀渀 琀栀攀 搀漀挀甀洀攀渀琀 洀愀琀挀栀攀猀 琀栀愀琀 爀攀挀漀爀搀攀搀 椀渀 琀栀攀 搀愀琀愀戀愀猀攀 洀甀猀琀 戀攀 洀愀渀愀最攀搀 戀礀 琀栀攀 甀猀攀爀Ⰰ 漀爀 漀琀栀攀爀眀椀猀攀 戀礀 愀渀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀 眀栀椀挀栀 愀甀琀漀洀愀琀攀猀 愀渀搀 挀漀渀猀琀爀愀椀渀猀 眀栀愀琀 椀猀 猀攀渀琀 琀漀 琀栀攀 搀愀琀愀戀愀猀攀⸀ 
' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'booking_log', @level2type=N'COLUMN',@level2name=N'release_number'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table storest the booking management records for documents.  Documents are booked in and booked out.  The links to files booked in are stored in base.booked_in_files.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'booking_log'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'booking_log', @level2type=N'CONSTRAINT',@level2name=N'CK_booking_status'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Must be a valid culture code recognised by the SQL server.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'culture_codes', @level2type=N'COLUMN',@level2name=N'culture_code'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'List of valid culture codes used for formatting values.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 昀甀渀挀琀椀漀渀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀甀氀琀甀爀攀开挀漀搀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 椀猀 甀猀攀搀 琀漀 搀攀昀椀渀攀 琀栀攀 猀琀礀氀攀 漀昀 愀 猀瀀攀挀椀昀椀挀 搀愀琀攀 漀爀 琀椀洀攀 昀椀攀氀搀Ⰰ 愀猀 漀瀀瀀漀猀攀搀 琀漀 最氀漀戀愀氀 搀愀琀攀 昀漀爀洀愀琀 猀攀琀琀椀渀最猀⸀  吀栀攀 瘀愀氀甀攀 椀猀 甀猀攀搀 戀礀 琀栀攀 䌀伀一嘀䔀刀吀 昀甀渀挀琀椀漀渀⸀  嘀愀氀甀攀猀 洀甀猀琀 戀攀 挀漀渀猀椀猀琀攀渀琀 眀椀琀栀 琀栀攀 匀儀䰀 猀攀爀瘀攀爀 猀甀瀀瀀漀爀琀攀搀 搀愀琀攀 愀渀搀 琀椀洀攀 猀琀礀氀攀猀⸀ 
See https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver16਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀匀攀攀 搀攀琀愀椀氀猀 椀渀 琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 椀渀琀攀渀琀 漀昀 琀栀攀 氀漀挀欀 猀琀愀琀甀猀 椀猀 琀漀 瀀攀爀洀椀琀 愀 搀漀挀甀洀攀渀琀 椀搀 琀漀 戀攀 氀漀挀欀攀搀 愀最愀椀渀猀琀 挀栀愀渀最攀⸀  吀栀攀 猀琀愀琀甀猀 挀愀渀 戀攀 氀漀挀欀攀搀 愀琀 挀漀渀琀爀漀氀氀攀爀 氀攀瘀攀氀 戀甀琀 漀渀氀礀 甀渀氀漀挀欀攀搀 愀琀 挀漀渀昀椀最甀爀愀琀漀爀 氀攀瘀攀氀⸀  䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 漀渀挀攀 愀 搀漀挀甀洀攀渀琀 栀愀猀 戀攀攀渀 瀀甀戀氀椀猀栀攀搀 愀渀搀 洀愀渀礀 漀琀栀攀爀 搀漀挀甀洀攀渀琀猀 挀漀渀琀愀椀渀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀猀 琀漀 椀琀 瘀椀愀 椀琀猀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 琀栀攀 搀漀挀甀洀攀渀琀 椀搀 猀栀漀甀氀搀 渀漀琀 戀攀 愀戀氀攀 琀漀 戀攀 挀栀愀渀最攀搀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀漀挀欀开猀琀愀琀甀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀攀渀琀椀昀椀攀爀⸀  䤀琀 椀猀 椀渀琀攀渀搀攀搀 琀漀 戀攀 琀栀攀 愀挀琀甀愀氀 椀搀攀渀琀椀昀椀攀爀 琀栀愀琀 琀栀攀 甀猀攀爀 甀猀攀猀 愀渀搀 猀攀攀猀⸀  䤀琀 椀猀 渀漀琀 椀渀琀攀渀搀攀搀 琀漀 戀攀 愀渀 椀搀攀渀琀椀昀椀攀爀 愀甀琀漀ⴀ最攀渀攀爀愀琀攀搀 愀琀 愀 氀漀眀 氀攀瘀攀氀⸀  吀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀 洀愀礀 愀搀搀 愀渀 愀甀琀漀ⴀ最攀渀攀爀愀琀漀爀 昀甀渀挀琀椀漀渀 琀漀 愀猀猀椀猀琀 琀栀攀 甀猀攀爀 栀漀眀攀瘀攀爀Ⰰ 戀甀琀 琀栀攀 椀渀琀攀渀琀 椀猀 琀栀愀琀 琀栀攀 甀猀攀爀 挀愀渀 甀氀琀椀洀愀琀攀氀礀 攀渀琀攀爀 愀渀礀 瘀愀氀甀攀Ⰰ 猀甀挀栀 愀猀 愀 瀀爀攀ⴀ攀砀椀猀琀椀渀最 瘀愀氀甀攀Ⰰ 椀渀琀漀 琀栀椀猀 昀椀攀氀搀⸀   
Note that the schema for documents is constructed separately from that of files to enforce discipline that documents and files are completely separate entities. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 挀甀爀爀攀渀琀 戀漀漀欀椀渀最 椀搀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀䘀䬀开搀漀挀甀洀攀渀琀开椀搀开氀椀猀琀开栀愀猀开戀漀漀欀椀渀最开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀匀琀漀爀攀猀 琀栀攀 䔀唀䰀䄀 昀漀爀 琀栀攀 搀愀琀愀戀愀猀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀攀甀氀愀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀漀最猀 搀攀氀攀琀椀漀渀 漀昀 昀椀氀攀猀⸀  吀栀攀 氀漀最 椀猀 琀甀爀渀攀搀 漀渀 愀渀搀 漀昀昀 瘀椀愀 昀椀氀攀开搀攀氀攀琀攀开氀漀最 瘀愀氀甀攀 椀渀 最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀ 
Note that there are no relationship constraints applied to this table because the data must be retained after a file or user has been deleted.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'file_delete_log'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table stores the file metadata except for the plain text content and thumbnails.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀攀琀愀搀愀琀愀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 猀琀漀爀攀猀 琀栀攀 昀椀氀攀 瀀氀愀椀渀 琀攀砀琀 挀漀渀琀攀渀琀⸀   
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开瀀氀愀椀渀开琀攀砀琀开挀漀渀琀攀渀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀漀最猀 愀挀挀攀猀猀 琀漀 昀椀氀攀猀⸀  吀栀攀 氀漀最 椀猀 琀甀爀渀攀搀 漀渀 愀渀搀 漀昀昀 瘀椀愀 昀椀氀攀开爀攀愀搀开氀漀最 瘀愀氀甀攀 椀渀 最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀⸀ 
Note that there are no relationship constraints applied to this table because the data must be retained after a file or user has been deleted.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'file_read_log'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The file_id is used instead of the GUID because it is shorter and hence can be used manually if necessary.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'file_storage', @level2type=N'COLUMN',@level2name=N'file_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the GUID created by Filestream.  ' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'file_storage', @level2type=N'COLUMN',@level2name=N'file_guid'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Filestream file content.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'file_storage', @level2type=N'COLUMN',@level2name=N'file_content'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table stores the files as filestream data.  Filestream is arranged unstructured as a single filegroup because the data structure is intended to be determined by the metadata defined elsewhere in the database.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开猀琀漀爀愀最攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 猀琀漀爀攀猀 琀栀攀 昀椀氀攀 琀栀甀洀戀渀愀椀氀猀⸀   
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开琀栀甀洀戀渀愀椀氀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀一伀吀䔀㨀 吀栀攀 搀愀琀愀 挀漀渀琀愀椀渀攀搀 椀渀 琀栀椀猀 昀椀攀氀搀 椀猀 栀愀爀搀 挀漀搀攀搀 椀渀琀漀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀⸀  吀栀攀 猀攀琀琀椀渀最 最爀漀甀瀀 渀愀洀攀 眀栀椀挀栀 椀猀 甀猀攀搀 椀猀 愀氀眀愀礀猀 ✀✀䴀愀猀琀攀爀✀✀⸀  䠀攀渀挀攀Ⰰ 琀漀 挀栀愀渀最攀 眀栀椀挀栀 爀攀挀漀爀搀 椀猀 琀漀 戀攀 愀瀀瀀氀椀攀搀Ⰰ 挀栀愀渀最攀 眀栀椀挀栀 爀漀眀 栀愀猀 琀栀攀 猀攀琀琀椀渀最开最爀漀甀瀀开渀愀洀攀 漀昀 ✀✀䴀愀猀琀攀爀✀✀⸀  吀栀攀 漀琀栀攀爀 爀漀眀猀 挀愀渀 栀愀瘀攀 愀渀礀 渀愀洀攀Ⰰ 瀀爀漀瘀椀搀椀渀最 琀栀愀琀 琀栀攀 渀愀洀攀 椀猀 甀渀椀焀甀攀⸀ 
' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'setting_group_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Selected language for visible text messages.  Select from valid values in messaging.language_list.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'language_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Valid values are ''Yes'' or ''No''.  ਀唀猀攀搀 戀礀 琀栀攀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀 琀漀 搀攀挀椀搀攀 眀栀攀琀栀攀爀 琀栀攀 爀攀最椀猀琀攀爀 挀漀搀攀 瀀爀攀昀椀砀 椀猀 琀漀 戀攀 愀瀀瀀氀椀攀搀 琀漀 愀渀 愀甀琀漀ⴀ最攀渀攀爀愀琀攀搀 搀漀挀甀洀攀渀琀 椀搀⸀ 
' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'is_register_code_applied'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Register code is an optional code prefix that is appended to an auto-generated document id to differentiate distinct registers within an organisation.  Register codes should not be used to encode metadata but rather should be used just to keep IDs from separate registers visibly distinct, for example if the different registers are accessed through different interfaces and the user will need to know which interface to use.  ਀吀栀攀 爀攀最椀猀琀攀爀 挀漀搀攀 挀漀甀氀搀 戀攀 甀猀攀搀 琀漀 爀攀搀甀挀攀 琀栀攀 爀椀猀欀 漀昀 搀漀挀甀洀攀渀琀 䤀䐀猀 戀攀椀渀最 搀甀瀀氀椀挀愀琀攀搀 愀挀爀漀猀猀 搀椀昀昀攀爀攀渀琀 漀爀最愀渀椀猀愀琀椀漀渀猀Ⰰ 眀栀椀氀攀 猀琀椀氀氀 欀攀攀瀀椀渀最 琀栀攀 䤀䐀 氀攀渀最琀栀 猀栀漀爀琀Ⰰ 愀猀 漀瀀瀀漀猀攀搀 琀漀 甀猀椀渀最 愀 䜀唀䤀䐀 昀漀爀 攀砀愀洀瀀氀攀⸀  吀栀攀 漀爀最愀渀椀猀愀琀椀漀渀✀✀猀 猀琀漀挀欀 琀椀挀欀攀爀 挀漀甀氀搀 戀攀 甀猀攀搀 昀漀爀 琀栀椀猀 瀀甀爀瀀漀猀攀⸀  䤀昀 琀眀漀 漀爀最愀渀椀猀愀琀椀漀渀猀 洀攀爀最攀 琀栀攀渀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀漀渀✀✀琀 挀氀愀猀栀⸀  
' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'register_code'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Valid values are 4, 6 or 8.਀吀栀椀猀 椀猀 琀栀攀 渀甀洀戀攀爀 漀昀 氀攀琀琀攀爀猀 椀渀 琀栀攀 愀甀琀漀ⴀ最攀渀攀爀愀琀攀搀 搀漀挀甀洀攀渀琀 䤀䐀⸀  
Select the lowest applicable number.  Use 4 where the maximum prospective number of document  IDs will be less than 100,000.  Use 6 when the maximum will be less than 25,000,000 and 8 when it is in the billions.  See internal.usp_SEL_random_doc_id for more details.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'auto_gen_doc_id_length'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Valid values are ''Yes'' or ''No''. ਀吀栀椀猀 椀猀 愀 昀氀愀最 琀漀 椀渀猀琀爀甀挀琀 甀猀瀀开䤀一匀开搀漀挀甀洀攀渀琀开椀搀 琀漀 愀甀琀漀最攀渀攀爀愀琀攀 愀 搀漀挀甀洀攀渀琀 椀搀 椀昀 渀漀渀攀 椀猀 猀甀瀀瀀氀椀攀搀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀甀猀攀开愀甀琀漀开最攀渀开搀漀挀开椀搀开漀渀开渀甀氀氀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 挀漀氀甀洀渀 椀猀 甀猀攀搀 戀礀 琀栀攀 搀漀挀甀洀攀渀琀 䤀䐀 愀甀琀漀最攀渀攀爀愀琀攀 昀甀渀挀琀椀漀渀 琀漀 搀攀琀攀爀洀椀渀攀 椀昀 琀栀攀 愀甀琀漀ⴀ最攀渀攀爀愀琀攀搀 搀漀挀甀洀攀渀琀 䤀䐀 椀猀 琀漀 戀攀 愀渀 愀氀瀀栀愀 猀琀爀椀渀最Ⰰ 攀⸀最⸀ 䄀䈀䌀䐀䔀Ⰰ 漀爀 愀渀 椀渀琀攀最攀爀Ⰰ 攀⸀最⸀ ㄀㈀㌀㐀㔀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀漀挀开椀搀开昀漀爀洀愀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 挀漀氀甀洀渀 椀猀 甀猀攀搀 愀猀 愀 爀攀挀漀爀搀 漀昀 琀栀攀 氀愀猀琀 椀渀琀攀最攀爀 琀礀瀀攀 搀漀挀甀洀攀渀琀 䤀䐀 甀猀攀搀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀漀挀开椀搀开氀愀猀琀开椀渀琀攀最攀爀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 搀攀昀愀甀氀琀 搀愀琀攀 猀琀礀氀攀 甀猀攀搀 昀漀爀 爀攀瀀爀攀猀攀渀琀椀渀最 搀愀琀攀 瘀愀氀甀攀猀⸀ 吀栀攀 挀漀渀琀攀渀琀 漀昀 琀栀椀猀 挀漀氀甀洀渀 洀甀猀琀 洀愀琀挀栀 愀渀 攀渀琀爀礀 椀渀 戀愀猀攀⸀搀愀琀攀琀椀洀攀开猀琀礀氀攀猀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀愀琀攀开猀琀礀氀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀甀氀琀甀爀攀 挀漀搀攀 椀猀 甀猀攀搀 琀漀 氀漀挀愀氀椀猀攀 愀瀀瀀氀椀挀愀琀椀漀渀猀⸀  䤀琀 椀猀 愀 挀漀洀戀椀渀愀琀椀漀渀 漀昀 䤀匀伀 㘀㌀㤀ⴀ㄀ 氀愀渀最甀愀最攀 挀漀搀攀 愀渀搀 䤀匀伀 ㌀㄀㘀㘀ⴀ㄀ 挀漀甀渀琀爀礀 挀漀搀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀挀甀氀琀甀爀攀开挀漀搀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 洀愀砀椀洀甀洀 渀甀洀戀攀爀 漀昀 愀琀琀攀洀瀀琀猀 昀漀爀 最攀渀攀爀愀琀椀渀最 愀渀 愀甀琀漀 最攀渀攀爀愀琀攀搀 搀漀挀甀洀攀渀琀 椀搀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀漀挀开愀甀琀漀最攀渀开洀愀砀开琀爀椀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 搀攀昀愀甀氀琀 昀椀氀琀攀爀 最爀漀甀瀀 琀栀愀琀 眀椀氀氀 戀攀 甀猀攀搀 戀礀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 眀栀椀挀栀 愀爀攀 椀渀琀攀渀搀攀搀 琀漀 瀀爀漀瘀椀搀攀 挀漀洀洀漀渀 昀甀渀挀琀椀漀渀猀⸀  吀栀椀猀 愀瘀漀椀搀猀 琀栀攀 渀攀攀搀 昀漀爀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 琀漀 椀渀挀氀甀搀攀 搀愀琀愀 眀栀椀挀栀 椀猀 栀愀爀搀 挀漀搀攀搀 琀漀 洀愀琀挀栀 挀漀渀昀椀最甀爀愀琀椀漀渀 搀愀琀愀⸀ 攀⸀最⸀ 愀 搀攀昀愀甀氀琀 昀椀氀琀攀爀 最爀漀甀瀀 眀栀椀挀栀 挀愀渀 戀攀 愀氀椀最渀攀搀 眀椀琀栀 愀 挀漀渀昀椀最甀爀愀琀椀漀渀 眀栀椀挀栀 愀氀氀漀眀猀 爀攀琀爀椀攀瘀愀氀 漀昀 昀椀氀攀猀 眀栀椀挀栀 愀爀攀 瀀甀戀氀椀猀栀攀搀 昀漀爀洀愀琀Ⰰ 愀猀 漀瀀瀀漀猀攀搀 琀漀 猀漀甀爀挀攀 昀椀氀攀猀Ⰰ 愀渀搀 眀栀椀挀栀 愀爀攀 琀栀攀 挀甀爀爀攀渀琀 氀愀琀攀猀琀 爀攀瘀椀猀椀漀渀 愀渀搀 愀爀攀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 䤀䐀 眀栀椀挀栀 椀猀 瀀甀戀氀椀猀栀攀搀Ⰰ 愀猀 漀瀀瀀漀猀攀搀 琀漀 眀椀琀栀搀爀愀眀渀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀昀愀甀氀琀开昀椀氀琀攀爀开最爀漀甀瀀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 搀攀昀愀甀氀琀 昀漀爀洀 䤀䐀 椀猀 甀猀攀搀 戀礀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 眀栀攀渀 渀漀 昀漀爀洀 䤀䐀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀 戀礀 琀栀攀 挀愀氀氀椀渀最 昀甀渀挀琀椀漀渀⸀  䄀氀氀 昀椀氀攀 愀渀搀 搀漀挀甀洀攀渀琀 搀愀琀愀 挀愀渀 漀渀氀礀 戀攀 爀攀琀甀爀渀攀搀 瘀椀愀 爀攀昀攀爀攀渀挀攀 琀漀 愀 昀漀爀洀 䤀䐀 眀栀椀挀栀 猀瀀攀挀椀昀椀攀猀 眀栀椀挀栀 昀椀攀氀搀猀 愀爀攀 琀漀 戀攀 爀攀琀甀爀渀攀搀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最氀漀戀愀氀开猀攀琀琀椀渀最猀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀昀愀甀氀琀开昀漀爀洀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 甀猀攀搀 戀礀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 昀漀爀 愀 搀攀昀愀甀氀琀 昀爀攀攀 琀攀砀琀 渀愀洀攀 椀搀 眀栀攀爀攀 渀漀渀攀 栀愀猀 戀攀攀渀 猀甀瀀瀀氀椀攀搀⸀  䤀琀 挀愀渀 戀攀 挀漀渀昀椀最甀爀攀搀 琀漀 瀀漀椀渀琀 琀漀 搀漀挀甀洀攀渀琀 ✀✀吀椀琀氀攀✀✀ 昀漀爀 攀砀愀洀瀀氀攀⸀  
' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'default_doc_free_text_name_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is used as a default if no tag tree id is supplied.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'default_tag_tree_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is used as a default if no browsing tree id is supplied.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'default_tag_browsing_tree_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This indicates whether a file which is a duplicate of an existing file is to be rejected. ' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'duplicate_management'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This field is an integer number of minutes.  It is used to retrieve documents or files that were recently created.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'created_last_minutes'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a flag that informs stored procedures whether enforced retention of files is on or off.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'enforced_retention'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a flag that informs stored procedures whether the file read log is on or off.  The file read log logs when files are opened.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'file_read_log'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a flag that informs stored procedures whether the file delete log is on or off.  The file delete log logs when files are deleted.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'file_delete_log'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a flag that informs the stored procedure whether or not to store plain text content.  ' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'store_plain_text_content'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a flag that informs the stored procedure whether or not to store file thumbnails.  ' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'store_thumbnails'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the default document date name ID to be used.  For example, it can be used as the next review date.' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'COLUMN',@level2name=N'default_doc_date_name_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Global settings for the database.  Each setting is a separate column as a FK to a table of setting options.  Adding a setting is a developer-level function as it requires adding a new column to this table and creating a new table of setting options.  The application can allow the user to create different groups of settings and switch between groups.  ਀一漀琀攀 琀栀愀琀 愀渀礀 挀漀氀甀洀渀猀 愀搀搀攀搀 琀漀 琀栀椀猀 琀愀戀氀攀 洀甀猀琀 愀氀猀漀 戀攀 爀攀昀氀攀挀琀攀搀 椀渀 甀猀瀀开匀䔀䰀开最氀漀戀愀氀开猀攀琀琀椀渀最猀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'CONSTRAINT',@level2name=N'FK_global_settings_groups_has_def_tag_tree_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Select a language for visible text messages' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'global_settings_groups', @level2type=N'CONSTRAINT',@level2name=N'FK_language_is_global_setting'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a register of transactions where the application may want to group or document a set of transactions.  For example, group a bulk upload with a single identifier and an associated note so that that all the records of that transaction can be readily retrieved again as a group.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 昀椀攀氀搀 挀愀渀 戀攀 甀猀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 琀漀 氀椀猀琀 琀栀攀 瘀愀氀甀攀猀 椀渀 愀 猀瀀攀挀椀昀椀挀 漀爀搀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀椀猀琀开瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀倀䬀开唀渀椀琀开䤀䐀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀唀渀椀琀猀 漀昀 洀攀愀猀甀爀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀戀愀猀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀甀渀椀琀猀开漀昀开洀攀愀猀甀爀攀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䤀一䐀䔀堀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀唀一开甀渀椀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀 氀椀猀琀 漀昀 甀渀椀琀猀 漀昀 洀攀愀猀甀爀攀 琀漀 戀攀 甀猀攀搀 椀渀 愀猀猀漀挀椀愀琀椀漀渀 眀椀琀栀 渀甀洀攀爀椀挀愀氀 瘀愀氀甀攀猀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'base', @level1type=N'TABLE',@level1name=N'units_of_measure'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'common_object_attributes', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'common_object_attributes', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'common_object_attributes', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the attribute of a common object.  A common object might be ''XYZ Pty Ltd''.  The attribute is ''Organisation Name''.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀挀漀洀开漀戀樀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀漀洀洀漀渀开漀戀樀攀挀琀开愀琀琀爀椀戀甀琀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀挀漀洀开漀戀樀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 氀椀猀琀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀挀漀洀开漀戀樀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀椀猀琀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀挀漀洀开漀戀樀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀漀洀洀漀渀开漀戀樀攀挀琀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀椀瀀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀一愀洀攀 漀昀 琀栀攀 氀椀猀琀 漀昀 挀漀洀洀漀渀 漀戀樀攀挀琀猀 氀椀渀欀攀搀 琀漀 搀漀挀甀洀攀渀琀猀⸀  䔀⸀最⸀ ✀✀䐀漀挀甀洀攀渀琀 伀眀渀攀爀猀✀✀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'common_object_list_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Defines lists of common objects.਀䄀 挀漀洀洀漀渀 漀戀樀攀挀琀 挀愀渀 戀攀 愀 洀攀洀戀攀爀 漀昀 洀漀爀攀 琀栀愀渀 漀渀攀 氀椀猀琀 戀甀琀 挀愀渀 漀渀氀礀 愀瀀瀀攀愀爀 漀渀挀攀 椀渀 愀 最椀瘀攀渀 氀椀猀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'common_object_lists'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'common_objects', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the object, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'common_objects', @level2type=N'COLUMN',@level2name=N'object_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'common_objects', @level2type=N'COLUMN',@level2name=N'description'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a table of objects which are common to both documents and files.  For example, an organisation''s name such as ''XYZ Pty Ltd''.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀挀漀洀开漀戀樀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀漀洀洀漀渀开漀戀樀攀挀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀渀欀猀 搀漀挀甀洀攀渀琀猀 琀漀 挀漀洀洀漀渀 漀戀樀攀挀琀猀Ⰰ 愀氀氀漀眀椀渀最 洀甀氀琀椀瀀氀攀 猀攀氀攀挀琀椀漀渀猀 昀漀爀 琀栀攀 氀椀猀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'doc_to_com_obj_ms_list_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Links documents to common objects, allowing only one object to be selected for a given list.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀挀漀洀开漀戀樀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀渀欀猀 昀椀氀攀猀 琀漀 挀漀洀洀漀渀 漀戀樀攀挀琀猀Ⰰ 愀氀氀漀眀椀渀最 洀甀氀琀椀瀀氀攀 猀攀氀攀挀琀椀漀渀猀 昀漀爀 琀栀攀 氀椀猀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'com_obj', @level1type=N'TABLE',@level1name=N'file_to_com_obj_ms_list_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Links files to common objects, allowing only one object to be selected for a given list.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀挀漀洀开漀戀樀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开琀漀开挀漀洀开漀戀樀开爀愀搀椀漀戀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀  
' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_date_field_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_date_field_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_date_field_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The field name must be unique for all document-related date fields.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_date_field_names', @level2type=N'CONSTRAINT',@level2name=N'UN_doc_date_name_attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of a date type field for a document.  E.g. mnem = ''PUBDATE'', attr_name = '' Published date'', descr = ''The date when the document was published.''਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 愀 搀愀琀攀 昀椀攀氀搀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 愀渀搀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 攀渀琀爀礀⸀  䔀⸀最⸀ 倀甀戀氀椀猀栀攀搀 搀愀琀攀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_date_values'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'A document date field must have a name.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_date_values', @level2type=N'CONSTRAINT',@level2name=N'FK_doc_date_field_has_values'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_free_text_field_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_free_text_field_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_free_text_field_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The free text field name must be unique within the set of document-related free text fields.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_free_text_field_names', @level2type=N'CONSTRAINT',@level2name=N'UN_doc_free_text_name_attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of a free text field for a document. ਀䔀⸀最⸀ 洀渀攀洀 㴀 ✀✀匀唀䴀✀✀Ⰰ 愀琀琀爀开渀愀洀攀 㴀 ✀✀匀甀洀洀愀爀礀✀✀Ⰰ 搀攀猀挀爀 㴀 ✀✀䄀 猀甀洀洀愀爀礀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀⸀✀✀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_free_text_field_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the user-entered content of the free text field. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_free_text_values', @level2type=N'COLUMN',@level2name=N'text_value'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links a free text field with a document and the associated data entry.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀 搀漀挀甀洀攀渀琀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 洀甀猀琀 栀愀瘀攀 愀 昀椀攀氀搀 渀愀洀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀䘀䬀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开栀愀猀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀漀挀甀洀攀渀琀 椀猀 氀椀渀欀攀搀 琀漀 昀爀攀攀 琀攀砀琀 搀愀琀愀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开昀爀攀攀开琀攀砀琀开瘀愀氀甀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀䘀䬀开搀漀挀开栀愀猀开昀爀攀攀开琀攀砀琀开搀愀琀愀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 愀琀琀爀椀戀甀琀攀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 甀渀椀琀猀 眀栀椀挀栀 愀爀攀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 琀栀攀 椀渀琀攀最攀爀 瘀愀氀甀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀甀渀椀琀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 搀漀挀甀洀攀渀琀 椀渀琀攀最攀爀 渀愀洀攀 昀椀攀氀搀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀唀一开搀漀挀开椀渀琀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 愀渀 椀渀琀攀最攀爀 昀椀攀氀搀 昀漀爀 愀 搀漀挀甀洀攀渀琀⸀   
E.g. mnem = ''REVI'', attr_name = ''Review Interval'', descr = ''The interval at which a document must be reviewed.''਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䤀渀琀攀最攀爀 瘀愀氀甀攀 琀漀 戀攀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀⸀  䔀⸀最⸀ 刀攀瘀椀猀椀漀渀 䤀渀琀攀爀瘀愀氀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开椀渀琀攀最攀爀开瘀愀氀甀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀椀渀琀开瘀愀氀甀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 愀渀 椀渀琀攀最攀爀 昀椀攀氀搀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 愀渀搀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 攀渀琀爀礀⸀ 䔀⸀最⸀ 刀攀瘀椀攀眀 䤀渀琀攀爀瘀愀氀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_integer_values'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'A document integer field must have a name.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_integer_values', @level2type=N'CONSTRAINT',@level2name=N'FK_doc_integer_field_has_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Links a document mulit-select attribut to filter groups.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_ms_attr_fgroup_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'List back to the table which defines the title of the list. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'doc_ms_list_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'List position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a unique key so that the attribute and list id pair can be referenced from the doc_sm_assignement table as a foreign key.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_attributes', @level2type=N'CONSTRAINT',@level2name=N'UN_d_sm_attr_and_list_combined_key'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The attribute name must be unique across all document-related multi-select lists.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_attributes', @level2type=N'CONSTRAINT',@level2name=N'UN_doc_sm_attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table defines the attributes (metadata) options for a multi-select option for a document.  An attribute option can be created in isolation and assigned to a multi-select list name table later.  The list name object does not need to be defined first.  ਀䔀砀愀洀瀀氀攀㨀  洀渀攀洀 㴀 ✀✀䔀一䜀✀✀㬀 渀愀洀攀 㴀 ✀✀䔀渀最椀渀攀攀爀椀渀最 搀攀瀀愀爀琀洀攀渀琀✀✀Ⰰ 搀攀猀挀爀 㴀 ✀✀䔀渀最椀渀攀攀爀椀渀最 搀攀瀀愀爀琀洀攀渀琀 挀漀洀瀀爀椀猀椀渀最 ⸀⸀⸀⸀⸀ ⸀✀✀ 
An attribute can only be a member of one list.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 氀椀渀欀 昀爀漀洀 琀栀攀 椀琀攀洀 椀渀 琀栀攀 氀椀猀琀 琀漀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 氀椀猀琀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀䘀䬀开搀漀挀开洀猀开愀琀琀爀椀戀甀琀攀开挀漀洀瀀爀椀猀攀猀开氀椀猀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀爀椀洀愀爀礀 欀攀礀 昀漀爀 琀栀攀 搀漀挀甀洀攀渀琀 琀漀 猀攀氀攀挀琀ⴀ洀愀渀礀 愀琀琀爀椀戀甀琀攀 氀椀渀欀 椀猀 愀 挀漀洀瀀漀猀椀琀攀 欀攀礀 漀昀 搀漀挀甀洀攀渀琀 椀搀Ⰰ 氀椀猀琀 椀搀 愀渀搀 愀琀琀爀椀戀甀琀攀 椀搀⸀  䠀攀渀挀攀 洀甀氀琀椀瀀氀攀 愀琀琀爀椀戀甀琀攀猀 昀爀漀洀 琀栀攀 猀愀洀攀 氀椀猀琀 挀愀渀 戀攀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀倀䬀开搀漀挀开氀椀猀琀开愀猀猀椀最渀洀攀渀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 挀爀攀愀琀攀猀 琀栀攀 琀栀爀攀攀ⴀ眀愀礀 氀椀渀欀 戀攀琀眀攀攀渀 愀 搀漀挀甀洀攀渀琀Ⰰ 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 漀昀 洀攀琀愀搀愀琀愀 渀愀洀攀Ⰰ 愀渀搀 愀 洀攀琀愀搀愀琀愀 瘀愀氀甀攀⸀  䔀⸀最⸀ 氀椀猀琀 㴀 ✀✀䐀攀瀀愀爀琀洀攀渀琀猀 爀攀氀愀琀攀搀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀✀✀Ⰰ 愀琀琀爀椀戀甀琀攀 㴀 ✀✀䄀挀挀漀甀渀琀猀 瀀愀礀愀戀氀攀✀✀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 愀琀琀爀椀戀甀琀攀 椀搀 愀渀搀 愀猀猀漀挀椀愀琀攀搀 氀椀猀琀 椀搀 瀀愀椀爀 洀甀猀琀 洀愀琀挀栀 琀栀攀 瀀愀椀爀 椀渀 琀栀攀 搀漀挀开猀洀开愀琀琀爀椀戀甀琀攀 琀愀戀氀攀 爀攀挀漀爀搀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀䘀䬀开搀漀挀开洀猀开愀琀琀爀开愀渀搀开氀椀猀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀  
e.g. ''RD''' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_list_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  E.g. ''Related departments''' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_list_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_list_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_list_names', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The list name must be unique with the set of all document-related multi-select lists.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_list_names', @level2type=N'CONSTRAINT',@level2name=N'UN_doc_select_many_list_attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table defines the name of a multi-select table for assigning multi-select metadata to a document.  One document can have many such multi-select metadata tables. ਀䔀砀愀洀瀀氀攀㨀 洀渀攀洀 㴀 ✀✀䐀䔀倀吀✀✀Ⰰ 愀琀琀爀开渀愀洀攀 㴀 ✀✀䐀攀瀀愀爀琀洀攀渀琀 䰀椀猀琀✀✀Ⰰ 搀攀猀挀爀 㴀 ✀✀匀攀氀攀挀琀椀漀渀 漀昀 眀栀椀挀栀 搀攀瀀愀爀琀洀攀渀琀猀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 爀攀氀愀琀攀搀 琀漀⸀✀✀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_multi_select_list_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Id for a radio button attribute.  Every attribute has an id which is unique across all rb attribute lists.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_attributes', @level2type=N'COLUMN',@level2name=N'doc_radiob_attr_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'A link to the radio button table entity definition, or radio button list name. Is allowed to be NULL so that a radio button attribut can be created before creating the table it will be assigned to.  ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_attributes', @level2type=N'COLUMN',@level2name=N'doc_radiob_list_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_attributes', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_attributes', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_attributes', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_attributes', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a unique key so that the attribute and list id pair can be referenced from the doc_radiob_assignement table as a foreign key.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_attributes', @level2type=N'CONSTRAINT',@level2name=N'UN_d_rb_attr_and_list_combined_key'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The attribute name must be unique across all document-related radio button lists.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_attributes', @level2type=N'CONSTRAINT',@level2name=N'UN_doc_radiob_attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table defines the attributes (metadata) options for a radio button option for a document.  An attribute option can be created in isolation and assigned to a radio button list later.  The list entity does not need to be defined first.    The name of the attribute must be unique across all document radio button lists. ਀䔀砀愀洀瀀氀攀㨀  洀渀攀洀 㴀 ✀✀䈀䤀✀✀㬀 渀愀洀攀 㴀 ✀✀䈀漀漀欀攀搀 椀渀✀✀Ⰰ 搀攀猀挀爀 㴀 ✀✀吀栀攀 搀漀挀甀洀攀渀琀 栀愀猀 戀攀攀渀 戀漀漀欀攀搀 椀渀 愀渀搀 椀猀 愀瘀愀椀氀愀戀氀攀 琀漀 戀攀 戀漀漀欀攀搀 漀甀琀⸀✀✀ 
An attribute can only be a member of one list.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀渀欀猀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 椀琀猀 愀猀猀漀挀椀愀琀攀搀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 搀攀昀椀渀椀琀椀漀渀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀䘀䬀开氀椀猀琀开栀愀猀开搀漀挀开搀戀开愀琀琀爀椀戀甀琀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀渀欀猀 琀漀 琀栀攀 搀漀挀甀洀攀渀琀 椀搀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀漀挀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 ⠀漀爀 椀琀攀洀⤀⸀  一漀琀攀 琀栀愀琀 琀栀攀 挀漀渀猀琀爀愀椀渀琀 琀栀愀琀 琀栀椀猀 愀琀琀爀椀戀甀琀攀 洀甀猀琀 戀攀 昀爀漀洀 琀栀攀 猀愀洀攀 氀椀猀琀 愀猀 搀开爀戀开氀椀猀琀开椀搀 椀猀 渀漀琀 挀漀渀猀琀爀愀椀渀攀搀 愀琀 琀栀攀 猀栀挀攀洀愀 氀攀瘀攀氀⸀  䠀攀渀挀攀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 洀甀猀琀 攀渀猀甀爀攀 琀栀愀 琀栀攀 愀琀琀爀椀戀甀琀攀 椀猀 愀 洀攀洀戀攀爀 漀昀 琀栀攀 最椀瘀攀渀 氀椀猀琀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀漀挀开爀愀搀椀漀戀开愀琀琀爀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀渀欀猀 琀漀 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 渀愀洀攀⸀  䤀猀 愀 挀漀洀瀀漀猀椀琀攀 欀攀礀 眀椀琀栀 琀栀攀 搀漀挀开椀搀 猀漀 琀栀愀琀 漀渀氀礀 漀渀攀 爀愀搀椀漀 戀甀琀琀漀渀 昀爀漀洀 愀渀礀 最椀瘀攀渀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 挀愀渀 戀攀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀漀挀开爀愀搀椀漀戀开氀椀猀琀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 愀氀氀漀眀猀 愀 洀愀渀礀ⴀ琀漀ⴀ洀愀渀礀 爀攀氀愀琀椀漀渀猀栀椀瀀 戀攀琀眀攀攀渀 搀漀挀甀洀攀渀琀 䤀䐀猀 愀渀搀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀⸀  䠀攀渀挀攀 琀栀攀 挀漀洀瀀漀猀椀琀攀 瀀爀椀洀愀爀礀 欀攀礀 漀昀 搀漀挀开椀搀 愀渀搀 琀栀攀 椀搀 漀昀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 氀椀猀琀⸀  吀栀攀 琀愀戀氀攀 氀椀渀欀猀 琀漀最攀琀栀攀爀 琀栀攀 搀漀挀开椀搀Ⰰ 琀栀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 ⠀攀⸀最⸀ ✀✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 匀琀愀琀甀猀✀✀⤀ 愀渀搀 琀栀攀 瘀愀氀甀攀 ⠀攀⸀最⸀ ✀✀䈀漀漀欀攀搀 椀渀✀✀⤀⸀   
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The radio button attribute id and associated list id pair must match the pair in the doc_radio_button_attributes table record.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_links', @level2type=N'CONSTRAINT',@level2name=N'FK_doc_has_radio_button'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Ensures that the radio button list id entered is valid' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_links', @level2type=N'CONSTRAINT',@level2name=N'FK_doc_has_radio_button_list'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_list_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_list_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_list_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_list_names', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An editor who has edit permission for a document may link a radio button attribute to the document.  This field is used to prevent the linking of an item from this list to a document by a user who does not have controller permission.  For example, changing the status of a document to Published might be restricted to controllers only and not available to editors. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_list_names', @level2type=N'COLUMN',@level2name=N'restricted'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The list name must be unique within the set of all document-related radio button list names.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_list_names', @level2type=N'CONSTRAINT',@level2name=N'UN_doc_radiob_attr_list_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table defines the name of a radio button table for assigning a radio button metadata to a document.  One document can have many such radio button metadata tables. ਀䔀砀愀洀瀀氀攀㨀 洀渀攀洀 㴀 ✀✀䐀䈀匀✀✀Ⰰ 渀愀洀攀 㴀 ✀✀䐀漀挀甀洀攀渀琀 䈀漀漀欀椀渀最 匀琀愀琀甀猀✀✀Ⰰ 搀攀猀挀爀 㴀 ✀✀圀栀攀琀栀攀爀 琀栀攀 搀漀挀甀洀攀渀琀 椀猀 戀漀漀欀攀搀 椀渀 漀爀 戀漀漀欀攀搀 漀甀琀⸀✀✀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radio_button_list_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Links a document radio button attribute with filter groups.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_radiob_attr_fgroup_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_real_number_field_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_real_number_field_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_real_number_field_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The units of the real number value.' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_real_number_field_names', @level2type=N'COLUMN',@level2name=N'unit_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table is the name of a real number field for a document. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀 爀攀愀氀 渀甀洀戀攀爀 眀栀椀挀栀 椀猀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 愀猀 愀渀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀搀漀挀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀爀攀愀氀开瘀愀氀甀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 愀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀 昀椀攀氀搀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀 愀渀搀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'doc_attr', @level1type=N'TABLE',@level1name=N'doc_real_number_values'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_date_field_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_date_field_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_date_field_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The name of the date field must be unique.' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_date_field_names', @level2type=N'CONSTRAINT',@level2name=N'UN_file_date_name_attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of a date field for a file.  E.g. mnem = ''DOI'', attr_name = ''Date of Issue'', descr = ''Date when the release was issued.''਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开搀愀琀攀开昀椀攀氀搀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 愀 搀愀琀攀 昀椀攀氀搀 眀椀琀栀 愀 昀椀氀攀 愀渀搀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_date_values'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_free_text_field_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_free_text_field_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_free_text_field_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of a free text field for a file.  E.g. mnen = ''NARR'', attr_name = ''File narrative'', descr = ''A narrative of the details of this file release.''਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 愀 昀爀攀攀 琀攀砀琀 昀椀攀氀搀 眀椀琀栀 愀 昀椀氀攀⸀   
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_free_text_values'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_integer_field_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_integer_field_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_integer_field_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Units of measure for the integer value.' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_integer_field_names', @level2type=N'COLUMN',@level2name=N'unit_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The name must be unique' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_integer_field_names', @level2type=N'CONSTRAINT',@level2name=N'UN_file_int_name_attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of an integer number field for a file.  E.g. mnem = ''PAGES'', attr_name = ''Number of pages'', descr = ''The number of pages of the document''਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开椀渀琀攀最攀爀开昀椀攀氀搀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 愀渀 椀渀琀攀最攀爀 昀椀攀氀搀 眀椀琀栀 愀 昀椀氀攀 愀渀搀 琀栀攀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 攀渀琀爀礀⸀  䔀⸀最⸀ 爀攀氀攀愀猀攀 渀甀洀戀攀爀㬀 渀甀洀戀攀爀 漀昀 瀀愀最攀猀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_integer_values'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Links a file multi-select attribute with filter groups.' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_ms_attr_fgroup_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_multi_select_attributes', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a unique key so that the attribute and list id pair can be referenced from the file_sm_assignement table as a foreign key.' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_multi_select_attributes', @level2type=N'INDEX',@level2name=N'UN_file_sm_attr_and_list_combined_key'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table defines the attributes (metadata) options for a multi-select option for a file.  An attribute option can be created in isolation and assigned to a multi-select table later.  The list name object does not need to be defined first.  ਀䔀愀挀栀 愀琀琀爀椀戀甀琀攀 挀愀渀 漀渀氀礀 戀攀氀漀渀最 琀漀 漀渀攀 氀椀猀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 氀椀渀欀 昀爀漀洀 琀栀攀 椀琀攀洀 椀渀 琀栀攀 氀椀猀琀 琀漀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 氀椀猀琀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀䘀䬀开昀椀氀攀开洀猀开愀琀琀爀椀戀甀琀攀开挀漀洀瀀爀椀猀攀猀开氀椀猀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀爀椀洀愀爀礀 欀攀礀 昀漀爀 琀栀攀 昀椀氀攀 琀漀 猀攀氀攀挀琀ⴀ洀愀渀礀 愀琀琀爀椀戀甀琀攀 氀椀渀欀 椀猀 愀 挀漀洀瀀漀猀椀琀攀 欀攀礀 漀昀 昀椀氀攀 䤀䐀Ⰰ 氀椀猀琀 䤀䐀 愀渀搀 愀琀琀爀椀戀甀琀攀 䤀䐀⸀  䠀攀渀挀攀 洀甀氀琀椀瀀氀攀 愀琀琀爀椀戀甀琀攀猀 昀爀漀洀 琀栀攀 猀愀洀攀 氀椀猀琀 挀愀渀 戀攀 氀椀渀欀攀搀 琀漀 愀 昀椀氀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀倀䬀开昀椀氀攀开猀洀开愀猀猀椀最渀洀攀渀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 挀爀攀愀琀攀猀 琀栀攀 琀栀爀攀攀ⴀ眀愀礀 氀椀渀欀 戀攀琀眀攀攀渀 愀 昀椀氀攀Ⰰ 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀 漀昀 洀攀琀愀搀愀琀愀 渀愀洀攀Ⰰ 愀渀搀 愀 洀攀琀愀搀愀琀愀 瘀愀氀甀攀⸀   䔀砀愀洀瀀氀攀㨀  ✀✀䰀椀猀琀 漀昀 瀀甀戀氀椀猀栀椀渀最 漀爀最愀渀椀猀愀琀椀漀渀猀 爀攀氀愀琀攀搀 琀漀 愀 昀椀氀攀⸀✀✀  
਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀ 
਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 愀琀琀爀椀戀甀琀攀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀倀漀猀椀琀椀漀渀 椀猀 愀渀 椀渀琀攀最攀爀 眀栀椀挀栀 愀氀氀漀眀猀 愀 氀椀猀琀 漀昀 漀瀀琀椀漀渀猀 椀渀 愀 琀愀戀氀攀 琀漀 戀攀 猀攀琀 椀渀 愀渀礀 漀爀搀攀爀⸀  吀栀攀 瘀愀氀甀攀 椀猀 甀渀挀漀渀猀琀爀愀椀渀攀搀 愀渀搀 洀甀猀琀 戀攀 猀攀琀 愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀椀猀琀开瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 昀椀氀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 愀挀爀漀猀猀 愀氀氀 昀椀氀攀ⴀ爀攀氀愀琀攀搀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 琀愀戀氀攀猀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀唀一开昀椀氀攀开猀洀开氀椀猀琀开愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 搀攀昀椀渀攀猀 琀栀攀 渀愀洀攀 漀昀 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 琀愀戀氀攀 昀漀爀 愀猀猀椀最渀椀渀最 洀甀氀琀椀ⴀ猀攀氀攀挀琀 洀攀琀愀搀愀琀愀 琀漀 愀 昀椀氀攀  伀渀攀 昀椀氀攀 挀愀渀 栀愀瘀攀 洀愀渀礀 猀甀挀栀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 洀攀琀愀搀愀琀愀 琀愀戀氀攀猀⸀  
Example: mnem = ''ORG'', attr_name = ''Organisation'', descr = ''List of publishing organisations related to a file.'' ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开洀甀氀琀椀开猀攀氀攀挀琀开氀椀猀琀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 愀琀琀爀椀戀甀琀攀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀倀漀猀椀琀椀漀渀 椀猀 愀渀 椀渀琀攀最攀爀 眀栀椀挀栀 愀氀氀漀眀猀 愀 氀椀猀琀 漀昀 漀瀀琀椀漀渀猀 椀渀 愀 琀愀戀氀攀 琀漀 戀攀 猀攀琀 椀渀 愀渀礀 漀爀搀攀爀⸀  吀栀攀 瘀愀氀甀攀 椀猀 甀渀挀漀渀猀琀爀愀椀渀攀搀 愀渀搀 洀甀猀琀 戀攀 猀攀琀 愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀椀猀琀开瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀 甀渀椀焀甀攀 欀攀礀 猀漀 琀栀愀琀 琀栀攀 愀琀琀爀椀戀甀琀攀 愀渀搀 氀椀猀琀 椀搀 瀀愀椀爀 挀愀渀 戀攀 爀攀昀攀爀攀渀挀攀搀 昀爀漀洀 琀栀攀 昀椀氀攀开爀愀搀椀漀戀开愀猀猀椀最渀攀洀攀渀琀 琀愀戀氀攀 愀猀 愀 昀漀爀攀椀最渀 欀攀礀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀唀一开昀开爀戀开愀琀琀爀开愀渀搀开愀琀琀爀开氀椀猀琀开挀漀洀戀椀渀攀搀开欀攀礀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 愀挀爀漀猀猀 愀氀氀 昀椀氀攀ⴀ爀攀氀愀琀攀搀 爀愀搀椀漀 戀甀琀琀漀渀 琀愀戀氀攀猀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀唀一开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 搀攀昀椀渀攀猀 琀栀攀 愀琀琀爀椀戀甀琀攀猀 ⠀洀攀琀愀搀愀琀愀⤀ 漀瀀琀椀漀渀猀 昀漀爀 愀 爀愀搀椀漀 戀甀琀琀漀渀 漀瀀琀椀漀渀 昀漀爀 愀 昀椀氀攀⸀  䄀渀 愀琀琀爀椀戀甀琀攀 漀瀀琀椀漀渀 挀愀渀 戀攀 挀爀攀愀琀攀搀 椀渀 椀猀漀氀愀琀椀漀渀 愀渀搀 愀猀猀椀最渀攀搀 琀漀 愀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀 氀愀琀攀爀⸀  吀栀攀 氀椀猀琀 攀渀琀椀琀礀 搀漀攀猀 渀漀琀 渀攀攀搀 琀漀 戀攀 搀攀昀椀渀攀搀 昀椀爀猀琀⸀  吀栀攀 愀琀琀爀椀戀甀琀攀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 愀挀爀漀猀猀 愀氀氀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 氀椀猀琀猀⸀  
Example:  mnem = ''SU''; name = ''Superseded'', descr = ''The file is a release which has been supeseded.''਀䄀渀 愀琀琀爀椀戀甀琀攀 挀愀渀 漀渀氀礀 戀攀 愀 洀攀洀戀攀爀 漀昀 漀渀攀 氀椀猀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_radio_button_attributes'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Links the radio button attribut to its associated radio button list definition.' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_radio_button_attributes', @level2type=N'CONSTRAINT',@level2name=N'FK_file_rb_attrib_comprises_list'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table allows a many-to-many relationship between file IDs and radio button list.  Hence the composite primary key of doc_id and the id of the name of the list.  The table links together the file_id, the radio button list (e.g. ''Revision Status'') and the value (e.g. ''Current Latest Revision'').  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 氀椀猀琀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 氀椀猀琀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀倀漀猀椀琀椀漀渀 椀猀 愀渀 椀渀琀攀最攀爀 眀栀椀挀栀 愀氀氀漀眀猀 愀 氀椀猀琀 漀昀 漀瀀琀椀漀渀猀 椀渀 愀 琀愀戀氀攀 琀漀 戀攀 猀攀琀 椀渀 愀渀礀 漀爀搀攀爀⸀  吀栀攀 瘀愀氀甀攀 椀猀 甀渀挀漀渀猀琀爀愀椀渀攀搀 愀渀搀 洀甀猀琀 戀攀 猀攀琀 愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀椀猀琀开瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 攀搀椀琀漀爀 眀栀漀 栀愀猀 攀搀椀琀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 愀 昀椀氀攀 洀愀礀 氀椀渀欀 愀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 琀漀 琀栀攀 昀椀氀攀⸀  吀栀椀猀 昀椀攀氀搀 椀猀 甀猀攀搀 琀漀 瀀爀攀瘀攀渀琀 琀栀攀 氀椀渀欀椀渀最 漀昀 愀渀 椀琀攀洀 昀爀漀洀 琀栀椀猀 氀椀猀琀 琀漀 愀 昀椀氀攀 戀礀 愀 甀猀攀爀 眀栀漀 搀漀攀猀 渀漀琀 栀愀瘀攀 挀漀渀琀爀漀氀氀攀爀 瀀攀爀洀椀猀猀椀漀渀⸀  䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 挀栀愀渀最椀渀最 琀栀攀 猀琀愀琀甀猀 漀昀 愀 昀椀氀攀 琀漀 倀甀戀氀椀猀栀攀搀 洀椀最栀琀 戀攀 爀攀猀琀爀椀挀琀攀搀 琀漀 挀漀渀琀爀漀氀氀攀爀猀 漀渀氀礀 愀渀搀 渀漀琀 愀瘀愀椀氀愀戀氀攀 琀漀 攀搀椀琀漀爀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀爀攀猀琀爀椀挀琀攀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 愀琀琀爀椀戀甀琀攀 氀椀猀琀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀唀一开昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 搀攀昀椀渀攀猀 琀栀攀 渀愀洀攀 漀昀 愀 爀愀搀椀漀 戀甀琀琀漀渀 琀愀戀氀攀 昀漀爀 愀猀猀椀最渀椀渀最 愀 爀愀搀椀漀 戀甀琀琀漀渀 洀攀琀愀搀愀琀愀 琀漀 愀 昀椀氀攀⸀  伀渀攀 昀椀氀攀 挀愀渀 栀愀瘀攀 洀愀渀礀 猀甀挀栀 爀愀搀椀漀 戀甀琀琀漀渀 洀攀琀愀搀愀琀愀 琀愀戀氀攀猀⸀  
Example: mnem = ''TYPE'', name = ''File type'', descr = ''Whether the file is a native or rendition type file.''਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀猀琀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀渀欀猀 愀 昀椀氀攀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 眀椀琀栀 昀椀氀琀攀爀 最爀漀甀瀀猀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀开昀最爀漀甀瀀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 愀琀琀爀椀戀甀琀攀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 甀渀椀琀猀 漀昀 洀攀愀猀甀爀攀 昀漀爀 琀栀攀 爀攀愀氀 渀甀洀戀攀爀 瘀愀氀甀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀甀渀椀琀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 愀 爀攀愀氀 渀甀洀戀攀爀 昀椀攀氀搀 昀漀爀 愀 昀椀氀攀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'file_attr', @level1type=N'TABLE',@level1name=N'file_real_number_field_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links a real number field with a file and associated data.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀椀氀攀开愀琀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开瘀愀氀甀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀 昀椀氀琀攀爀 最爀漀甀瀀 渀愀洀攀 洀甀猀琀 戀攀 甀渀椀焀甀攀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀琀攀爀开最爀漀甀瀀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䤀一䐀䔀堀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀唀一开昀椀氀琀攀爀开最爀漀甀瀀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 昀椀氀琀攀爀 最爀漀甀瀀 椀猀 愀 昀氀愀最 琀栀愀琀 挀愀渀 戀攀 甀猀攀搀 昀漀爀 甀猀攀爀ⴀ挀甀猀琀漀洀椀猀攀搀 焀甀攀爀椀攀猀 猀甀挀栀 愀猀 爀攀琀爀椀攀瘀椀渀最 漀渀氀礀 昀椀氀攀猀 眀椀琀栀 愀 猀琀愀琀甀猀 漀昀 挀甀爀爀攀渀琀 氀愀琀攀猀琀 爀攀瘀椀猀椀漀渀 愀渀搀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 眀椀琀栀 猀琀愀琀甀猀 漀昀 瀀甀戀氀椀猀栀攀搀⸀  刀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀猀 漀昀 ✀✀挀甀爀爀攀渀琀 氀愀琀攀猀琀 爀攀瘀椀猀椀漀渀✀✀ 昀漀爀 昀椀氀攀猀 愀渀搀 ✀✀瀀甀戀氀椀猀栀攀搀✀✀ 昀漀爀 搀漀挀甀洀攀渀琀猀 挀愀渀 戀攀 氀椀渀欀攀搀 琀漀 愀 昀椀氀琀攀爀 最爀漀甀瀀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'filter_groups'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_booking_comnts_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_booking_date_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_booking_id_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_booking_release_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_booking_status_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_booking_user_id_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_booking_usernm_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table allows multiple default values to be selected for a document common object multi-select field on a form.  The table informs the application layer but does not apply defaults at the database layer. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀圀栀攀琀栀攀爀 琀栀攀 昀椀攀氀搀 椀猀 洀愀渀搀愀琀漀爀礀 愀琀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀 氀攀瘀攀氀⸀  吀栀椀猀 昀椀攀氀搀 椀猀 漀渀氀礀 甀猀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀  吀栀攀 挀漀渀猀琀爀愀椀渀琀 椀猀 渀漀琀 攀渀昀漀爀挀攀搀 愀琀 琀栀攀 搀愀琀愀戀愀猀攀 氀愀礀攀爀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀愀渀搀愀琀漀爀礀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 昀椀攀氀搀 愀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀攀渀最琀栀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 昀椀攀氀搀 漀渀 愀 昀漀爀洀Ⰰ 攀渀挀漀搀攀搀 椀渀 愀 洀愀渀渀攀爀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀  吀栀攀 挀漀氀甀洀渀 椀猀 甀猀攀搀 栀漀眀攀瘀攀爀 戀礀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 琀漀 猀漀爀琀 搀愀琀愀 愀挀挀漀爀搀椀渀最 琀漀 琀栀椀猀 昀椀攀氀搀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㄀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㈀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㌀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_com_obj_ms_lst_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀漀洀开漀戀樀开爀戀开氀猀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 椀渀搀椀挀愀琀椀渀最 琀栀愀琀 琀栀攀 最椀瘀攀渀 昀椀攀氀搀 椀猀 椀渀挀氀甀搀攀搀 椀渀 琀栀攀 昀漀爀洀⸀  
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开椀搀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 椀渀搀椀挀愀琀椀渀最 琀栀愀琀 琀栀攀 最椀瘀攀渀 昀椀攀氀搀 椀猀 椀渀挀氀甀搀攀搀 椀渀 琀栀攀 昀漀爀洀⸀  
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开戀礀开渀洀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 椀渀搀椀挀愀琀椀渀最 琀栀愀琀 琀栀攀 最椀瘀攀渀 昀椀攀氀搀 椀猀 椀渀挀氀甀搀攀搀 椀渀 琀栀攀 昀漀爀洀⸀  
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开挀爀攀愀琀攀搀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀昀漀爀洀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀圀栀攀琀栀攀爀 琀栀攀 昀椀攀氀搀 椀猀 洀愀渀搀愀琀漀爀礀 愀琀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀 氀攀瘀攀氀⸀  吀栀椀猀 昀椀攀氀搀 椀猀 漀渀氀礀 甀猀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀  吀栀攀 挀漀渀猀琀爀愀椀渀琀 椀猀 渀漀琀 攀渀昀漀爀挀攀搀 愀琀 琀栀攀 搀愀琀愀戀愀猀攀 氀愀礀攀爀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀愀渀搀愀琀漀爀礀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 昀椀攀氀搀 愀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀攀渀最琀栀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 昀椀攀氀搀 漀渀 愀 昀漀爀洀Ⰰ 攀渀挀漀搀攀搀 椀渀 愀 洀愀渀渀攀爀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㄀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㈀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㌀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_date_field_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Whether the field is mandatory at the user interface level.  This field is only used to inform the application layer.  The constraint is not enforced at the database layer. ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_free_text_field_links', @level2type=N'COLUMN',@level2name=N'mandatory'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The length of the field as displayed on the user interface.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_free_text_field_links', @level2type=N'COLUMN',@level2name=N'length'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The position of the field on a form, encoded in a manner determined by the application layer.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_free_text_field_links', @level2type=N'COLUMN',@level2name=N'position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_free_text_field_links', @level2type=N'COLUMN',@level2name=N'attribute1'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_free_text_field_links', @level2type=N'COLUMN',@level2name=N'attribute2'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_free_text_field_links', @level2type=N'COLUMN',@level2name=N'attribute3'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开昀爀攀攀开琀攀砀琀开昀椀攀氀搀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀   一漀琀攀 琀栀愀琀 昀甀渀挀琀椀漀渀猀 愀爀攀 最爀漀甀瀀攀搀 椀渀琀漀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 栀漀眀攀瘀攀爀 琀栀攀 氀椀猀琀猀 愀爀攀 漀瘀攀爀氀愀瀀瀀椀渀最 猀攀琀猀 愀渀搀 栀攀渀挀攀 琀栀攀爀攀 挀愀渀 戀攀 洀漀爀攀 琀栀愀渀 漀渀攀 氀椀猀琀 渀愀洀攀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 漀渀攀 昀甀渀挀琀椀漀渀⸀  䘀漀爀 愀 猀椀渀最氀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 昀漀爀洀 昀椀攀氀搀 搀攀昀椀渀琀椀漀渀 琀栀攀爀攀 挀愀渀 戀攀 洀漀爀攀 琀栀愀渀 漀渀攀 搀攀昀愀甀氀琀 瘀愀氀甀攀 猀椀渀挀攀 漀渀攀 搀漀挀甀洀攀渀琀 挀愀渀 戀攀 氀椀渀欀攀搀 眀椀琀栀 洀漀爀攀 琀栀愀渀 漀渀攀 搀甀琀礀 昀甀渀挀琀椀漀渀⸀  
This table is used for forms but not for two-dimensional document data table generation. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开昀甀渀挀琀椀漀渀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀   一漀琀攀 琀栀愀琀 昀甀渀挀琀椀漀渀猀 愀爀攀 最爀漀甀瀀攀搀 椀渀琀漀 昀甀渀挀琀椀漀渀 氀椀猀琀猀 栀漀眀攀瘀攀爀 琀栀攀 氀椀猀琀猀 愀爀攀 漀瘀攀爀氀愀瀀瀀椀渀最 猀攀琀猀 愀渀搀 栀攀渀挀攀 琀栀攀爀攀 挀愀渀 戀攀 洀漀爀攀 琀栀愀渀 漀渀攀 氀椀猀琀 渀愀洀攀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 漀渀攀 昀甀渀挀琀椀漀渀⸀   䘀漀爀 愀 猀椀渀最氀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀 昀漀爀洀 昀椀攀氀搀 搀攀昀椀渀琀椀漀渀 琀栀攀爀攀 挀愀渀 戀攀 洀漀爀攀 琀栀愀渀 漀渀攀 搀攀昀愀甀氀琀 瘀愀氀甀攀 猀椀渀挀攀 漀渀攀 搀漀挀甀洀攀渀琀 挀愀渀 戀攀 氀椀渀欀攀搀 眀椀琀栀 洀漀爀攀 琀栀愀渀 漀渀攀 搀甀琀礀 昀甀渀挀琀椀漀渀 氀椀猀琀⸀  
This table is used for forms but not for two-dimensional document data table generation. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_function_list_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Whether the field is mandatory at the user interface level.  This field is only used to inform the application layer.  The constraint is not enforced at the database layer. ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_integer_field_links', @level2type=N'COLUMN',@level2name=N'mandatory'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The length of the field as displayed on the user interface.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_integer_field_links', @level2type=N'COLUMN',@level2name=N'length'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The position of the field on a form, encoded in a manner determined by the application layer.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_integer_field_links', @level2type=N'COLUMN',@level2name=N'position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_integer_field_links', @level2type=N'COLUMN',@level2name=N'attribute1'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_integer_field_links', @level2type=N'COLUMN',@level2name=N'attribute2'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_integer_field_links', @level2type=N'COLUMN',@level2name=N'attribute3'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_integer_field_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_lock_status_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table allows multiple default values to be selected for a document multi-select attribute field on a form.  The table informs the application layer but does not apply defaults at the database layer. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开搀攀昀愀甀氀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀圀栀攀琀栀攀爀 琀栀攀 昀椀攀氀搀 椀猀 洀愀渀搀愀琀漀爀礀 愀琀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀 氀攀瘀攀氀⸀  吀栀椀猀 昀椀攀氀搀 椀猀 漀渀氀礀 甀猀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀  吀栀攀 挀漀渀猀琀爀愀椀渀琀 椀猀 渀漀琀 攀渀昀漀爀挀攀搀 愀琀 琀栀攀 搀愀琀愀戀愀猀攀 氀愀礀攀爀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀愀渀搀愀琀漀爀礀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 昀椀攀氀搀 愀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀攀渀最琀栀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 昀椀攀氀搀 漀渀 愀 昀漀爀洀Ⰰ 攀渀挀漀搀攀搀 椀渀 愀 洀愀渀渀攀爀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㄀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㈀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㌀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
This table is used for forms but not for two-dimensional document data table generation. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀   一漀琀攀 琀栀愀琀 椀渀搀椀瘀椀搀甀愀氀猀 愀爀攀 最爀漀甀瀀攀搀 椀渀琀漀 瀀攀漀瀀氀攀 氀椀猀琀猀Ⰰ 栀漀眀攀瘀攀爀 琀栀攀 氀椀猀琀猀 愀爀攀 漀瘀攀爀氀愀瀀瀀椀渀最 猀攀琀猀 愀渀搀 栀攀渀挀攀 琀栀攀爀攀 挀愀渀 戀攀 洀漀爀攀 琀栀愀渀 漀渀攀 氀椀猀琀 渀愀洀攀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 漀渀攀 椀渀搀椀瘀椀搀甀愀氀⸀  
This table is used for forms but not for two-dimensional document data table generation. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_people_list_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Whether the field is mandatory at the user interface level.  This field is only used to inform the application layer.  The constraint is not enforced at the database layer. ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_radio_button_links', @level2type=N'COLUMN',@level2name=N'mandatory'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The length of the field as displayed on the user interface.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_radio_button_links', @level2type=N'COLUMN',@level2name=N'length'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The position of the field on a form, encoded in a manner determined by the application layer.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_radio_button_links', @level2type=N'COLUMN',@level2name=N'position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_radio_button_links', @level2type=N'COLUMN',@level2name=N'attribute1'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_radio_button_links', @level2type=N'COLUMN',@level2name=N'attribute2'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_radio_button_links', @level2type=N'COLUMN',@level2name=N'attribute3'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_radio_button_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Calls a function to check that default_doc_rb_attr_id corresponds to the same doc_radiob_list_id in doc_attr_doc_radio_button_attributes.  Otherwise a radio button attribute could be entered which is not from the list defined by doc_radiob_list_id in the same record.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_radio_button_links', @level2type=N'CONSTRAINT',@level2name=N'CK_form_doc_radio_button_attr_referential_integrity'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Whether the field is mandatory at the user interface level.  This field is only used to inform the application layer.  The constraint is not enforced at the database layer. ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_real_number_links', @level2type=N'COLUMN',@level2name=N'mandatory'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The length of the field as displayed on the user interface.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_real_number_links', @level2type=N'COLUMN',@level2name=N'length'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The position of the field on a form, encoded in a manner determined by the application layer.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_real_number_links', @level2type=N'COLUMN',@level2name=N'position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_real_number_links', @level2type=N'COLUMN',@level2name=N'attribute1'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_real_number_links', @level2type=N'COLUMN',@level2name=N'attribute2'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_real_number_links', @level2type=N'COLUMN',@level2name=N'attribute3'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 椀渀搀椀挀愀琀椀渀最 琀栀愀琀 琀栀攀 最椀瘀攀渀 昀椀攀氀搀 椀猀 椀渀挀氀甀搀攀搀 椀渀 琀栀攀 昀漀爀洀⸀  
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开搀漀挀开琀爀愀渀猀愀挀琀椀漀渀开最爀瀀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀    
This table is used for forms but not for two-dimensional document data table generation. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_doc_user_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table allows multiple default values to be selected for a file common object multi-select field on a form.  The table informs the application layer but does not apply defaults at the database layer. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开搀攀昀愀甀氀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀圀栀攀琀栀攀爀 琀栀攀 昀椀攀氀搀 椀猀 洀愀渀搀愀琀漀爀礀 愀琀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀 氀攀瘀攀氀⸀  吀栀椀猀 昀椀攀氀搀 椀猀 漀渀氀礀 甀猀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀  吀栀攀 挀漀渀猀琀爀愀椀渀琀 椀猀 渀漀琀 攀渀昀漀爀挀攀搀 愀琀 琀栀攀 搀愀琀愀戀愀猀攀 氀愀礀攀爀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀愀渀搀愀琀漀爀礀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 昀椀攀氀搀 愀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀攀渀最琀栀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 昀椀攀氀搀 漀渀 愀 昀漀爀洀Ⰰ 攀渀挀漀搀攀搀 椀渀 愀 洀愀渀渀攀爀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㄀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㈀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㌀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
This table is used for forms but not for two-dimensional document data table generation. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀漀洀开漀戀樀开洀猀开氀猀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_com_obj_rb_lst_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_content_hash_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_created_by_id_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_created_by_nm_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开挀爀攀愀琀攀搀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀圀栀攀琀栀攀爀 琀栀攀 昀椀攀氀搀 椀猀 洀愀渀搀愀琀漀爀礀 愀琀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀 氀攀瘀攀氀⸀  吀栀椀猀 昀椀攀氀搀 椀猀 漀渀氀礀 甀猀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀  吀栀攀 挀漀渀猀琀爀愀椀渀琀 椀猀 渀漀琀 攀渀昀漀爀挀攀搀 愀琀 琀栀攀 搀愀琀愀戀愀猀攀 氀愀礀攀爀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀愀渀搀愀琀漀爀礀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 昀椀攀氀搀 愀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀攀渀最琀栀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 昀椀攀氀搀 漀渀 愀 昀漀爀洀Ⰰ 攀渀挀漀搀攀搀 椀渀 愀 洀愀渀渀攀爀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㄀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㈀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㌀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开搀愀琀攀开昀椀攀氀搀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_free_text_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.  Note that functions are grouped into function lists however the lists are overlapping sets and hence there can be more than one list name associated with one function. ਀吀栀椀猀 琀愀戀氀攀 椀猀 甀猀攀搀 昀漀爀 昀漀爀洀猀 戀甀琀 渀漀琀 昀漀爀 琀眀漀ⴀ搀椀洀攀渀猀椀漀渀愀氀 搀漀挀甀洀攀渀琀 搀愀琀愀 琀愀戀氀攀 最攀渀攀爀愀琀椀漀渀⸀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_function_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.   Note that functions are grouped into function lists however the lists are overlapping sets and hence there can be more than one list name associated with one function. ਀吀栀椀猀 琀愀戀氀攀 椀猀 甀猀攀搀 昀漀爀 昀漀爀洀猀 戀甀琀 渀漀琀 昀漀爀 琀眀漀ⴀ搀椀洀攀渀猀椀漀渀愀氀 搀漀挀甀洀攀渀琀 搀愀琀愀 琀愀戀氀攀 最攀渀攀爀愀琀椀漀渀⸀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_function_list_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Whether the field is mandatory at the user interface level.  This field is only used to inform the application layer.  The constraint is not enforced at the database layer. ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_integer_field_links', @level2type=N'COLUMN',@level2name=N'mandatory'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The length of the field as displayed on the user interface.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_integer_field_links', @level2type=N'COLUMN',@level2name=N'length'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The position of the field on a form, encoded in a manner determined by the application layer.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_integer_field_links', @level2type=N'COLUMN',@level2name=N'position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_integer_field_links', @level2type=N'COLUMN',@level2name=N'attribute1'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_integer_field_links', @level2type=N'COLUMN',@level2name=N'attribute2'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_integer_field_links', @level2type=N'COLUMN',@level2name=N'attribute3'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_integer_field_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table allows multiple default values to be selected for a document multi-select attribute field on a form.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_multi_sel_defaults'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Whether the field is mandatory at the user interface level.  This field is only used to inform the application layer.  The constraint is not enforced at the database layer. ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_multi_sel_list_links', @level2type=N'COLUMN',@level2name=N'mandatory'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The length of the field as displayed on the user interface.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_multi_sel_list_links', @level2type=N'COLUMN',@level2name=N'length'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The position of the field on a form, encoded in a manner determined by the application layer.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_multi_sel_list_links', @level2type=N'COLUMN',@level2name=N'position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_multi_sel_list_links', @level2type=N'COLUMN',@level2name=N'attribute1'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_multi_sel_list_links', @level2type=N'COLUMN',@level2name=N'attribute2'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An unspecified attribute.' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_multi_sel_list_links', @level2type=N'COLUMN',@level2name=N'attribute3'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, pointing to an associated data object.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开洀甀氀琀椀开猀攀氀开氀椀猀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 椀渀搀椀挀愀琀椀渀最 琀栀愀琀 琀栀攀 最椀瘀攀渀 昀椀攀氀搀 椀猀 椀渀挀氀甀搀攀搀 椀渀 琀栀攀 昀漀爀洀⸀  
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开渀愀洀攀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀    一漀琀攀 琀栀愀琀 椀渀搀椀瘀椀搀甀愀氀猀 愀爀攀 最爀漀甀瀀攀搀 椀渀琀漀 瀀攀漀瀀氀攀 氀椀猀琀猀Ⰰ 栀漀眀攀瘀攀爀 琀栀攀 氀椀猀琀猀 愀爀攀 漀瘀攀爀氀愀瀀瀀椀渀最 猀攀琀猀 愀渀搀 栀攀渀挀攀 琀栀攀爀攀 挀愀渀 戀攀 洀漀爀攀 琀栀愀渀 漀渀攀 氀椀猀琀 渀愀洀攀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 漀渀攀 椀渀搀椀瘀椀搀甀愀氀⸀  
This table is used for forms but not for two-dimensional document data table generation. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀圀栀攀琀栀攀爀 琀栀攀 昀椀攀氀搀 椀猀 洀愀渀搀愀琀漀爀礀 愀琀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀 氀攀瘀攀氀⸀  吀栀椀猀 昀椀攀氀搀 椀猀 漀渀氀礀 甀猀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀  吀栀攀 挀漀渀猀琀爀愀椀渀琀 椀猀 渀漀琀 攀渀昀漀爀挀攀搀 愀琀 琀栀攀 搀愀琀愀戀愀猀攀 氀愀礀攀爀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀愀渀搀愀琀漀爀礀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 昀椀攀氀搀 愀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀攀渀最琀栀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 昀椀攀氀搀 漀渀 愀 昀漀爀洀Ⰰ 攀渀挀漀搀攀搀 椀渀 愀 洀愀渀渀攀爀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㄀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㈀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㌀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀愀氀氀猀 愀 昀甀渀挀琀椀漀渀 琀漀 挀栀攀挀欀 琀栀愀琀 搀攀昀愀甀氀琀开昀椀氀攀开爀戀开愀琀琀爀开椀搀 挀漀爀爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 猀愀洀攀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 椀渀 昀椀氀攀开愀琀琀爀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开愀琀琀爀椀戀甀琀攀猀⸀  伀琀栀攀爀眀椀猀攀 愀 爀愀搀椀漀 戀甀琀琀漀渀 愀琀琀爀椀戀甀琀攀 挀漀甀氀搀 戀攀 攀渀琀攀爀攀搀 眀栀椀挀栀 椀猀 渀漀琀 昀爀漀洀 琀栀攀 氀椀猀琀 搀攀昀椀渀攀搀 戀礀 昀椀氀攀开爀愀搀椀漀戀开氀椀猀琀开椀搀 椀渀 琀栀攀 猀愀洀攀 爀攀挀漀爀搀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀愀搀椀漀开戀甀琀琀漀渀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀䌀䬀开昀漀爀洀开昀椀氀攀开爀愀搀椀漀戀开愀琀琀爀椀戀甀琀攀开椀渀琀攀最爀椀琀礀开挀栀攀挀欀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀圀栀攀琀栀攀爀 琀栀攀 昀椀攀氀搀 椀猀 洀愀渀搀愀琀漀爀礀 愀琀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀 氀攀瘀攀氀⸀  吀栀椀猀 昀椀攀氀搀 椀猀 漀渀氀礀 甀猀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀  吀栀攀 挀漀渀猀琀爀愀椀渀琀 椀猀 渀漀琀 攀渀昀漀爀挀攀搀 愀琀 琀栀攀 搀愀琀愀戀愀猀攀 氀愀礀攀爀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀愀渀搀愀琀漀爀礀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 氀攀渀最琀栀 漀昀 琀栀攀 昀椀攀氀搀 愀猀 搀椀猀瀀氀愀礀攀搀 漀渀 琀栀攀 甀猀攀爀 椀渀琀攀爀昀愀挀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀攀渀最琀栀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀漀猀椀琀椀漀渀 漀昀 琀栀攀 昀椀攀氀搀 漀渀 愀 昀漀爀洀Ⰰ 攀渀挀漀搀攀搀 椀渀 愀 洀愀渀渀攀爀 搀攀琀攀爀洀椀渀攀搀 戀礀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㄀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㈀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 甀渀猀瀀攀挀椀昀椀攀搀 愀琀琀爀椀戀甀琀攀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀攀愀氀开渀甀洀戀攀爀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀椀戀甀琀攀㌀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_real_number_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form, indicating that the given field is included in the form. ਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开爀攀琀攀渀琀椀漀渀开搀愀琀攀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 椀渀搀椀挀愀琀椀渀最 琀栀愀琀 琀栀攀 最椀瘀攀渀 昀椀攀氀搀 椀猀 椀渀挀氀甀搀攀搀 椀渀 琀栀攀 昀漀爀洀⸀  
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开猀椀稀攀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 椀渀搀椀挀愀琀椀渀最 琀栀愀琀 琀栀攀 最椀瘀攀渀 昀椀攀氀搀 椀猀 椀渀挀氀甀搀攀搀 椀渀 琀栀攀 昀漀爀洀⸀  
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开昀椀氀攀开琀爀愀渀猀愀挀琀渀开最爀瀀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀Ⰰ 瀀漀椀渀琀椀渀最 琀漀 愀渀 愀猀猀漀挀椀愀琀攀搀 搀愀琀愀 漀戀樀攀挀琀⸀    
This table is used for forms but not for two-dimensional document data table generation. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_file_user_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_group_names', @level2type=N'COLUMN',@level2name=N'form_group_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_group_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_group_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_group_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This allows forms to be grouped.਀ 
Note that The column attr_name is set to NOT NULL and UNIQUE.  In some circumstances however this table may be superfluous if there is a desire to create a 1:1 relationship and not impose on the user to create a group.  In that case then the application layer can automatcially enter a small guid for the name and hide this table data from the user, effectively bypassing the grouping.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开最爀漀甀瀀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 愀琀琀爀椀戀甀琀攀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀昀漀爀洀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 椀搀攀渀琀椀昀椀攀爀 昀漀爀 愀 昀漀爀洀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_identifier_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Form to tag defaults link.  This links a form field to default tags for the given form.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 愀渀 攀氀攀洀攀渀琀 漀昀 愀 昀漀爀洀 昀漀爀 搀漀挀甀洀攀渀琀 琀愀最猀⸀  䐀攀昀愀甀氀琀猀 愀爀攀 猀琀漀爀攀搀 椀渀 昀漀爀洀开琀愀最开搀攀昀愀甀氀琀猀⸀  䄀 昀漀爀洀开椀搀 爀攀挀漀爀搀 椀渀 琀栀椀猀 琀愀戀氀攀 猀椀洀瀀氀礀 椀渀昀漀爀洀猀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 琀栀愀琀 琀栀攀 昀漀爀洀 愀挀挀攀瀀琀猀 琀愀最猀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀昀漀爀洀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开琀愀最开昀椀攀氀搀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䘀漀爀洀 琀漀 琀愀最 最爀漀甀瀀 椀搀攀渀琀椀昀椀攀爀 渀愀洀攀 搀攀昀愀甀氀琀猀⸀  吀栀椀猀 氀椀渀欀猀 愀 琀愀最 最爀漀甀瀀 昀漀爀洀 昀椀攀氀搀 琀漀 搀攀昀愀甀氀琀 琀愀最 最爀漀甀瀀猀 昀漀爀 愀 最椀瘀攀渀 昀漀爀洀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_tag_group_defaults'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates an element of a form for document tag groups.  Defaults are stored in form_tag_group_defaults.  A form_id record in this table simply informs the application that the form accepts tag groups.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀ 
' , @level0type=N'SCHEMA',@level0name=N'forms', @level1type=N'TABLE',@level1name=N'form_tag_group_fields'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a table of ISO 639-1 language codes.  It is used for selecting the language of messages which are visible to the end user. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀洀攀猀猀愀最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀氀愀渀最甀愀最攀开氀椀猀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀一漀琀攀 琀栀愀琀 琀栀攀 挀漀渀琀攀渀琀猀 漀昀 琀栀椀猀 昀椀攀氀搀 愀爀攀 爀攀昀攀爀爀攀搀 琀漀 愀猀 栀愀爀搀 挀漀搀攀搀 瀀愀爀愀洀攀琀攀爀猀 椀渀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀洀攀猀猀愀最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀洀攀猀猀愀最攀开搀攀琀愀椀氀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀攀猀猀愀最攀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䔀愀挀栀 洀攀猀猀愀最攀 洀甀猀琀 戀攀 甀渀椀焀甀攀 昀漀爀 愀 最椀瘀攀渀 氀愀渀最甀愀最攀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀洀攀猀猀愀最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀洀攀猀猀愀最攀开搀攀琀愀椀氀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䤀一䐀䔀堀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀唀一开氀愀渀最甀愀最攀开洀攀猀猀愀最攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 挀漀渀琀愀椀渀猀 琀栀攀 搀攀琀愀椀氀猀 漀昀 爀攀琀甀爀渀攀搀 洀攀猀猀愀最攀猀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'messaging', @level1type=N'TABLE',@level1name=N'message_details'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Note that the contents of this field are referred to as hard coded parameters in stored procedures.' , @level0type=N'SCHEMA',@level0name=N'messaging', @level1type=N'TABLE',@level1name=N'message_id_list', @level2type=N'COLUMN',@level2name=N'message_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Note that this is not the messge that is presented to the end user.  It is merely a description for develpper purposes.  The message texts are contained in the message_details table.' , @level0type=N'SCHEMA',@level0name=N'messaging', @level1type=N'TABLE',@level1name=N'message_id_list', @level2type=N'COLUMN',@level2name=N'message_description'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a list of IDs for messages visible to the end user.  The table ensures that messages will be unique, even though they can exist in different languages. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀洀攀猀猀愀最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀洀攀猀猀愀最攀开椀搀开氀椀猀琀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 搀漀挀甀洀攀渀琀猀 琀漀 搀甀琀礀 昀甀渀挀琀椀漀渀猀⸀  䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 愀 搀漀挀甀洀攀渀琀 洀愀礀 戀攀 氀椀渀欀攀搀 琀漀 愀 搀漀挀甀洀攀渀琀 爀攀瘀椀攀眀攀爀 戀礀 昀甀渀挀琀椀漀渀Ⰰ 愀猀 漀瀀瀀漀猀攀搀 琀漀 氀椀渀欀椀渀最 搀椀爀攀挀琀氀礀 琀漀 愀 氀椀猀琀 漀昀 瀀攀漀瀀氀攀 渀愀洀攀猀⸀   
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开琀漀开昀甀渀挀琀椀漀渀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 搀漀挀甀洀攀渀琀猀 琀漀 氀椀猀琀猀 漀昀 搀甀琀礀 昀甀渀挀琀椀漀渀猀⸀  䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 愀 搀漀挀甀洀攀渀琀 洀愀礀 戀攀 氀椀渀欀攀搀 琀漀 愀 氀椀猀琀 漀昀 搀漀挀甀洀攀渀琀 爀攀瘀椀攀眀攀爀猀 戀礀 昀甀渀挀琀椀漀渀Ⰰ 愀猀 漀瀀瀀漀猀攀搀 琀漀 氀椀渀欀椀渀最 搀椀爀攀挀琀氀礀 琀漀 愀 氀椀猀琀 漀昀 瀀攀漀瀀氀攀 渀愀洀攀猀⸀  䄀 爀攀挀漀爀搀 氀椀渀欀猀 愀 搀漀挀甀洀攀渀琀 琀漀 愀氀氀 琀栀攀 攀氀攀洀攀渀琀猀 漀昀 愀 氀椀猀琀 爀愀琀栀攀爀 琀栀愀渀 戀攀椀渀最 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'doc_to_function_list_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links documents to lists of people.  For example, a document may be linked to a list of reviewers by individual name, as opposed to by duty function.  A record links a document to all the elements of a list rather than being a multi-select list.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开琀漀开瀀攀漀瀀氀攀开氀椀猀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 搀漀挀甀洀攀渀琀猀 琀漀 椀渀搀椀瘀椀搀甀愀氀 甀猀攀爀猀⸀  吀栀攀 渀愀琀甀爀攀 漀昀 琀栀攀 氀椀渀欀 椀猀 搀攀昀椀渀攀搀 戀礀 琀栀攀 最攀渀攀爀愀氀 昀椀攀氀搀 渀愀洀攀⸀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㘀 
' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'doc_to_user_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Links duty functions to SIDs.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'duty_function_sid_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Name of a function.  e.g. ''Production Manager''.' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'duty_functions', @level2type=N'COLUMN',@level2name=N'name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'List position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'duty_functions', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Function name must be unique.' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'duty_functions', @level2type=N'CONSTRAINT',@level2name=N'UN_function_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This list stores duty functions.  e.g. organisational positions or functions such as ''Authoriser of manufacturing SOPs''.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'duty_functions'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links files to duty functions.  For example, a file may be linked to an author by function, as opposed to linking directly to a list of people names.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'file_to_function_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links files to lists of duty functions.  For example, a file may be linked to a list of file authors by function, as opposed to linking directly to a list of people names.  A record links a file to all the elements of a list rather than being a multi-select list.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开琀漀开昀甀渀挀琀椀漀渀开氀椀猀琀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 昀椀氀攀猀 琀漀 氀椀猀琀猀 漀昀 瀀攀漀瀀氀攀⸀  䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 愀 昀椀氀攀 洀愀礀 戀攀 氀椀渀欀攀搀 琀漀 愀 氀椀猀琀 漀昀 愀甀琀栀漀爀猀 戀礀 椀渀搀椀瘀椀搀甀愀氀 渀愀洀攀Ⰰ 愀猀 漀瀀瀀漀猀攀搀 琀漀 戀礀 搀甀琀礀 昀甀渀挀琀椀漀渀⸀  䄀 爀攀挀漀爀搀 氀椀渀欀猀 愀 昀椀氀攀 琀漀 愀氀氀 琀栀攀 攀氀攀洀攀渀琀猀 漀昀 愀 氀椀猀琀 爀愀琀栀攀爀 琀栀愀渀 戀攀椀渀最 愀 洀甀氀琀椀ⴀ猀攀氀攀挀琀 氀椀猀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'file_to_people_list_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links files to individual users.  The nature of the link is defined by the general field name. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2026਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开琀漀开甀猀攀爀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀猀琀 瀀漀猀椀琀椀漀渀 椀猀 愀渀 椀渀琀攀最攀爀 眀栀椀挀栀 愀氀氀漀眀猀 愀 氀椀猀琀 漀昀 漀瀀琀椀漀渀猀 椀渀 愀 琀愀戀氀攀 琀漀 戀攀 猀攀琀 椀渀 愀渀礀 漀爀搀攀爀⸀  吀栀攀 瘀愀氀甀攀 椀猀 甀渀挀漀渀猀琀爀愀椀渀攀搀 愀渀搀 洀甀猀琀 戀攀 猀攀琀 愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀甀渀挀琀椀漀渀开氀椀猀琀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀椀猀琀开瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀昀椀渀攀猀 琀栀攀 渀愀洀攀猀 漀昀 氀椀猀琀猀 漀昀 搀甀琀礀 昀甀渀挀琀椀漀渀猀⸀  䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 愀 氀椀猀琀 漀昀 搀甀琀礀 昀甀渀挀琀椀漀渀猀 眀栀椀挀栀 挀漀洀瀀爀椀猀攀 愀 氀椀猀琀 漀昀 爀攀瘀椀攀眀攀爀猀⸀  ⠀吀栀攀 瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀 椀猀 琀栀攀 挀漀爀爀攀猀瀀漀渀搀椀渀最 琀愀戀氀攀 昀漀爀 氀椀猀琀猀 漀昀 椀渀搀椀瘀椀搀甀愀氀猀⸀⤀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'function_list_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'function_lists', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates lists of duty functions.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀甀渀挀琀椀漀渀开氀椀猀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 愀琀琀爀椀戀甀琀攀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀椀瀀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀猀琀 瀀漀猀椀琀椀漀渀 椀猀 愀渀 椀渀琀攀最攀爀 眀栀椀挀栀 愀氀氀漀眀猀 愀 氀椀猀琀 漀昀 漀瀀琀椀漀渀猀 椀渀 愀 琀愀戀氀攀 琀漀 戀攀 猀攀琀 椀渀 愀渀礀 漀爀搀攀爀⸀  吀栀攀 瘀愀氀甀攀 椀猀 甀渀挀漀渀猀琀爀愀椀渀攀搀 愀渀搀 洀甀猀琀 戀攀 猀攀琀 愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀最攀渀攀爀愀氀开昀椀攀氀搀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀椀猀琀开瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀昀椀渀攀猀 琀栀攀 渀愀洀攀猀 漀昀 昀椀攀氀搀猀 琀漀 戀攀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 氀椀渀欀猀 戀攀琀眀攀攀渀 搀漀挀甀洀攀渀琀猀⼀昀椀氀攀猀 愀渀搀 搀甀琀礀 昀甀渀挀琀椀漀渀猀Ⰰ 昀甀渀挀琀椀漀渀 氀椀猀琀猀 愀渀搀 瀀攀漀瀀氀攀 氀椀猀琀猀⸀   
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㔀 
' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'general_field_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'people_list_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user. ' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'people_list_names', @level2type=N'COLUMN',@level2name=N'name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'people_list_names', @level2type=N'COLUMN',@level2name=N'description'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'List position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'people_list_names', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Defines the names of lists of people.  For example, a list of names of individuals who comprise a list of reviewers.  (The function_list_names is the corresponding table for lists of duty functions, e.g. organisational roles.) ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀瀀攀漀瀀氀攀开氀椀猀琀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀倀漀猀椀琀椀漀渀 椀猀 愀渀 椀渀琀攀最攀爀 眀栀椀挀栀 愀氀氀漀眀猀 愀 氀椀猀琀 漀昀 漀瀀琀椀漀渀猀 椀渀 愀 琀愀戀氀攀 琀漀 戀攀 猀攀琀 椀渀 愀渀礀 漀爀搀攀爀⸀  吀栀攀 瘀愀氀甀攀 椀猀 甀渀挀漀渀猀琀爀愀椀渀攀搀 愀渀搀 洀甀猀琀 戀攀 猀攀琀 愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀瀀攀漀瀀氀攀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀瀀攀漀瀀氀攀开氀椀猀琀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀氀椀猀琀开瀀漀猀椀琀椀漀渀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䌀爀攀愀琀攀猀 氀椀猀琀猀 漀昀 瀀攀漀瀀氀攀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'people', @level1type=N'TABLE',@level1name=N'people_lists'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'tagging', @level1type=N'TABLE',@level1name=N'doc_tags', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Tags which are linked to documents.  Sometimes referred to as keywords.  Tags might not be drawn from text within the content and hence is not the same as content indexing.  Tags are like a table of contents at the front of a book whereas content indexing is like an index at the back of a book. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀琀愀最最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开琀愀最猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 瀀甀爀瀀漀猀攀 漀昀 琀栀椀猀 昀椀攀氀搀 椀猀 琀漀 挀愀琀攀爀 昀漀爀 琀栀攀 挀爀攀愀琀椀漀渀 漀昀 瀀攀爀猀漀渀愀氀 琀愀最 戀爀漀眀猀椀渀最 琀爀攀攀猀 琀栀愀琀 愀爀攀 爀攀猀琀爀椀挀琀攀搀 琀漀 漀渀攀 瀀攀爀猀漀渀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀琀愀最最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀猀椀搀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䰀椀猀琀 漀昀 渀愀洀攀猀 漀昀 戀爀漀眀猀椀渀最 琀爀攀攀猀⸀  匀攀攀 琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀 昀漀爀 搀攀猀挀爀椀瀀琀椀漀渀 漀昀 戀爀漀眀猀椀渀最 琀爀攀攀⸀ 
The function list and people list columns indicate permission for members of those lists to edit the browsing tree.  Only one function list and one people list can be registered against a given browsing tree.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀琀愀最最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 挀漀氀甀洀渀 椀渀搀椀挀愀琀攀猀 椀昀 琀栀攀 琀愀最 戀爀漀眀猀椀渀最 渀漀搀攀 椀猀 椀渀瘀攀爀琀攀搀⸀  圀栀攀渀 愀 渀漀搀攀 椀猀 椀渀瘀攀爀琀攀搀 椀琀 椀渀搀椀挀愀琀攀猀 琀漀 琀栀攀 焀甀攀爀礀 琀漀 一伀吀 琀栀漀猀攀 琀愀最猀 椀渀 琀栀攀 焀甀攀爀礀 愀渀搀 栀攀渀挀攀 攀砀氀甀搀攀 爀攀猀甀氀琀猀 琀栀愀琀 椀渀挀氀甀搀攀 愀渀 椀渀瘀攀爀琀攀搀 琀愀最⸀   吀栀攀 戀爀漀眀猀椀渀最 琀爀攀攀 瀀爀漀瘀椀搀攀猀 愀 氀漀最椀挀愀氀 䄀一䐀 漀昀 琀栀攀 琀愀最 愀渀搀 椀琀猀 愀渀挀攀猀琀漀爀猀⸀  吀栀攀 琀愀最 爀攀氀愀琀椀漀渀猀栀椀瀀 猀琀爀甀挀琀甀爀攀 琀爀攀攀 瀀爀漀瘀椀搀攀猀 愀 氀漀最椀挀愀氀 伀刀 漀昀 琀栀攀 琀愀最 愀渀搀 愀氀氀 漀昀 椀琀猀 搀攀猀挀攀渀搀愀渀琀猀⸀  吀栀椀猀 氀漀最椀挀愀氀 一伀吀 挀漀洀瀀氀攀琀攀猀 琀栀攀 挀愀瀀愀戀椀氀椀琀礀 琀漀 挀爀攀愀琀攀 愀渀礀 戀漀漀氀攀愀渀 氀漀最椀挀 漀昀 琀愀最猀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀琀愀最最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀琀愀最开戀爀漀眀猀椀渀最开琀爀攀攀开渀漀搀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀椀渀瘀攀爀琀开琀愀最✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀愀最 琀爀攀攀 渀漀搀攀猀 昀漀爀 愀 戀爀漀眀猀椀渀最 琀爀攀攀 眀栀攀爀攀 攀愀挀栀 氀攀愀昀 椀猀 愀 氀漀最椀挀愀氀 䄀一䐀 漀昀 椀琀 愀渀搀 愀氀氀 椀琀猀 瀀愀爀攀渀琀猀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'tagging', @level1type=N'TABLE',@level1name=N'tag_browsing_tree_nodes'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'tagging', @level1type=N'TABLE',@level1name=N'tag_group_identifier_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'tagging', @level1type=N'TABLE',@level1name=N'tag_group_identifier_names', @level2type=N'COLUMN',@level2name=N'tag_group_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'tagging', @level1type=N'TABLE',@level1name=N'tag_group_identifier_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Position is an integer which allows a list of options in a table to be set in any order.  The value is unconstrained and must be set at the application layer.' , @level0type=N'SCHEMA',@level0name=N'tagging', @level1type=N'TABLE',@level1name=N'tag_group_identifier_names', @level2type=N'COLUMN',@level2name=N'list_position'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The identifier for a tag group.਀吀栀攀 昀甀渀挀琀椀漀渀 氀椀猀琀 愀渀搀 瀀攀漀瀀氀攀 氀椀猀琀 挀漀氀甀洀渀猀 椀渀搀椀挀愀琀攀 瀀攀爀洀椀猀猀椀漀渀 昀漀爀 洀攀洀戀攀爀猀 漀昀 琀栀漀猀攀 氀椀猀琀猀 琀漀 攀搀椀琀 琀愀最猀 眀椀琀栀椀渀 琀栀攀 琀愀最 最爀漀甀瀀⸀  吀栀椀猀 椀猀 猀攀瀀愀爀愀琀攀 昀爀漀洀 瀀攀爀洀椀猀猀椀漀渀 琀漀 氀椀渀欀 琀愀最猀 琀漀 搀漀挀甀洀攀渀琀猀Ⰰ 眀栀椀挀栀 椀猀 最爀愀渀琀攀搀 瘀椀愀 琀栀攀 琀愀最开氀椀渀欀开瀀攀爀洀椀猀猀椀漀渀猀 琀愀戀氀攀⸀  
Only one function list and one person list can be registered against a given tag group.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀琀愀最最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀琀愀最开最爀漀甀瀀开椀搀攀渀琀椀昀椀攀爀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀 氀椀渀欀 昀爀漀洀 愀 琀愀最 琀漀 愀 搀漀挀甀洀攀渀琀⸀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'tagging', @level1type=N'TABLE',@level1name=N'tag_to_document_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a many-to-many link between tags and tag groups.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀琀愀最最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀琀愀最开琀漀开琀愀最开最爀漀甀瀀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀氀氀漀眀猀 昀漀爀 洀甀氀琀椀瀀氀攀 猀攀瀀愀爀愀琀攀 栀椀攀爀愀爀挀栀椀挀愀氀 琀愀最 琀爀攀攀猀⸀  䄀 栀椀攀爀愀爀挀栀椀挀愀氀 琀愀最攀 琀爀攀攀 搀攀昀椀渀攀猀 爀攀氀愀琀椀漀渀猀栀椀瀀猀 戀攀琀眀攀攀渀 琀愀最猀 椀渀 愀 琀愀砀愀渀漀洀椀挀愀氀 猀琀爀甀挀琀甀爀攀⸀ 
The function list and people list columns indicate permission for members of those lists to edit the tag tree.  Only one function list and one people list can be registered against a given tag tree.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'tagging', @level1type=N'TABLE',@level1name=N'tag_tree_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Tag tree nodes for creating a directed acyclic graph (e.g. a taxanomical tree - as in: cockatoos and galahs are parrots and parrots are birds etc).  A tag can belong to multiple different trees.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀琀愀最最椀渀最✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀琀愀最开琀爀攀攀开渀漀搀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀匀攀攀 挀栀攀挀欀 挀漀渀猀琀爀愀椀渀琀猀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀甀猀攀爀开爀攀猀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀琀礀瀀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀一漀琀攀 琀栀愀琀 琀栀攀爀攀 椀猀 椀渀琀攀渀琀椀漀渀愀氀氀礀 渀漀 爀攀昀攀爀攀渀挀攀 欀攀礀 戀愀挀欀 琀漀 琀栀攀 匀䤀䐀 氀椀猀琀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀甀猀攀爀开爀攀猀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㄀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀一漀琀攀 琀栀愀琀 琀栀攀爀攀 椀猀 椀渀琀攀渀琀椀漀渀愀氀氀礀 渀漀 爀攀昀攀爀攀渀挀攀 欀攀礀 戀愀挀欀 琀漀 琀栀攀 匀䤀䐀 氀椀猀琀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀甀猀攀爀开爀攀猀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀瀀瀀爀漀瘀攀搀开戀礀开猀椀搀开椀搀开㈀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀匀攀攀 挀栀攀挀欀 挀漀渀猀琀爀愀椀渀琀猀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀甀猀攀爀开爀攀猀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀猀琀愀琀甀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 栀愀渀搀氀攀猀 瀀攀渀搀椀渀最 爀攀焀甀攀猀琀猀 昀漀爀 愀甀琀栀漀爀椀猀攀爀 瀀爀椀瘀椀氀攀最攀 最爀愀渀琀椀渀最 漀爀 爀攀瘀漀欀椀渀最⸀  匀攀攀 愀甀琀栀漀爀椀猀椀渀最⸀甀猀瀀开䤀一匀开最爀愀渀琀开愀甀琀栀漀爀椀猀攀爀Ⰰ 愀甀琀栀漀爀椀猀椀渀最⸀甀猀瀀开䤀一匀开爀攀瘀漀欀攀开愀甀琀栀漀爀椀猀攀爀 愀渀搀 愀甀琀栀漀爀椀猀椀渀最⸀甀猀瀀开唀倀䐀开挀愀渀挀攀氀开愀甀琀栀漀爀椀猀攀爀开爀攀焀甀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀甀猀攀爀开爀攀猀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀愀甀琀栀漀爀椀猀攀爀开瀀爀椀瘀椀氀攀最攀开爀攀焀甀攀猀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 琀愀戀氀攀 漀昀 甀猀攀爀猀 最爀愀渀琀攀搀 瀀攀爀洀椀猀猀椀漀渀 愀猀 愀渀 愀甀琀栀漀爀椀猀攀爀⸀  䤀琀 椀猀 猀攀瀀愀爀愀琀攀 昀爀漀洀 琀栀攀 甀猀攀爀开爀漀氀攀开氀椀渀欀 琀愀戀氀攀 戀攀挀愀甀猀攀 漀昀 琀栀攀 瀀漀氀椀挀礀 琀栀愀琀 漀渀氀礀 愀 搀愀琀愀戀愀猀攀 愀搀洀椀渀椀猀琀爀愀琀漀爀 挀愀渀 最爀愀渀琀 愀甀琀栀漀爀椀猀攀爀 瀀攀爀洀椀猀猀椀漀渀 戀礀 搀椀爀攀挀琀氀礀 攀搀椀琀椀渀最 琀栀椀猀 琀愀戀氀攀⸀  䄀渀 愀甀琀栀漀爀椀猀攀爀 挀愀渀渀漀琀 最爀愀渀琀 愀甀琀栀漀爀椀猀椀渀最 瀀攀爀洀椀猀猀椀漀渀 琀漀 漀琀栀攀爀 甀猀攀爀猀 愀渀搀 搀漀攀猀 渀漀琀 栀愀瘀攀 愀挀挀攀猀猀 琀漀 琀栀椀猀 琀愀戀氀攀⸀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'authorisers'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table assigns SIDs to controller document groups.  That is, document groups linked to documents for which metadata editing has been restricted to individual controllers and can only be modified by an authoriser.  ਀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀甀猀攀爀开爀攀猀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开猀椀搀开氀椀渀欀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 愀猀猀椀最渀猀 匀䤀䐀猀 琀漀 挀漀渀琀爀漀氀氀攀爀 昀椀氀攀 最爀漀甀瀀猀⸀  吀栀愀琀 椀猀Ⰰ 昀椀氀攀 最爀漀甀瀀猀 氀椀渀欀攀搀 琀漀 昀椀氀攀 昀漀爀 眀栀椀挀栀 洀攀琀愀搀愀琀愀 攀搀椀琀椀渀最 栀愀猀 戀攀攀渀 爀攀猀琀爀椀挀琀攀搀 琀漀 椀渀搀椀瘀椀搀甀愀氀 挀漀渀琀爀漀氀氀攀爀猀 愀渀搀 挀愀渀 漀渀氀礀 戀攀 洀漀搀椀昀椀攀搀 戀礀 愀渀 愀甀琀栀漀爀椀猀攀爀⸀   
਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'controller_file_grp_sid_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links document groups with function lists to grant metadata edit permissions for a group of documents to a group of user duty functions.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'doc_group_edit_perm_funct_lst'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links document groups with people lists to grant metadata edit permissions for a group of documents to a group of individuals.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'doc_group_edit_perm_people_lst'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Example: A note regarding why this group of documents was linked to a particular SID.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'doc_group_view_permissions', @level2type=N'COLUMN',@level2name=N'notes'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links a document group with security identifiers for the purpose of restricting view access to documents within a group to specific users.਀吀栀攀 椀渀琀攀渀琀 漀昀 愀 甀猀攀爀 琀愀戀氀攀 漀昀 甀猀攀爀 爀攀猀琀爀椀挀琀椀漀渀猀 爀愀琀栀攀爀 琀栀愀渀 甀猀椀渀最 琀栀攀 䴀匀儀䰀匀 猀攀挀甀爀椀琀礀 愀爀挀栀椀琀攀挀琀甀爀攀 椀渀 琀栀椀猀 瀀愀爀琀椀挀甀氀愀爀 椀渀猀琀愀渀挀攀 椀猀 猀漀 琀栀愀琀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 氀愀礀攀爀 眀椀氀氀 渀漀琀 渀攀攀搀 爀椀最栀琀猀 琀漀 挀栀愀渀最攀 搀愀琀愀戀愀猀攀 瀀攀爀洀椀猀猀椀漀渀猀 漀渀 琀栀攀 昀氀礀Ⰰ 漀爀 愀氀琀攀爀渀愀琀椀瘀攀氀礀 爀攀焀甀椀爀攀 搀攀瘀攀氀漀瀀攀爀 椀渀瀀甀琀⸀  吀栀攀 椀渀琀攀渀琀 椀猀 琀栀愀琀 琀栀攀 爀漀氀攀猀 愀渀搀 瀀攀爀洀椀猀猀椀漀渀猀 眀椀琀栀椀渀 琀栀攀 搀愀琀愀戀愀猀攀 愀爀攀 昀椀砀攀搀 愀渀搀 琀栀攀 愀氀氀漀挀愀琀椀漀渀 漀昀 椀渀搀椀瘀椀搀甀愀氀 甀猀攀爀猀 椀猀 椀洀瀀氀攀洀攀渀琀攀搀 愀琀 琀栀攀 䄀挀琀椀瘀攀 䐀椀爀攀挀琀漀爀礀 氀攀瘀攀氀⸀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'doc_group_view_permissions'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links filet groups with function lists to grant metadata edit permissions for a group of files to a group of user duty functions.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'file_group_edit_perm_funct_lst'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links file groups with people lists to grant metadata edit permissions for a group of files to a group of individuals.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'file_group_edit_perm_ppl_lst'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'For example: A note regarding why this user was added to this form owners group.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'form_group_owners', @level2type=N'COLUMN',@level2name=N'notes'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a list of users linked to forms which they own and can edit.਀ 
The intent of a user table of user restrictions rather than using the MSQLS security architecture in this particular instance is so that the application layer will not need rights to change database permissions on the fly, or alternatively require developer input.  The intent is that the roles and permissions within the database are fixed and the allocation of individual users is implemented at the Active Directory level. ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀甀猀攀爀开爀攀猀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀漀爀洀开最爀漀甀瀀开漀眀渀攀爀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀猀琀猀 琀栀攀 搀椀昀昀攀爀攀渀琀 爀漀氀攀猀 眀椀琀栀椀渀 琀栀攀 搀愀琀愀戀愀猀攀 琀栀愀琀 挀愀渀 戀攀 愀猀猀椀最渀攀搀 琀漀 甀猀攀爀猀⸀  吀栀攀猀攀 爀漀氀攀猀 瀀愀爀愀氀氀攀氀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 爀漀氀攀猀⸀  
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'role_list'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The primary key is a big int rather than using the SID to make it easier to pass the table PK back and forth to the application layer, avoiding the need to pass binary values.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'sid_list', @level2type=N'COLUMN',@level2name=N'sid_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'An editable username field.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'sid_list', @level2type=N'COLUMN',@level2name=N'name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Security identifier.਀吀栀攀 匀䤀䐀 椀猀 猀琀漀爀攀搀 椀渀 戀椀渀愀爀礀 戀攀挀愀甀猀攀 匀唀匀䔀刀开匀䤀䐀⠀⤀ 爀攀琀甀爀渀猀 愀 戀椀渀愀爀礀 搀愀琀愀 琀礀瀀攀⸀ 
' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'sid_list', @level2type=N'COLUMN',@level2name=N'sid'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The is the system username.  The purpose of storing the username is so that it can be established after the user''s account has been deleted, when SUSER_SNAME will not resolve.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'sid_list', @level2type=N'COLUMN',@level2name=N'username'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This field is used for storing the SID so that it can be restored again after being revoked.  A user is ''deleted'' by replacing the sid with 0.  The use can be restored by copying the sid back from restore_sid to the sid field.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'sid_list', @level2type=N'COLUMN',@level2name=N'restore_sid'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a list of security identifiers for objects with restricted access.  ਀ 
The intent of a user table of user restrictions rather than using the MSQLS security architecture in this particular instance is so that the application layer will not need rights to change database permissions on the fly, or alternatively require developer input.  The intent is that the roles and permissions within the database are fixed and the allocation of individual users is implemented at the Active Directory level. ਀ 
The sid list internal to the database ensures that historical details of people linked to objects are retained in the database and are not lost when parallel lists elsewhere are updated.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀ 
' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'sid_list'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a link between a tag browsing tree and a function list to grant permission for members of a given function list to edit the given tag browsing tree.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'tag_br_tree_permissions_flist'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a link between a tag browsing tree and a people list to grant permission for members of a given people list to edit the given tag browsing tree.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'tag_br_tree_permissions_plist'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a link between a tag group and a function list to grant permission for members of a given function list to edit the given tag group.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'tag_group_permissions_flist'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a link between a tag group and a people list to grant permission for members of a given peoople list to edit the given tag group.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'tag_group_permissions_plist'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a link between a tag tree and a function list to grant permission for members of a given function list to edit the given tag tree.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'tag_tree_permissions_flist'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Creates a link between a tag tree and a people list to grant permission for members of a given people list to edit the given tag tree.' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'tag_tree_permissions_plist'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table stores records of user privilege revocations.  Also see user_restr.authoriser_privilege_requests.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀Ⰰ 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀渀搀 昀甀渀挀琀椀漀渀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2025' , @level0type=N'SCHEMA',@level0name=N'user_restr', @level1type=N'TABLE',@level1name=N'user_privilege_revoke_log'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links a user sid with a defined role.  It is used by stored procedures to check that a connected user has been granted permission to the given application role.  For a function to be executed, the application being used by the user must know the password to set the given application role which gives access to the schema which owns the stored procedure, and the user must also be listed in the database against the corresponding role in the role_list table.  ਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀甀猀攀爀开爀攀猀琀爀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀甀猀攀爀开爀漀氀攀开氀椀渀欀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀猀琀猀 漀瀀琀椀漀渀猀 昀漀爀 猀琀攀瀀 猀琀愀琀甀猀✀✀⸀  攀⸀最⸀ ✀✀倀氀愀渀渀攀搀✀✀Ⰰ ✀✀䌀漀洀瀀氀攀琀攀搀✀✀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'step_status_definitions'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table stores links between a workflow step duty function and the output file or files that they create as part of the workflow step.  e.g. the marked up document.  This mirrors workflow_person_output_files with the exception that it relates to a duty function which in turn is related to one or more individuals.  The application must decide how to handle cases where a duty function is linked to more than one individual.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开昀甀渀挀琀椀漀渀开漀甀琀瀀甀琀开昀椀氀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 搀攀昀椀渀攀猀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀猀Ⰰ 攀⸀最⸀ 愀 眀漀爀欀昀氀漀眀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 愀 瀀愀爀琀椀挀甀氀愀爀 搀漀挀甀洀攀渀琀⸀ 
਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀ 
' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_instance_definitions'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The workflow instance step mirrors the workflow model steps.' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_instance_steps', @level2type=N'COLUMN',@level2name=N'workflow_instance_step_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The workflow instance id is the id for the copy of the workflow model which is linked to a document and comprises the actual workflow.' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_instance_steps', @level2type=N'COLUMN',@level2name=N'workflow_instance_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The workflow model step is the step in the workflow model which is being mirrored by the instance of the workflow being applied.' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_instance_steps', @level2type=N'COLUMN',@level2name=N'workflow_model_step_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Refer to step_status-definitions.' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_instance_steps', @level2type=N'COLUMN',@level2name=N'step_status_id'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table records the steps in a given instance of a workflow.  The intent is that when a workflow instance is created and linked to a workflow model, the application creates a set of workflow instance steps to mirror the workflow model.  As the workflow progresses, the application updates the records.਀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_instance_steps'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table lists options for workflow outputs.  e.g. ''Approved'', ''Resbumit''.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开漀甀琀瀀甀琀开搀攀昀椀渀椀琀椀漀渀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 猀琀漀爀攀猀 氀椀渀欀猀 戀攀琀眀攀攀渀 愀 眀漀爀欀昀氀漀眀 猀琀攀瀀 瀀愀爀琀椀挀椀瀀愀渀琀 愀渀搀 琀栀攀 漀甀琀瀀甀琀 昀椀氀攀 漀爀 昀椀氀攀猀 琀栀愀琀 琀栀攀礀 挀爀攀愀琀攀 愀猀 瀀愀爀琀 漀昀 琀栀攀 眀漀爀欀昀氀漀眀 猀琀攀瀀⸀  攀⸀最⸀ 琀栀攀 洀愀爀欀攀搀 甀瀀 搀漀挀甀洀攀渀琀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_person_output_files'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The file is linked to the workflow instance step and a person who is a participant of that workflow step.  ' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_person_output_files', @level2type=N'CONSTRAINT',@level2name=N'FK_workflow_step_and_participant_has_output_file'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links workflow steps with duty functions.  e.g. Approve step is linked to commercial manager.  The table also links the step to an output status, e.g. ''Approved''.  This mirrors workflow_step_participants with the exception that it relates to a duty function which in turn is related to one or more individuals.  The application must decide how to handle cases where a duty function is linked to more than one individual.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/' , @level0type=N'SCHEMA',@level0name=N'workflow_instances', @level1type=N'TABLE',@level1name=N'workflow_step_duty_functions'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links files to workflow steps as input files.  e.g. files which are documents to be reviewed as part of a workflow step.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开猀琀攀瀀开椀渀瀀甀琀开昀椀氀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 愀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 眀椀琀栀 瀀愀爀琀椀挀椀瀀愀渀琀猀⸀  攀⸀最⸀ 氀椀渀欀椀渀最 琀栀攀 愀瀀瀀爀漀瘀攀 猀琀攀瀀 眀椀琀栀 琀栀攀 愀瀀瀀爀漀瘀攀爀⸀  吀栀攀 琀愀戀氀攀 愀氀猀漀 爀攀挀漀爀搀猀 琀栀攀 漀甀琀挀漀洀攀 漀昀 琀栀攀 猀琀攀瀀⸀ 攀⸀最⸀ ✀✀䄀瀀瀀爀漀瘀攀搀✀✀⸀ 
਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开猀琀攀瀀开瀀愀爀琀椀挀椀瀀愀渀琀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀 琀爀愀挀欀 氀漀最 漀昀 眀漀爀欀昀氀漀眀 椀渀猀琀愀渀挀攀 猀琀攀瀀 搀愀琀愀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䄀渀 椀渀搀攀砀 漀昀 琀栀攀 眀漀爀欀昀氀漀眀 琀爀愀挀欀 氀漀最✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开椀渀猀琀愀渀挀攀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开琀爀愀挀欀开氀漀最开椀渀搀攀砀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 搀攀昀椀渀攀猀 眀漀爀欀昀氀漀眀 愀挀琀椀漀渀猀Ⰰ 攀⸀最⸀ ✀✀䄀瀀瀀爀漀瘀攀✀✀Ⰰ 漀爀 ✀✀刀攀瘀椀攀眀✀✀⸀  吀栀攀 琀愀戀氀攀 椀猀 渀漀琀 甀猀攀搀 戀礀 琀栀攀 搀愀琀愀戀愀猀攀 琀漀 挀漀渀猀琀爀愀椀渀 搀愀琀愀 戀甀琀 椀猀 甀猀攀搀 琀漀 椀渀昀漀爀洀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 愀渀搀 甀猀攀爀⸀ 
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
' , @level0type=N'SCHEMA',@level0name=N'workflow_models', @level1type=N'TABLE',@level1name=N'workflow_actions'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the names of workflow model definitions.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开洀漀搀攀氀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 眀漀爀欀昀氀漀眀 洀漀搀攀氀 猀琀攀瀀 搀攀昀椀渀椀琀椀漀渀猀 眀椀琀栀 眀漀爀欀昀氀漀眀 爀甀氀攀猀⸀   
਀⼀⨀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀⨀⼀ 
' , @level0type=N'SCHEMA',@level0name=N'workflow_models', @level1type=N'TABLE',@level1name=N'workflow_rule_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This integer field could be used to store a value such as the number of days limit for the reviewer to respond.' , @level0type=N'SCHEMA',@level0name=N'workflow_models', @level1type=N'TABLE',@level1name=N'workflow_rules', @level2type=N'COLUMN',@level2name=N'rule_value_1'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This defines the rules to be applied to a workflow step.  e.g. ''All must respond before progressing to the next step'', or ''Time-limited review''.  The table is merely a repository of a text string.  It is not used by the database to constrain action but informs the application and user.਀ 
/*਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
*/਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开洀漀搀攀氀猀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀眀漀爀欀昀氀漀眀开爀甀氀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀猀琀猀 琀栀攀 氀椀渀欀猀 戀攀琀眀攀攀渀 搀漀挀甀洀攀渀琀猀 愀渀搀 挀漀渀琀爀漀氀氀攀爀 搀漀挀甀洀攀渀琀 最爀漀甀瀀猀⸀  吀栀愀琀 椀猀Ⰰ 搀漀挀甀洀攀渀琀猀 昀漀爀 眀栀椀挀栀 洀攀琀愀搀愀琀愀 攀搀椀琀椀渀最 栀愀猀 戀攀攀渀 爀攀猀琀爀椀挀琀攀搀 琀漀 椀渀搀椀瘀椀搀甀愀氀 挀漀渀琀爀漀氀氀攀爀猀 愀渀搀 挀愀渀 漀渀氀礀 戀攀 洀漀搀椀昀椀攀搀 戀礀 愀渀 愀甀琀栀漀爀椀猀攀爀⸀   
਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'controller_doc_group_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Name must be unique.' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'controller_doc_group_names', @level2type=N'CONSTRAINT',@level2name=N'UN_controller_doc_group_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table lists document groups which are used for giving individual controllers exclusive metadata editing rights which cannot be modified by other controllers.  There are two layers of metadata editing rights.  At this layer the rights are granted by an authorisier and granted to controllers.  At the other layer the rights are granted by any controller and are granted to editors.  ਀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀漀渀琀爀漀氀氀攀爀开搀漀挀开最爀漀甀瀀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀猀琀猀 琀栀攀 氀椀渀欀猀 戀攀琀眀攀攀渀 昀椀氀攀猀 愀渀搀 挀漀渀琀爀漀氀氀攀爀 昀椀氀攀 最爀漀甀瀀猀⸀  吀栀愀琀 椀猀Ⰰ 昀椀氀攀猀 昀漀爀 眀栀椀挀栀 洀攀琀愀搀愀琀愀 攀搀椀琀椀渀最 栀愀猀 戀攀攀渀 爀攀猀琀爀椀挀琀攀搀 琀漀 椀渀搀椀瘀椀搀甀愀氀 挀漀渀琀爀漀氀氀攀爀猀 愀渀搀 挀愀渀 漀渀氀礀 戀攀 洀漀搀椀昀椀攀搀 戀礀 愀渀 愀甀琀栀漀爀椀猀攀爀⸀   
਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2024' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'controller_file_group_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Name must be unique' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'controller_file_group_names', @level2type=N'CONSTRAINT',@level2name=N'UN_controller_file_group_names'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table lists file groups which are used for giving individual controllers exclusive metadata editing rights which cannot be modified by other controllers.  There are two layers of metadata editing rights.  At this layer the rights are granted by an authorisier and granted to controllers.  At the other layer the rights are granted by any controller and are granted to editors.  ਀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㐀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀漀渀琀爀漀氀氀攀爀开昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 愀 猀栀漀爀琀 洀渀攀洀漀渀椀挀 昀漀爀 琀栀攀 愀琀琀爀椀戀甀琀攀⸀  䴀渀攀洀漀渀椀挀猀 愀爀攀 甀猀攀昀甀氀 昀漀爀 猀愀瘀椀渀最 猀瀀愀挀攀 眀栀攀渀 搀椀猀瀀氀愀礀椀渀最 琀愀戀氀攀猀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀洀渀攀洀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 椀猀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 愀琀琀爀椀戀甀琀攀Ⰰ 眀栀椀挀栀 椀猀 琀栀愀琀 眀栀椀挀栀 琀栀攀 愀瀀瀀氀椀挀愀琀椀漀渀 眀椀氀氀 洀漀猀琀 氀椀欀攀氀礀 瀀爀攀猀攀渀琀 琀漀 琀栀攀 甀猀攀爀⸀  ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀愀琀琀爀开渀愀洀攀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䐀攀猀挀爀椀瀀琀椀漀渀⸀  䄀氀氀漀眀猀 琀栀攀 甀猀攀爀 琀漀 攀渀琀攀爀 愀 氀漀渀最 渀愀爀爀愀琀椀瘀攀 椀昀 渀攀挀攀猀猀愀爀礀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀挀爀漀猀猀开爀攀昀攀爀攀渀挀攀开琀礀瀀攀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀搀攀猀挀爀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀攀 搀攀昀椀渀椀琀椀漀渀 漀昀 琀栀攀 琀礀瀀攀 漀昀 挀爀漀猀猀 爀攀昀攀爀攀渀挀攀 戀攀琀眀攀攀渀 搀漀挀甀洀攀渀琀猀⸀  攀⸀最⸀ ✀✀匀甀瀀攀爀猀攀搀攀搀 戀礀✀✀⸀  攀⸀最⸀ 搀漀挀甀洀攀渀琀 愀戀挀 愀渀搀 砀礀稀 戀漀琀栀 猀甀瀀攀爀猀攀搀攀搀 戀礀 搀漀挀甀洀攀渀琀 瀀焀爀⸀  伀爀 ✀✀䌀爀漀猀猀ⴀ爀攀昀攀爀爀攀搀✀✀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'cross_reference_types'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'For example: A customised note of explanation regarding this particular document cross-reference.' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'doc_cross_references', @level2type=N'COLUMN',@level2name=N'notes'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This table links two cross-referenced documents together, along with a cross-reference type.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开挀爀漀猀猀开爀攀昀攀爀攀渀挀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䘀漀爀 攀砀愀洀瀀氀攀㨀 䄀 渀漀琀攀 攀砀瀀氀愀椀渀椀渀最 眀栀礀 琀栀椀猀 搀漀挀甀洀攀渀琀 眀愀猀 愀搀搀攀搀 琀漀 琀栀椀猀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开最爀漀甀瀀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀渀漀琀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 愀 搀漀挀甀洀攀渀琀 琀漀 愀 搀漀挀甀洀攀渀琀 最爀漀甀瀀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'doc_group_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'doc_group_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'doc_group_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'doc_group_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Document group name must be unique' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'doc_group_names', @level2type=N'INDEX',@level2name=N'UN_group_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of a group of documents.਀ 
Note that The column attr_name is set to NOT NULL and UNIQUE.  In some circumstances however this table may be superfluous if there is a desire to create a 1:1 relationship and not impose on the user to create a group.  In that case then the application layer can automatcially enter a small guid for the name and hide this table data from the user, effectively bypassing the grouping.਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀搀漀挀开最爀漀甀瀀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀昀椀氀攀开最爀漀甀瀀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀䘀漀爀 攀砀愀洀瀀氀攀㨀 䄀 挀甀猀琀漀洀椀猀攀搀 渀漀琀攀 愀猀 琀漀 眀栀礀 琀栀椀猀 昀椀氀攀 眀愀猀 愀搀搀攀搀 琀漀 琀栀椀猀 瀀愀爀琀椀挀甀氀愀爀 最爀漀甀瀀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开最爀漀甀瀀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀渀漀琀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 昀椀氀攀猀 椀渀琀漀 愀 最爀漀甀瀀 瘀椀愀 愀 昀椀氀攀 最爀漀甀瀀 椀搀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'file_group_links'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is a short mnemonic for the attribute.  Mnemonics are useful for saving space when displaying tables. ' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'file_group_names', @level2type=N'COLUMN',@level2name=N'mnem'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This is the name of the attribute, which is that which the application will most likely present to the user.  ' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'file_group_names', @level2type=N'COLUMN',@level2name=N'attr_name'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Description.  Allows the user to enter a long narrative if necessary. ' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'file_group_names', @level2type=N'COLUMN',@level2name=N'descr'਀䜀伀 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The details of the grouping of a set of files.  e.g. name = ''Same doc id''; descr = ''The group of files comprise a set which are all related to the same document.  e.g. all the component source files.''਀ 
COPYRIGHT NOTICE਀吀栀椀猀 搀愀琀愀戀愀猀攀 猀挀栀攀洀愀 愀渀搀 猀琀漀爀攀搀 瀀爀漀挀攀搀甀爀攀猀 愀爀攀 瀀爀漀琀攀挀琀攀搀 戀礀 挀漀瀀礀爀椀最栀琀⸀ 
Copyright.  Silkwood Software Pty. Ltd. 2023਀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开最爀漀甀瀀开渀愀洀攀猀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀一漀琀攀猀 琀栀愀琀 洀椀最栀琀 戀攀 愀瀀瀀爀漀瀀爀椀愀琀攀 椀渀 爀攀氀愀琀椀漀渀 琀漀 琀栀攀 氀椀渀欀椀渀最 漀昀 愀 昀椀氀攀 眀椀琀栀 愀 搀漀挀甀洀攀渀琀⸀✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀䰀唀䴀一✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀琀爀愀渀猀愀挀琀椀漀渀开最爀漀甀瀀开椀搀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 挀漀渀猀琀爀愀椀渀琀 愀氀氀漀眀猀 漀渀攀 昀椀氀攀 琀漀 戀攀 氀椀渀欀攀搀 琀漀 洀愀渀礀 搀漀挀甀洀攀渀琀猀⸀  䤀渀 猀漀洀攀 椀渀猀琀愀渀挀攀猀 攀渀最椀渀攀攀爀椀渀最 搀爀愀眀椀渀最猀 眀椀氀氀 攀砀椀猀琀 愀猀 洀甀氀琀椀瀀氀攀 搀爀愀眀椀渀最 猀栀攀攀琀猀 椀渀 愀 猀椀渀最氀攀 昀椀氀攀⸀  䐀漀挀甀洀攀渀琀猀 洀甀猀琀 戀攀 愀戀氀攀 琀漀 戀攀 氀椀渀欀攀搀 琀漀 搀椀昀昀攀爀攀渀琀 昀椀氀攀猀 眀栀椀挀栀 爀攀瀀爀攀猀攀渀琀 搀椀昀昀攀爀攀渀琀 爀攀氀攀愀猀攀猀 漀昀 琀栀攀 搀漀挀甀洀攀渀琀 昀漀爀 攀砀愀洀瀀氀攀⸀ ✀ Ⰰ 䀀氀攀瘀攀氀　琀礀瀀攀㴀一✀匀䌀䠀䔀䴀䄀✀Ⰰ䀀氀攀瘀攀氀　渀愀洀攀㴀一✀砀爀攀昀✀Ⰰ 䀀氀攀瘀攀氀㄀琀礀瀀攀㴀一✀吀䄀䈀䰀䔀✀Ⰰ䀀氀攀瘀攀氀㄀渀愀洀攀㴀一✀昀椀氀攀开琀漀开搀漀挀甀洀攀渀琀开氀椀渀欀猀✀Ⰰ 䀀氀攀瘀攀氀㈀琀礀瀀攀㴀一✀䌀伀一匀吀刀䄀䤀一吀✀Ⰰ䀀氀攀瘀攀氀㈀渀愀洀攀㴀一✀倀䬀开昀椀氀攀开搀漀挀开氀椀渀欀✀ 
GO਀䔀堀䔀䌀 猀礀猀⸀猀瀀开愀搀搀攀砀琀攀渀搀攀搀瀀爀漀瀀攀爀琀礀 䀀渀愀洀攀㴀一✀䴀匀开䐀攀猀挀爀椀瀀琀椀漀渀✀Ⰰ 䀀瘀愀氀甀攀㴀一✀吀栀椀猀 琀愀戀氀攀 氀椀渀欀猀 搀漀挀甀洀攀渀琀 䤀䐀猀 眀椀琀栀 昀椀氀攀猀 椀渀 愀 洀愀渀礀ⴀ琀漀ⴀ洀愀渀礀 爀攀氀愀琀椀漀渀猀栀椀瀀⸀  䤀渀 猀漀洀攀 椀渀猀琀愀渀挀攀猀 愀 昀椀氀攀 眀椀氀氀 挀漀渀琀愀椀渀 洀漀爀攀 琀栀愀渀 漀渀攀 搀漀挀甀洀攀渀琀⸀ 
਀䌀伀倀夀刀䤀䜀䠀吀 一伀吀䤀䌀䔀 
This database schema and stored procedures are protected by copyright.਀䌀漀瀀礀爀椀最栀琀⸀  匀椀氀欀眀漀漀搀 匀漀昀琀眀愀爀攀 倀琀礀⸀ 䰀琀搀⸀ ㈀　㈀㌀ 
' , @level0type=N'SCHEMA',@level0name=N'xref', @level1type=N'TABLE',@level1name=N'file_to_document_links'਀䜀伀 
USE [master]਀䜀伀 
ALTER DATABASE [Elyse_DB] SET  READ_WRITE ਀䜀伀 
